flexboxの子要素に指定したz-indexがpositionがなくても効いてしまうということがあったので、調べた内容をメモしておきます。
サンプルコード
まずは意図しない表示になった例です。
サイドバーのあるレイアウトで、下部に固定フッターがある想定です。
<div class="contents"> <div class="sub">sub</div> <div class="main">main</div> <div class="fix-footer">footer</div> </div>
CSSは必要部分のみ抜粋しています。
.contents { display: flex; } .sub { position: static; z-index: 200; width: 200px; } .main { flex: 1; } .fix-footer { position: fixed; bottom: 20px; left: 20px; z-index: 100; width: calc(100% - 40px); }
.subのz-indexはスマホ時に設定したスタイルが残っていたものですが、position: static;を設定しているため効かない想定です。
これで問題ないかと思ったのですが、.subが.fix-footerより上の重なり順になっていました。
flexbox + z-indexでうまくいかなかった場合のデモページ
調べてみると、flexboxの子要素やgridの子要素にz-indexを指定した場合、重なり順の比較対象になってしまうようです。
今回の例の場合、.subのz-indexの値を変更することで対応できました。
.contents { display: flex; } .sub { position: static; z-index: 1; width: 200px; } .main { flex: 1; } .fix-footer { position: fixed; bottom: 20px; left: 20px; z-index: 100; width: calc(100% - 40px); }
上記以外にも、opacityやtransform、filterなどを指定した要素も重なり順の比較対象になります。
ただflexboxやgridとは違い、z-indexによって重なり順を調整することはできないようです。
詳しくは下記デモをご確認ください。
コメントが承認されるまで時間がかかります。