あなたに合った学習プランは?LINE適正コース診断はこちら プログラミングが全て無料で学習可能!
【CSS】z-indexを最前面にするには?効かない原因と重なり順の仕組み - 忍者CODEマガジン

【CSS】z-indexを最前面にするには?効かない原因と重なり順の仕組み

プログラミング言語の辞書

CSSで要素を重ねたとき、「z-index: 9999;にしたのに最前面に出ない」「ヘッダーやモーダルが他の要素の下に隠れる」と困ったことはありませんか?z-indexは、数値を大きくすれば必ず勝つように見えますが、positionの指定やスタッキングコンテキストの影響で、思った通りに前面へ出ないことがあります。

z-indexを最前面にしたいときは、数値を大きくする前に、positionの指定とスタッキングコンテキストを確認することが重要です。この記事では、z-indexの基本、効かない原因、最前面に出す実務コード、モーダルや固定ヘッダーでの使い分けまで解説します。

CSSのz-indexとは?

z-indexとは、要素が重なったときの前後関係を指定するCSSです。

.modal {
  position: fixed;
  z-index: 1000;
}

数値が大きいほど前面に表示されやすくなります。

z-indexは「奥行き」の順番を決める

Webページは横方向・縦方向だけでなく、要素が重なる「奥行き」の方向もあります。z-indexはこの奥行き方向の順番を決めるために使います。

指定 表示イメージ
z-index: 1; 低めの前面
z-index: 10; より前面
z-index: 1000; ヘッダーやモーダルなど強く前面に出す

z-indexは、重なっている要素の前後関係を調整するためのCSSです。

z-indexを最前面にする基本コード

要素を最前面に出したい場合は、まずpositionz-indexをセットで指定します。

【基本例】
.front-box {
  position: relative;
  z-index: 10;
}

固定ヘッダーやモーダルなら、次のように書くことが多いです。

.modal {
  position: fixed;
  inset: 0;
  z-index: 1000;
}

positionを指定していないと効かないことがある

z-indexは、主にpositionが指定された要素や、flex/gridの子要素などで効果を発揮します。

【NG例】
.box {
  z-index: 9999;
}
【OK例】
.box {
  position: relative;
  z-index: 9999;
}

z-indexが効かないときは、まずpositionがstaticのままになっていないか確認しましょう。

原因1:positionが指定されていない

最も基本的な原因は、positionが指定されていないことです。

position: static;は初期値です。この状態では、z-indexを指定しても期待通りに効かない場合があります。

.target {
  position: relative;
  z-index: 20;
}

z-indexを使うときは、position: relative;absolutefixedstickyなどを指定しているか確認しましょう。

原因2:親のスタッキングコンテキストに閉じ込められている

z-indexで一番つまずきやすいのが、スタッキングコンテキストです。

スタッキングコンテキストとは、要素の重なり順を管理する独立したグループのようなものです。ある親要素がスタッキングコンテキストを作ると、その子要素のz-indexは親の中だけで比較されます。

z-index: 9999でも勝てない例

<div class="parent-a">
  <div class="child-a">z-index: 9999</div>
</div>

<div class="parent-b">
  <div class="child-b">前面に見える要素</div>
</div>
.parent-a {
  position: relative;
  z-index: 1;
}

.child-a {
  position: absolute;
  z-index: 9999;
}

.parent-b {
  position: relative;
  z-index: 2;
}

この場合、.child-az-index: 9999;でも、親の.parent-az-index: 1;なので、z-index: 2;.parent-bより前に出られません。

z-indexは、親の重なりグループを超えて自由に最前面へ出られるわけではありません。

原因3:transformやopacityで新しい重なりグループができている

transformopacityなどが指定された要素は、新しいスタッキングコンテキストを作ることがあります。

.card {
  transform: translateZ(0);
}

.badge {
  position: absolute;
  z-index: 9999;
}

このような場合、.badgeが思ったほど前面に出ないことがあります。

スタッキングコンテキストを作りやすい指定

代表的なものは次の通りです。

  • positionz-indexの組み合わせ
  • position: fixed;position: sticky;
  • opacityが1未満
  • transformnone以外
  • filterperspective
  • isolation: isolate;

z-indexが効かないときは、対象要素だけでなく親や祖先要素のtransform、opacity、filterも確認しましょう。

原因4:後から読み込まれたCSSに上書きされている

z-indexの指定自体は正しくても、後から読み込まれたCSSに上書きされている場合があります。

.modal {
  z-index: 1000;
}

.theme-modal {
  z-index: 10;
}

WordPressテーマやプラグインでは、テーマ側のCSSが後から読み込まれ、意図しない値で上書きされることがあります。

対策:開発者ツールで実際の値を確認する

実務では、ブラウザの検証機能で対象要素を選び、最終的にどのz-indexが効いているか確認します。z-indexを大きくする前に、そもそも指定が上書きされていないかを確認しましょう。

モーダル・ヘッダー・固定ボタンのz-index設計例

z-indexを場当たり的に9999にしていくと、あとで管理しづらくなります。実務では、役割ごとに段階を決めておくと安全です。

UI z-index例 考え方
通常の装飾バッジ 10 カード内で少し前面に出す
固定ヘッダー 100 本文より前面
固定CTA・トップボタン 200 ヘッダーより下か同程度
モーダル背景 900 ページ全体を覆う
モーダル本体 1000 最前面に出す

モーダルを最前面にするコード例

.modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 900;
  background: rgba(0, 0, 0, 0.6);
}

.modal-content {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 1000;
  background: #fff;
}

z-indexは大きい数字を乱用するより、役割ごとに段階を決めて管理する方が安全です。

z-indexを最前面にしたいときのチェックリスト

確認項目 見るポイント 対策
position staticのままではないか position: relative;などを指定
親のz-index 親が低い階層にいないか 親側のz-indexも見直す
スタッキングコンテキスト transformやopacityがないか 不要な指定を外す、構造を変える
上書き テーマや別CSSに負けていないか 開発者ツールで確認する
数値設計 9999を乱用していないか 役割ごとに段階を決める

公式ドキュメントも確認する

z-indexやスタッキングコンテキストを正確に確認したい場合は、公式情報も参考になります。

まとめ:z-indexを最前面にするには親の階層まで確認しよう

この記事では、CSSのz-indexを最前面にする方法を解説しました。

z-indexが効かないときは、数値だけでなく、position、親のz-index、スタッキングコンテキスト、CSSの上書きを確認しましょう。

最前面にしたいからといって、毎回9999を指定すると管理が難しくなります。ヘッダー、固定ボタン、モーダルなど、役割ごとに数値のルールを作ると、実務でも扱いやすくなります。