今回は「z-index」にフォーカス!なんやかんや「z-indexがイマイチよくわからない!?」って人向けです。
簡単に言ってしまえば、z-indexプロパティは、要素の重なりの順序を指定することができます。
一般的にはhtmlコード上の後ろに記述したものが画面上では手前に表示されますが、z-indexプロパティの値に指定する“ 数値の数が大きいほど手前に、小さいほど奥に ”表示されるようになります。ちなみにこれをスタックレベル(stack level)と呼ぶようです。
この「z-index」の「z」は、3次元空間で遣われる、x方向,y方向,z方向の「z」で前後関係を意味しています。
z-indexの初期値はautoで、何も指定しない初期値(=auto)の場合その親要素と同じ階層に自動的になる。そして、重なる順序をauto=0を基準として整数で指定していきます。
▼簡単な例を見みながら確認していきましょう。
1.z-index関係なしで要素を並べてみる
まずは、単純に3つの<div>要素をz-indexを何も指定しないで並べてみます。
使用する画像は以下の3つです。
![]() |
![]() |
![]() |
box1.png | box2.png | box3.png |
1-1.共通のCSS
1 2 3 |
.sample { float:left; } |
1-2.HTML
1 2 3 |
<div class="sample box1"></div> <div class="sample box2"></div> <div class="sample box3"></div> |
1-3.CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/*SAMPLE1*/ .box1{ width: 100px; height: 100px; background: url(../images/box1.png) no-repeat; } .box2{ width: 100px; height: 100px; background: url(../images/box2.png) no-repeat; } .box3{ width: 100px; height: 100px; background: url(../images/box3.png) no-repeat; } |
すると縦横100pxの角丸の正方形要素が横に並ぶようになります。
2.z-index関係なしで要素をとりあえず重ねてみる
前述のサンプルで「BOX2、BOX3」だけど、左に「margin-left:-20px」ずらしてみる。
2-1.HTML
1 2 3 |
<div class="sample box1_2"></div> <div class="sample box2_2"></div> <div class="sample box3_2"></div> |
2-2.CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/*SAMPLE2*/ .box1_2{ width: 100px; height: 100px; background: url(../images/box1.png) no-repeat; } .box2_2{ width: 100px; height: 100px; background: url(../images/box2.png) no-repeat; margin-left:-20px; } .box3_2{ width: 100px; height: 100px; background: url(../images/box3.png) no-repeat; margin-left:-20px; } |
すると「BOX1」はそのままで「BOX2,BOX3」が左に20pxずつずれます。
その際に、重なる順は後に記述されているものほど手前に表示されるので奥から「BOX1→BOX2→BOX3」になりますね。
3.position:relative;かつindex値を指定する
さらに、それぞれのボックス要素に対してpositionプロパティに対しrelativeを指定し、さらにそれぞれ違ったz-index値を指定してみましょう。
ここで指定するのは以下の通りです。
BOX1…z-index指定なし(デフォルト値=auto)
BOX2…z-index:3
BOX3…z-index:2
3-1.CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/*SAMPLE3*/ .box1_3{ width: 100px; height: 100px; background: url(../images/box1.png) no-repeat; position:relative; } .box2_3{ width: 100px; height: 100px; background: url(../images/box2.png) no-repeat; margin-left:-20px; position:relative; z-index:3; } .box3_3{ width: 100px; height: 100px; background: url(../images/box3.png) no-repeat; margin-left:-20px; position:relative; z-index:2; } |
するとz-index値の一番大きな要素「BOX2」が一番手前に表示されるようになり、その次に「BOX3」、その次に「BOX1」という順になります。
4.入れ子の場合
次にそれぞれの要素を入れ子にした場合も見ていきましょう。
ここで指定するのは以下の通りです。
big_box…z-index指定なし(デフォルト値=auto)
small_box1…z-index:3
small_box2…z-index:2
small_box3…z-index:1
small_box4…z-index:-1
4-1.HTML
1 2 3 4 5 6 |
<div class="big_box"> <div class="small_box1"></div> <div class="small_box2"></div> <div class="small_box3"></div> <div class="small_box4"></div> </div> |
4-2.CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/*SAMPLE4*/ .big_box{ width: 600px; height: 400px; background:#F8E9DB; position:relative; } .small_box1{ width: 200px; height: 100px; background:#BCDCF3; border:1px solid #ccc; position:absolute; left:50px; top:50px; z-index:3; } .small_box2{ width: 200px; height: 100px; background:#DBBD49; border:1px solid #ccc; position:absolute; left:50px; top:50px; z-index:2; } .small_box3{ width: 200px; height: 100px; background:#C3A035; border:1px solid #ccc; position:absolute; left:50px; top:50px; z-index:1; } .small_box4{ width: 200px; height: 100px; background:#88CF8D; border:1px solid #333; position:absolute; left:400px; top:100px; z-index:-1; } |
すると、z-index値の大きな順「small_box1(z-index=3)」→「small_box2(z-index=2)」→「small_box3(z-index=1)」→「big_box(z-index=auto)」→→「small_box4(z-index=-1)」となります。
5.リンクありの場合
単純に考える通り、上に表示される要素が優先させるので、他の要素と重なってしまったエリアのリンクは認識されません。「BOX1、BOX3」にリンクあり「BOX2」はリンクなしで配置してみます。
5-1.HTML
1 2 3 |
<div class="sample box1_5"><a href="#"><img src="images/box1.png" /></a></div> <div class="sample box2_5"><img src="images/box2.png" /></div> <div class="sample box3_5"><a href="#"><img src="images/box3.png" /></a></div> |
5-2.CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/*SAMPLE5*/ /*BOX1*/ .box1_5{ width: 100px; height: 100px; position:relative; } /*BOX2*/ .box2_5{ width: 100px; height: 100px; margin-left:-30px; position:relative; z-index:3; } /*BOX3*/ .box3_5{ width: 100px; height: 100px; margin-left:-30px; position:relative; z-index:2; } |
すると一番手前に表示されるのは「BOX2(リンクなし)」になりますが、その左右に配置してある「BOX1(リンクあり)、BOX3(リンクあり)」にカーソルを合わせると、リンクが貼ってあるのがわかると思いますが、「BOX2」と重なる部分は、手前にある「BOX2」が優先されてリンクは切れていることがわかります。
このように、任意の要素を配置する前後関係は「z-index」を扱って指定をしていきます。
z-indexって何なの?って疑問を抱いていた方の解決になればいいのですが…。