因为HTML元素显示在显示器上都是一个二维平面,只拥有x和y轴的属性,为了让元素显示有一些层级关系的效果,所以引入了z-index属性来表示三维立体空间的z轴方面,这样显示出来的界面就有了三维立体的上下关系的效果。z-index的属性值有三种可能:
注释:
- 所有主流浏览器都支持 z-index 属性。任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 “inherit”。
- IE6/7下position不为static,且z-index不存在时z-index为0,除此之外的浏览器z-index的默认值为auto。
- z-index为auto的元素不参与层级关系的比较,由向上遍历至此且z-index不为auto的元素来参与比较。
概念:
z-index 属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。z-index 仅能在定位元素上奏效(position属性值为 relative 或 absolute 或 fixed的对象)
演示:
- 两个div,无设置z-index。第二个蓝色div向上移动50px时如下图。如果两个元素都没有设置z-index,使用默认值auto,一个定位一个没有定位,那么定位元素覆盖未定位元素
<div style="width:100px;height:100px;"></div> <div style="width:50px;height:50px;position:relative;top:-50px;"></div>
<div style="width:100px;height:100px;position:relative;top:20px;"></div> <div style="width:50px;height:50px;"></div>
- 蓝色div设置z-index为-5时,如下图。(注:蓝色div已设置position : relative ,故z-index可生效 )
<div style="width:100px;height:100px;"></div> <div style="width:50px;height:50px;position:relative;top:-25px;z-index:-5;"></div>
- 红色色div设置z-index为30,蓝色为25时,30>25,结果如下图。
<div style="width:100px;height:100px;z-index:30;"></div> <div style="width:50px;height:50px;position:relative;top:-50px;z-index:25;"></div>
z-index属性适用于定位元素(position属性值为 relative 或 absolute 或 fixed的对象),用来确定定位元素在垂直于显示屏方向(称为Z轴)上的层叠顺序,也就是说如果元素没有定位,对其设置的z-index是无效的。虽然红色div的z-index比蓝色div的大,但是由于红色div未定位,其z-index属性未起作用,所以仍然会被蓝色div覆盖。
相同z-index:
- 如果两个元素都没有定位发生位置重合现象或者两个都已定位元素且z-index相同发生位置重合现象,那么按文档流顺序,后面的覆盖前面的。
<div style="width:100px;height:100px;position:relative;z-index:1;"></div> <div style="width:50px;height:50px;position:relative;top:-50px;z-index:1;"></div>
- 如果两个元素都没有设置z-index,使用默认值auto,一个定位一个没有定位,那么定位元素覆盖未定位元素
<div style="width:100px;height:100px;position:relative;top:10px;"></div> <div style="width:50px;height:50px;"></div>
父子z-index关系处理:
- 如果父元素z-index有效,那么子元素无论是否设置z-index都和父元素一致,在父元素上方
<div style="width:100px;height:100px;position:relative;z-index:10;"> <div style="width:50px;height:50px;position:relative;z-index:-5;"></div> </div>
- 如果父元素z-index失效(未定位或者使用默认值),那么定位子元素的z-index设置生效
<div style="width:100px;height:100px;position:relative;"> <div style="width:50px;height:50px;position:relative;z-index:-5;"></div><!--z-index为-5所以在父元素的后面> </div>
兄弟子元素z-index关系处理:
- 如果兄弟元素的z-index生效,那么其子元素覆盖关系有父元素决定
<div style="width:100px;height:100px;position:relative;z-index:5;"> <div style="width:50px;height:250px;position:relative;z-index:50;"></div> </div> <div style="width:100px;height:100px;margin-top:-40px;position:relative;z-index:10;"> <div style="width:30px;height:150px;position:relative;z-index:-10;"></div> </div>
虽然第一个div的子元素的z-index比较高,但是由于其父元素z-index比第二个平级div低,所以第一个div子元素会被第二个父辈div及其子元素覆盖。
父元素z-index有效,那么子元素无论是否设置z-index都和父元素一致,在父元素上方。
总结:
- 两个div,无设置定位(z-index设置与否都是失效的)或者两个都已定位元素且z-index相同,层级关系按照文档流的顺序显示,后面的覆盖前面的
- 如果两个元素都没有设置z-index,使用默认值auto,一个定位一个没有定位,那么定位元素覆盖未定位元素
- 如果父元素z-index有效,那么子元素无论是否设置z-index都和父元素一致,在父元素上方
- 如果父元素z-index失效(未定位或者使用默认值),那么定位子元素的z-index设置生效
- 如果兄弟元素的z-index生效,那么其子元素覆盖关系由父元素决定