CSSでレイヤーを調節する。z-indexで要素の重なりをコントロールしよう

2024.01.03
CSSでレイヤーを調節する

レイヤーとは、階層や層を作るといった意味があります。CSSでデザインを再現する際にはレイヤーの概念を理解しておかなければなりません。

なぜならば、要素と要素が重なり合うブロックは頻繁に使用されるからです。

本記事では、CSSでレイヤーを調節する方法を初心者にもわかりやすく解説します。

レイヤーを調節できないと思ったようなデザインを再現できません。

要素の位置を正確に指定してレイヤーを整える力を身につけましょう。

記事の後半では、レイヤーを指定する際の注意点も詳しく解説していますので最後までご覧ください。

CSSでレイヤーを調節するz-indexとは

CSSでレイヤーを調節するためには、z-indexプロパティを使用します。

要素と要素を重ね合わせてデザインを表現する場面は、Webサイトを作成していると必ず出現します。

z-indexで要素の位置を調整できるようになると簡単にデザインを再現できるようになります。

まずは、z-indexについて詳しく解説します。

z-indexをマスターして簡単にレイヤーを調整できる力を身につけましょう。

z-indexの記述方法

z-indexは、同じブロック内で要素と要素が重なり合う時に指定できます。

要素の優先順位を数字で指定するため簡単にレイヤーを調節できます。

z-indexは以下のように記述します。

CSS
.layer{
z-index:2;
}
.layer2{
z-index:3;
}

後述しますが、z-indexプロパティはpositionプロパティと一緒に使用する必要があるため、上記のコードではレイヤーを表現できません。

詳しい例は、記事の後半で紹介しています。

z-indexの値

z-indexプロパティで指定できる値には以下のようなルールがあります。

  • 初期値は0
  • 指定できる値は整数
  • マイナス値も使える

z-indexで指定された値は、その数字が大きいほど上に表示されます。

z-indexを何も指定していない状態では0になることは理解しておかなければなりません。

z-indexでは、-1や-2などのマイナス値も指定できます。

しかし、マイナス値を指定するとどの要素がどこのレイヤーに属するかを理解できず、混乱する場合が多いため、保守性や拡張性を考慮して使用しないほうが良いでしょう。

指定する整数は、Webサイトの制作者によって異なります。

z-index:1;を基準にしたり、z-index:10;を基準にしたりと制作会社や制作者によってルールが定められていることは知っておきましょう。

z-indexはpositionプロパティと一緒に使う

レイヤーを表現するCSSのz-indexプロパティは、必ずpositionプロパティと一緒に使用します。

relativeやabsolute、fixedを指定した状態でなければz-indexで指定した要素はレイヤーが表現されません。

ただpositionプロパティの初期値であるstaticだけを記述しても、z-indexは効かないので注意しましょう。

今回は、relativeとabsoluteを使用した例を紹介します。

HTML
<div class="container">
    <div class="layer layer1">レイヤー1</div>
    <div class="layer layer2">レイヤー2</div>
    <div class="layer layer3">レイヤー3</div>
</div>
CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
}
z-indexを指定しない時の画像

positionプロパティを使用して、レイヤーを表現しました。

しかし、上記コードではz-indexを記述していないため、背面からブロックを記述した順番に並んでいます。

まずは、z-indexを使用して、レイヤー1を最表面に表示します。

CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
}
レイヤー1にのみz-indexを指定した時の画像

レイヤー1にのみz-indexを記述しました。

レイヤー2とレイヤー3はz-indexは記述していませんが、初期値であるz-index:0;と同じ扱いとなるためレイヤー1が最表面に表示されます。

上記コードのレイヤー2にz-indexを記述してレイヤー2を最表面に表示するには以下のコードのように記述します。

CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
}
レイヤー1とレイヤー2にz-indexを指定した時の画像

レイヤー2にz-index:2;を記述して、レイヤー1よりも表面に表示させました。

