問題
z-index: 999
を設定したのに、要素が他の要素の下に隠れてしまいます。
HTML
<div class="container">
<div class="box1">ボックス1</div>
<div class="box2">ボックス2(上に表示したい)</div>
<div class="box3">ボックス3</div>
</div>
CSS
.container {
position: relative;
height: 200px;
}
.box1 {
/* positionなし */
width: 150px;
height: 100px;
background-color: #4CAF50;
z-index: 1;
}
.box2 {
/* positionなし */
width: 150px;
height: 100px;
background-color: #2196F3;
margin-top: -50px;
margin-left: 50px;
z-index: 999; /* 効いていない */
}
.box3 {
position: relative;
width: 150px;
height: 100px;
background-color: #FF9800;
margin-top: -50px;
margin-left: 100px;
z-index: 2;
}
実行結果
ボックス1
ボックス2(上に表示したい)
ボックス3
※ ボックス2のz-indexが999なのに、ボックス3の下に隠れています
🔧 実際に試してみよう(リアルタイム更新)
上部でHTMLまたはCSSタブを選択して編集すると、下部の結果エリアがリアルタイムで更新されます。
CSSの .box2
に position: relative;
を追加して、z-indexが効くようにしてみましょう。
📺 ライブプレビュー
更新中
ヒント
クリックしてヒントを表示
z-index
プロパティは位置指定された要素にのみ有効です。
「位置指定された要素」とは、position
がstatic
以外の値を持つ要素のことです。
z-indexを適用したい要素のposition
プロパティを確認してみましょう。
解答
クリックして解答を表示
問題の原因
ボックス2にposition
プロパティが設定されていないため、z-index
が効いていません。z-indexは位置指定された要素にのみ有効です。
z-indexが効く条件
position: relative
position: absolute
position: fixed
position: sticky
display: flex
またはdisplay: grid
の子要素(特殊ケース)
注意:position: static
(デフォルト)では効きません
修正方法
box2にposition: relativeを追加
.box1 {
position: relative; /* 追加 */
width: 150px;
height: 100px;
background-color: #4CAF50;
z-index: 1;
}
.box2 {
position: relative; /* 追加:これでz-indexが有効に */
width: 150px;
height: 100px;
background-color: #2196F3;
margin-top: -50px;
margin-left: 50px;
z-index: 999; /* これで効くようになる */
}
.box3 {
position: relative; /* 既に設定済み */
width: 150px;
height: 100px;
background-color: #FF9800;
margin-top: -50px;
margin-left: 100px;
z-index: 2;
}
修正後の結果
ボックス1
ボックス2(最前面)
ボックス3
スタッキングコンテキストの理解
重なり順序の決定要因(優先順位順)
- スタッキングコンテキストの階層
- z-indexの値(大きいほど上)
- HTMLの順序(後の要素が上)
新しいスタッキングコンテキストが作られる条件
position: absolute/relative
+z-index
(auto以外)position: fixed/sticky
opacity
< 1transform
、filter
、perspective
などのCSSプロパティdisplay: flex/grid
の子要素でz-indexを持つ
よくあるz-indexの問題と解決策
/* ❌ 効かない例 */
.element {
z-index: 9999; /* positionがないので無効 */
}
/* ✅ 修正例1:最小限の変更 */
.element {
position: relative; /* 追加 */
z-index: 9999;
}
/* ✅ 修正例2:絶対配置が必要な場合 */
.element {
position: absolute;
z-index: 9999;
top: 0;
left: 0;
}
/* ⚠️ 親要素のz-indexに注意 */
.parent {
position: relative;
z-index: 1; /* 子要素は親のコンテキスト内でのみ有効 */
}
.child {
position: absolute;
z-index: 999; /* 親より高くても、親のコンテキスト外の要素には負ける */
}
覚えておくポイント
z-index
にはpositionが必要(static以外)- 最も簡単な解決策は
position: relative
を追加 - z-indexの値は相対的(999でも1でも上下関係が重要)
- 親要素のスタッキングコンテキストの影響を受ける
- DevToolsで要素のz-indexとpositionを確認する習慣を