CSSのz-indexが効かない原因と解決方法
メニューが画像の下に隠れてしまう。
z-index を大きくしたのに、前に出てこない。
CSSでよくあるつまずきのひとつです。
この記事では、z-index が効かない原因と、解決の方法を解説します。
1.z-indexは、重なりの前後を決める
z-index は、要素が重なったときに、どちらを前に出すかを決めるプロパティです。数字が大きいほど、前に表示されます。
.menu {
position: relative;
z-index: 10;
}
ただし、z-index は、どの要素にでも効くわけではありません。効かないときは、次のような原因が考えられます。
| 原因 | 解決の方法 |
|---|---|
| position が指定されていない | position: relative などを指定する(Flexbox・Gridの子は例外) |
| 親が、重なりのグループを作っている | 親の z-index や、グループを作るプロパティを見直す |
| 比べている相手が違う | 同じグループの中で比べているか確かめる |
2.z-indexが効かない理由
z-index は、position が static(初めの設定)のままの要素には効きません。また、FlexboxやGridの子の要素には、position の指定がなくても効きます。
もうひとつの大きな理由が、「重なりのグループ(スタッキングコンテキスト)」です。ある要素がグループを作ると、その中の子の z-index は、グループの中だけで比べられます。子にどれだけ大きな z-index を指定しても、親のグループごと、ほかの要素の下にあれば、前には出てきません。
z-index は、同じグループの中でしか比べられないことを覚えておきましょう。
3.解決の手順
- 01position を確かめる
前に出したい要素に、position(relative など)が指定されているか確かめます。
- 02比べる相手を確かめる
前に出したい要素と、上に重なっている要素が、どの親の中にあるかを確かめます。
- 03グループを作っている親を探す
親の要素に、z-index、opacity(1未満)、transform などが指定されていないか確かめます。
- 04親の重なりを調整する
必要なら、親の z-index を調整するか、グループを作るプロパティを外します。
重なりのグループを作る主なプロパティ
- position が static 以外で、z-index が auto 以外
- opacity が 1 より小さい
- transform、filter が指定されている
- position: fixed または sticky
z-index の数字の決め方
z-index に、9999 のような大きな数字を使うと、あとで管理しにくくなります。ヘッダーは 100、モーダルは 200 のように、役割ごとに数字を決めておくと分かりやすくなります。
ブラウザの開発者向けの機能を使うと、要素に指定されている position や z-index を確かめられます。
4.よくある質問
z-index にマイナスを指定できますか?
できます。背景の飾りを、ほかの要素の後ろに回したいときなどに使います。
大きな数字を指定すれば、必ず前に出ますか?
同じグループの中なら前に出ますが、親のグループが下にあれば、どれだけ大きくしても前には出ません。
スマートフォンでだけ、メニューが隠れます。
スマートフォン用のCSSで、position や transform などが追加されていないか確かめましょう。
どの要素が上に重なっているか分かりません。
ブラウザの開発者向けの機能で、上に重なっている要素を選んで確かめられます。
5.まとめ
z-index が効かない原因の多くは、position の指定がないことと、重なりのグループです。
- 前に出したい要素に、position を指定する
- z-index は、同じグループの中でしか比べられない
- opacity や transform も、重なりのグループを作る
- z-index の数字は、役割ごとに決めておく
position の使い方は、CSSのpositionプロパティの使い方で解説しています。
要素の重なりや、メニューが隠れる不具合で困っている場合は、浅草Web屋にご相談ください。