上記の画像ではわかりにくいですが、レイヤー3は最背面にあります。

z-indexは記述した数字が大きいほど表面に表示されるという挙動は必ず把握しておきましょう。

最後に、最初の状態とは逆にレイヤー1が最表面に表示され、レイヤー2とレイヤー3が続いて表示されるようにコードを記述します。

CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 3;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 1;
}
全てのレイヤーにz-indexを指定した時の画像

すべての要素にz-indexを指定して、レイヤーを表現しました。

上記のように、z-indexで指定した値によって、階層を決定します。

z-indexの値が大きいほど表面に表示され、z-indexを指定しないとz-index:0;となり、最背面になることを覚えておきましょう。

z-indexが効かない原因

CSSでレイヤーを調節したい時に、z-indexプロパティを記述したけど表示に変化がなくて困る場合があります。

ここでは、z-indexプロパティが効かない原因を紹介します。

基本を抑えておけば簡単にz-indexプロパティを使用できますので参考にしてください。

z-indexプロパティが効かない原因は主に以下の2つが原因です。

  • positionプロパティを子要素に指定していない
  • 親要素に孫要素を適用させようとしている

z-indexプロパティの挙動を再度確認しておきましょう。

positionプロパティが指定されていない要素は最背面になる

同じ親要素の中に、positionプロパティが指定されていない子要素がある場合は、その子要素のレイヤーは最背面に配置されます。

例えば、以下のコードになります。

HTML
<div class="container">
    <div class="non-position"></div>
    <div class="layer layer1">レイヤー1</div>
    <div class="layer layer2">レイヤー2</div>
    <div class="layer layer3">レイヤー3</div>
