对z-index的一些实践总结
今天看到MDN中对z-index的一些描述,才发现自己之前的总结不够严谨简练,关键在于对本地堆叠上下文的理解,摘抄如下:
取值
auto
元素不会建立一个新的本地堆叠上下文(根元素除外)。当前堆叠上下文中新生成的元素和父元素堆叠层级相同。
integer
整型数字是生成的元素在当前堆叠上下文中的堆叠层级;元素同时会创建一个堆叠层级为0的本地堆叠上下文。这意味着子元素的 z-indexes 不与元素外的其余元素的 z-indexes 进行对比。
之前的结论:
1.元素有个默认的层级,默认DOM中靠后的元素层级更高;body与html似乎有默认的z-index,即使不设置也相当于设置后的效果,即其子元素不论层级正负,都处于body与html之上。
2.当父级元素没有设置z-index值时,子元素z-index>=0则显示在父级元素之上,若子元素z-index< 0则显示在父级元素之下,但不论元素z-index值多小,始终是显示在body与html元素之上;而当父级或祖先元素设置了z-index值后,不论子元素z-index值为多少,都显示在父级元素之上。
3.同级元素z-index相同时,后者居上,否则大者居上。没有设置z-index值时可作为0值进行比较,大者居上。如果同级元素没有设置z-index值,则其第一个具有z-index属性的子元素的z-index可以直接与他的同级元素进行比较,大者居上。只有当父级元素设置了z-index值时,才会影响其后各自子元素的层叠关系。简言之,在同级的比较中,其实只比较一次,也就是各自第一个具有z-index值的元素进行比较,如果哪个同级元素及其子元素都没有设置z-index值,则选最顶层的同级元素进行比较。其后的元素不论层级高低,总是跟随父亲一起显示。
4.奇葩的ie6,总是要先比较父级元素的层级高低,父级元素层级比较占了下风,则子元素层级再高也没法出头,拼爹的节奏。用Multibrowser测试ie7也是这个效果。而当元素z-index为负时,此元素处于祖先元素之下,直到遇到第一个position不为static的祖先元素(或者body和html),这样的祖先元素会阻止它下沉,不许它自甘堕落啊~
关于ie6中z-index的问题这里就不赘述啦~
测试代码如下,可以自己添加z-index值进行验证:
<div class="a"> <div class="b"></div> </div> <div class="c"> <div class="d"></div> </div>
样式代码:
.a{
position:relative;
width:300px;
height:200px;
border:10px black solid;
background:yellowgreen;
}
.b{
position:absolute;
width:100px;
height:100px;
border:5px white solid;
background:#959;
}
.c{
position:relative;
width:300px;
height:200px;
border:10px black solid;
background:#959;
top:-150px;
left:80px;
}
.d{
position:absolute;
width:100px;
height:100px;
border:5px white solid;
background:yellowgreen;
}
参考链接:http://www.w3.org/TR/CSS21/visuren.html#propdef-z-index
https://developer.mozilla.org/zh-CN/docs/Web/CSS/z-index
浙公网安备 33010602011771号