
z-indexで重なり順を指定してるのに、ぜんぜん効かないよ
z-indexを効かせるには、z-indexの仕組みと特徴を理解すれば大丈夫だよ。

CSSで z-index を設定したのに「なぜか要素が前面に来ない」「意図した順番にならない」と悩んだことはありませんか?
この問題は z-indexの仕組み を正しく理解すれば、すぐに解決できます!
本記事では、「z-indexが効かない6つの原因」 と 「具体的な解決策」 をわかりやすく解説します。
また、Chrome DevToolsを使ったデバッグ方法 や CSS設計のコツ までカバーしているので、ぜひ参考にしてください!
z-indexとは?基本概念をおさらい
z-index は、要素の重なり順(Z軸方向の順番)を制御するプロパティ です。
しかし、特定の条件下でしか機能しない ため、正しく設定しないと「効かない」と感じることがあります。
まずは、z-indexが効くための前提条件を確認しましょう。
【z-indexが機能する条件】
- position: relative;、absolute;、fixed; などが適用されている
- stacking context(積み重なりのルール) を正しく理解している
では、具体的にz-indexが効かないケースを見ていきましょう!
z-indexが効かない3つの原因と解決策
① position が static のままになっている
まず確認してもらいたいのがこちらです。
z-index が使用できるのは、 position要素の下記が指定されている要素になります。
- position: relative;
- position: absolute;
- position: fixed;
- position: sticky;
試しに下記の4つのブロックをご覧ください。
4つのブロックには上からそれぞれ、sticky、absolute、relative、fixedを指定しています。
しっかり、想定通りの順番に並んでますね。

<p class="Z-index4">z-index4</p>
<p class="Z-index3">z-index3</p>
<p class="Z-index2">z-index2</p>
<p class="Z-index1">z-index1</p>
/* それぞれのブロックのスタイル(見た目に関してのスタイルは省略) */
.Z-index4 {
position: sticky;
z-index: 4;
}
.Z-index3 {
z-index: 3;
position: absolute;
}
.Z-index2 {
z-index: 2;
position: fixed;
}
.Z-index1 {
z-index: 1;
position: relative;
}
ここで、一番上になっている「Z-index4」ブロックの「position」を削除してみます。
/* position: sticky;を削除 */
.Z-index4 {
z-index: 4;
}
その結果がこちら。


positionを削除した、「z-index: 4」が下になりました。
このように「z-index」プロパティを効かすには、「position」が必須です。
absoluteやfixedを使用するとレイアウトが崩れてしまう場合は、とりあえず「position: relative;」を指定するといいよ。

② 親要素の z-index が影響している
z-index は、親要素の stacking context によって影響を受けます。
例えば、親要素に z-index: 1; が設定されていると、その子要素が z-index: 9999; でも親要素より前には出られません。
See the Pen Untitled by kokusyo (@kokusyo) on CodePen.
<div class="Z-index1">
<div class="Z-index9999">z-index9999</div>
</div>
<div class="Z-index2">z-index2</div>
/* それぞれのブロックのスタイル(見た目に関してのスタイルは省略) */
.Z-index1 {
position: relative;
z-index: 1;
}
.Z-index2 {
z-index: 2;
}
/* z-index9999 が設定されているが、親要素のz-indexが1 */
.Z-index9999 {
z-index: 9999;
}

親要素にレベルの低い「z-index」が指定されてるよ。
その場合子要素にレベルの高い「z-index」が指定されていても、親要素より前に来ることはないよ。
z-indexが効かない場合、親要素の「z-index」の値を確認してみよう。

解決策
親要素の影響を受けているため、親要素のz-indexを高い値に設定する、もしくはz-indexを削除することで解決します。
See the Pen Untitled by kokusyo (@kokusyo) on CodePen.
/* 親要素のz-indexを削除 */
.Z-index1 {
position: relative;
/* z-index:1; */
}
③ stacking context(積層コンテキスト)の影響
Stacking Context(積層コンテキスト) とは、要素の重なり順を管理する「グループ」 のことです。
通常、z-index は数値が大きいほど前に表示されますが、異なる stacking context に属する要素同士では z-index を比較できません。
- stacking context が作られると、その中の要素同士でしか
z-index
を比較できない - stacking context の 外の要素とは z-index の比較ができなくなる
- そのため、
z-index: 9999;
を設定しても、z-index: 1000;
の要素の後ろに来ることがある
See the Pen Untitled by kokusyo (@kokusyo) on CodePen.
Stacking Context(積層コンテキスト)
Stacking Context(積層コンテキスト) とは、要素の重なり順を管理する「グループ」 のことです。
通常、z-index
は数値が大きいほど前に表示されますが、異なる stacking context に属する要素同士では z-index を比較できません。
例えば、transform
や opacity
を設定すると、新しい stacking context が作られます。
すると、その要素内では z-index
が機能しても、外の要素とは z-index の順番を制御できなくなる のです。
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_positioned_layout/Stacking_context
Stacking Context を作る要素
条件 | 例 |
---|---|
z-index を持つ position 要素 | position: relative; や absolute; で z-index を指定 |
transform を適用 | transform: scale(1); など |
opacity を適用 | opacity: 0.99; でも stacking context が作られる |
filter を適用 | filter: blur(5px); など |
clip-path を適用 | clip-path: circle(50%); など |
解決策
stacking context を作らないように transform: none;
などを指定する。もしくは、親要素にz-indexを指定しましょう。
.container {
position: relative;
/* 親要素にz-indexを指定するか、Stacking Context を作る要素を削除 */
z-index: 9999;
/*transform: scale(1);*/
}
まとめ
z-index
が効かない原因は いくつかの要素が関係している ため、一概に「これが原因!」とは言い切れません。position
の設定ミス、stacking context
の影響、transform
や opacity
による新しいコンテキストの発生など、
さまざまな理由で 意図した順番にならない ことがあります。
もし z-index
がうまく機能しないと感じたら、上の記事を参考に、原因を一つずつチェックしてみましょう! ✅

効かないあるあるとして、「of-type」が効かない場合の対策もあるよ。
こっちも参考にしてね。