要素の重なり順を指定するz-index
ですが、数値を指定しても順番が変わらないことがあります。
実はこれは誰もが通る道です。
今回はそんな避けては通れないz-index
が効かない問題の対処方法を解説していきます。
z-indexの使い方については以下の記事を参照下さい。
【CSS】要素の重なり順を指定するz-indexの使い方
続きを見る
(有料になっていたらすいません🙇♂️)
z-indexが効かない主な原因3つとその対処方法
z-index
が効かないケースは主に3つあります。
1つずつ解説していきます。
原因①:positionがstaticになっている
最も多いと思われる原因は『positionがstaticになっている』です。
と思うかも知れませんが、positionの初期値はstaticなので何も設定していなければpositionはstaticになっています。
そしてposition: static;にはz-indexが効きません。
例えばこちらのコードで見てみます(背景色やフォントサイズなど重要では無いCSSは省略)
<div class="container">
<div class="box box01">BOX1</div>
<div class="box box02">BOX2</div>
<div class="box box03">BOX3</div>
</div>
.container {
position: relative;
}
.box01{
z-index: 3;
}
.box02 {
left: 70px;
position: absolute;
top: 70px;
z-index: 2;
}
.box03 {
left: 140px;
position: absolute;
top: 140px;
z-index: 1;
}
それぞれの要素にz-index
を設定して、上から順に.box01
、.box02
、.box03
になるようにしましたが、.box01にはpositionを設定していません。
それではどうなるか見てみます。
See the Pen
z-index(BOX01を一番上:失敗2) by junpei (@junpei-sugiyama)
on CodePen.
z-index
の数値が一番大きい.box01
が一番上に来ていません。
原因は先ほど書いたように.box01
にpositionを設定していないからです。
つまり.box01
のpositionはz-indexが効かない初期値のstaticです。
.box02
はposition: absolute;
なのでz-indexが効いて.box03
より上に来ていますが、.box01
にはz-index
は効いていないので一番上に来ていません。
どうすればいいかというと、.box01
にz-index
が効くようにpositionを初期値のstatic以外に設定すればOKです。
ただposition: absolute;
やposition: fixed;
だと位置の絶対値が変わったり固定されてしまうので、position: relative;
を使うことが多いと思います。
ということで、上記の.box01
にposition: relative;
を設定したのがこちらです。
See the Pen
z-index(BOX01を一番上:成功2) by junpei (@junpei-sugiyama)
on CodePen.
ちなみにz-index
を使わない場合は、以下のようにあとに書いた要素が上に重なっていきます。
See the Pen
z-index(未使用) by junpei (@junpei-sugiyama)
on CodePen.
原因②:親要素のz-indexが小さい
次のHTMLはこちらです。
<div class="container">
<div class="box box01">
box01
<div class="box box02">
box02
</div>
</div>
<div class="box box03">
box03
</div>
</div>
今回は.box01
の子要素に.box02
があります。
そしてCSSはこちらです。
.container {
position: relative;
}
.box01 {
position: relative;
z-index: 1;
}
.box02 {
left: 70px;
position: absolute;
top: 70px;
z-index: 3;
}
.box03 {
left: 140px;
position: absolute;
top: 140px;
z-index: 2;
}
z-index
の数値が一番大きいのは.box02
なので、.box02
が一番上に来る・・・でしょうか?
See the Pen
z-index(BOX01を一番上:失敗3) by junpei (@junpei-sugiyama)
on CodePen.
.box02
は一番上には来ていませんね。
原因は『親要素のz-indexが小さいから』です。
今回の場合、.box03
のz-index
が2に対して.box02
のz-index
は3ですが、.box02
の親要素である.box01
のz-index
が1だからです。
つまり.box02
のz-index
は3ではなく1になり、.box03
のz-index
の2より上にはならないということです。
ちょっとややこしいかも知れませんが、見るべきポイントは.box02
だけです。
- box01:z-index 1
- box02:z-index 3 → 親要素のbox01のz-indexが1なので、box02のz-indexも1
- box03:z-index 2
なのでHTMLを変えずに.box02
を一番上にしたい場合は、z-index
を以下のように変更すればOKです。
- box01:z-index 1 → 3
- box02:z-index 3 → 2
- box03:z-index 2 → 1
これであれば.box02
の親要素である.box01
のz-index
が.box03
より大きいので、.box02
は.box03
より上に来ます。
See the Pen
z-index(BOX01を一番上:成功3) by junpei (@junpei-sugiyama)
on CodePen.
原因③:数値が正しくない
z-index
の数値には以下のような決まりがあります。
z-indexの数値について
・数値が大きいほうが上になる
最小値と最大値
z-index
には最小値と最大値があります。
そこまで大きな数値を指定することはないと思うので、極端に大きな数値にしなければ大丈夫です。
整数のみ
z-index
は整数のみなので、小数点にすると無効となります。
CSSのプロパティには小数点が使えるものも多いですが、z-index
は使えないので注意しましょう。
また、単位は不要なのでpxなどを付けないようにしましょう。
まとめ
z-index
は数値が大きい方が必ず上に来る・・・という単純なものではなく、いくつものトラップがあるので効かないと思ったらこの記事を思い出してみて下さい。
z-indexが効かない時の対処方法
・positionをstatic以外で設定
・親要素のz-indexが小さくないか確認
・整数かつ単位なしで設定
以上になります。