1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Css】Z-indexについてNo-1(stacking context)

Last updated at Posted at 2021-05-19

初めに

cssで要素の積み重ね順を決めるz-index。ただz-indexに値を指定するだけではうまくいかない場面があります。その原因と理由について学習した内容を書いてみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

z-indexとは

MDNの公式ドキュメントには以下のように解説されています。

CSS の z-index プロパティは、位置指定要素とその子孫要素、またはフレックスアイテムの z 順を定義します。より大きな z-index を持つ要素はより小さな要素の上に重なります。

要するに同じ積み重ねコンテキスト(stacking context)内の要素同士の積み重ねレベルを指定し、表示される上下の位置関係を指定するプロパティです。ここで重要な概念がstacking contextです。

単純にz-index値を高くするだけでは、要素の積み重ね度は変わらない

要素は記述した順に下から上へと積み重なります。

<body>

  <div class="red"></div>
  <div class="blue"></div>
  <div class="yellow"></div>

</body>
.red {
  width: 100px;
  height: 100px;
  background-color: red;
  margin-bottom: -50px;
}

.blue {
  width: 100px;
  height: 100px;
  background-color: blue;
  margin-bottom: -50px;
}

.yellow {
  width: 100px;
  height: 100px;
  background-color: yellow;
}

これを赤の上に青、その上に黄が積み重なっています。
スクリーンショット 2021-05-20 6.49.16.png
この状態で青を一番下にし、次に赤、黄が来るようにz-indexを指定してみます。

.red {
  width: 100px;
  height: 100px;
  background-color: red;
  margin-bottom: -50px;
  z-index: 2;                //追記
}

.blue {
  width: 100px;
  height: 100px;
  background-color: blue;
  margin-bottom: -50px;
  z-index: 1;           //追記
}

.yellow {
  width: 100px;
  height: 100px;
  background-color: yellow;
  z-index: 3;           //追記
}

結果は前と同じです。このようにz-indexを指定するだけでは要素の積み重ね順を変えることはできません。

スクリーンショット 2021-05-20 6.49.16.png

Contextとは

要素が積み重なるには土台(ベース)となるものが必要です。お家が建つには土台となる地面が無いとダメですよね。それと同じく要素は何かの土台の上に積み重ねられています。cssでは積み重ねの概念としてcontextというものがあります。同じcontext(土台)の要素同士でしかz-indexは適用されないです。
htmlは階層構造になっていて、要素には必ず親子関係があります。要素の積み重ね順は親要素がcontext(土台)であり、そのcontext上の同じ階層の兄弟要素(siblings)同士にしか適用されません。先程の例でいうとbody要素のcontext上にred,blue,yellowという3つの兄弟要素があるので、積み重ね順が決まるのです。

<body>                           //bodyタグが親要素でありcontextを生成している
  <div class="red"></div>             //bodyが生成するcontext内にある
  <div class="blue"></div>
  <div class="yellow"></div>
</body>

仮に次のようにredの中にbuleがあり、blueの中にさらにyellowがあった場合はどうなるでしょうか。

<body>
 <div class="red">
    <div class="blue">
      <div class="yellow"></div>
    </div>
  </div>
</body>

cssの記述は以下の通り。

.red {
  width: 100px;
  height: 100px;
  background-color: red;
  margin-bottom: -50px;
}

.blue {
  width: 100px;
  height: 100px;
  background-color: blue;
  margin-bottom: -50px;
}

.yellow {
  width: 100px;
  height: 100px;
  background-color: yellow;
}

結果としては黄色だけになってしまいました。
スクリーンショット 2021-05-20 7.15.28.png
この原因はbodyタグのcontext上にredがあり、redタグのcontext上にさらにblueが、またblueタグのcontext上にyellowがあるからです。土台がそれぞれbody,red,blueと違うので家(red,blue,yellow)もその3つの土台を基準にして建っています(stacking)。つまり、要素の積み重ね順は親要素を基準にした同じcontext内で決まります。

参考サイト

https://developer.mozilla.org/ja/docs/Web/CSS/z-index
https://coliss.com/articles/build-websites/operation/css/4-reasons-z-index-isnt-working.html
https://jajaaan.co.jp/web-production/frontend/z-index/
https://qiita.com/hoto17296/items/42e62989193504d512c7

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?