本文へ移動

トップお知らせ・ブログz-indexが効かない原因

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.解決の手順

  1. 01
    position を確かめる

    前に出したい要素に、position(relative など)が指定されているか確かめます。

  2. 02
    比べる相手を確かめる

    前に出したい要素と、上に重なっている要素が、どの親の中にあるかを確かめます。

  3. 03
    グループを作っている親を探す

    親の要素に、z-index、opacity(1未満)、transform などが指定されていないか確かめます。

  4. 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屋にご相談ください。

相談する

関連記事