</div>
CSS
.container{
  position: relative;
}
.non-position{
  width: 300px;
  height: 300px;
  background-color: royalblue;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
positionプロパティを指定しなかった時の画像

上記コードのpositionを指定していないnon-positionクラスにz-indexを指定したとしてもレイアーは最背面のままとなります。

上記からもわかるように、z-indexはpositionプロパティとセットで使用しなければ効果を発揮しないのです。

孫要素のz-indexは親要素には適用されない

z-indexは基本的に兄弟要素の中でしか階層を決定できません。

例えば、以下のコードを記述したとします。

HTML
<div class="container">
    <div class="layer layer1">レイヤー1</div>
    <div class="layer layer2">レイヤー2
    </div>
    <div class="layer layer3">レイヤー3
        <div class="layer4">レイヤー4</div>
    </div>
</div>
CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
.layer4{
  width: 100px;
  height: 100px;
  background-color: sandybrown;
}
孫要素を記述したときの画像

レイヤー4は、レイヤー3の子要素となります。

まずはレイヤー2を最表面に表示します。

CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 4;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
.layer4{
  width: 100px;
  height: 100px;
  background-color: sandybrown;
}
レイヤー2を最表面に表示した時の画像

上記のコードに対して、レイヤー4だけを最表面に表示したい場合にレイヤー4にレイヤー2よりも高いz-index:5;を指定してもレイヤー4は最表面に表示されません。

CSS
.container{
  position: relative;
}
.layer{
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 4;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
.layer4{
  width: 100px;
  height: 100px;
  background-color: sandybrown;
  z-index: 5;
}

結果は先ほどと変わりません。

上記コードのようにz-indexは、兄弟要素の中でしか階層を決定できないのです。

複雑なレイヤーを構成する際には特に注意しておかなければなりません。

position:fixed;を使用した時のz-indexには注意

Webサイトをスクロールした時にヘッダーを追従させたい時に使うのがposition:fixed;です。

Webサイト上にpositionプロパティを使用した際に、position:fixed;とのレイヤーレベルを考慮しなければなりません。

簡単なコード例を紹介します。

HTML
<header class="header">
    ヘッダー
</header>
<div class="container">
    <div class="layer layer1">レイヤー1</div>
    <div class="layer layer2">レイヤー2</div>
    <div class="layer layer3">レイヤー3</div>
</div>
CSS
.header{
  background-color: rgba(104, 112, 119, 0.835);
  position: fixed;
  width: 300px;
  z-index: 3;
  text-align: center;
}

.container{
  position: relative;
}
.layer{
  margin-top: 20px;
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
position:fixed;で指定したheaderが背面に表示された時の画像

headerクラスのposition:fixed;のz-indexがレイヤー3と同レベルにあるとheaderクラスがレイヤー3の下になり隠れてしまいます。

上記のような場合は、headerクラスのz-indexを一番上に指定する必要があります。

以下のコードでは、headerクラスのz-indexを他のレイヤーよりも高く設定しました。

CSS
.header{
  background-color: rgba(104, 112, 119, 0.835);
  position: fixed;
  width: 300px;
  z-index: 4;
  text-align: center;
}

.container{
  position: relative;
}
.layer{
  margin-top: 20px;
  width: 200px;
  height: 200px;
  position: absolute;
}
.layer1{
  background-color:pink;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.layer2{
  background-color: powderblue;
  top: 40px;
  left: 20px;
  z-index: 2;
}
.layer3{
  background-color: seagreen;
  top: 70px;
  left: 30px;
  z-index: 3;
}
position:fixed;で指定したheaderを最表面に表示した時の画像

ヘッダーを固定して、Webサイト内にpositionプロパティが存在する際には、z-indexの値に注意しましょう。

ヘッダーのレイヤーは最表面にしなければなりません。

まとめ

今回はCSSにおけるレイヤーの調整方法を紹介しました。

positionプロパティを使う際にはレイヤーを意識しなければなりません。

z-indexプロパティを駆使して、デザインを忠実に再現しましょう。

z-indexプロパティを使用する際には、要素と要素の関係やpositionプロパティとセットで使うなどの注意点も考慮しましょう。

CSSでレイヤーを調整するz-indexを理解して、コーディングレベルを上げていきましょう。

\プログラミングスクールを比較/

DMM WEBCAMP

COACHTECH

RUNTEQ

DMM WEBCAMP COACHTECH RUNTEQ
目指せる姿 WEBエンジニアへの転職
フリーランスエンジニア WEBエンジニアへの転職
分割払い
補助金 ×
転職保証 × ×
受講期間 12週間〜 3ヶ月〜 5ヶ月〜
特徴 【IT業界の転職を一番に考えたい方向け】
大手DMMが運営のプログラミングスクール
転職成功率98.8%
豊富なキャンペーンや補助金制度あり
【フリーランスを目指したい方向け】
フリーランスのエンジニアを最短で目指す
エンジニアと共に実際の案件開発を担当
【とことん勉強してから転職したい方向け】
1,000時間(約9カ月)のカリキュラムでしっかり勉強
企業の求める即戦力のWEBエンジニアを目指す
料金 329,350円〜
※給付金適用後
42万9,000円~ 55万円

公式HP

公式HP

公式HP

関連記事

資料請求

  • 短期集中で最速エンジニア転職を実現-転職成功者インタビュー一覧

    DMM WEBCAMPでは転職成功率98%を実現しています。本資料では、元警察官や元ラーメン屋など様々なバックグラウンドを持つ卒業生の声をお届けします。

    資料をダウンロードする
  • IT技術がもたらす3つの変化と身につけるべきスキル

    IT技術の発展により、今後10~20年程度で47%の仕事がなくなると言われています。どのような変化が訪れ、私達はどのようなスキルを身につけるべきかを解説します。

    資料をダウンロードする
  • 未経験がフリーランスエンジニアになる方法-年収アップで自由な働き方を手に入れる

    働き方改革やリモートワークの影響でフリーランスという働き方の人気は高まりつつあります。フリーランスエンジニアとして活躍するために必要な情報をお届けします。

    資料をダウンロードする

© 2024 WEBCAMP MEDIA Powered by AFFINGER5