日期:2014-05-17 浏览次数:20854 次
?
例子一、???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?
<div id="container"> <div id="box1">box1</div> </div> <div id="box2">box2</div>?
#container { position: relative; } #box1 { position: absolute; top: 100px; left: 210px; width: 200px; height: 200px; background-color: yellow; z-index: 20; } #box2 { position: absolute; top: 50px; left: 160px; width: 200px; height: 200px; background-color: green; z-index: 10; }
?分析位置:
两个box被完全的定位,背景色为黄色的box1拥有z-index属性值20,而背景色为绿色的box2拥有z-index属性值10,唯一的区别在于
背景色为黄色的box1被放在了一个定义了属性position:relative的div中,并且在文档源代码中位前。
根据上述代码以及z-index的属性简介,我们来分析上面代码将会产生的效果位置。
CSS specification
中清楚的规定了除了根元素,只有定位元素的z-index被定义一个非auto的z-index值才能产生新的stacking
context。而例子中被相对定位的元素并没有定义z-index,即z-index为默认值auto。所以按理他不会影响子元素的层叠顺序。即背景色
为黄色的box1和背景色为绿色的box2的stacking context相同,即都为根元素产生的root stacking
context。再根据规则中当stacking
context一样的时候,就用z-index的值来决定怎样显示的原理,则应该z-index属性值20的背景色为黄色的box1在z-index属性
值10背景色为绿色的box2之上。
迷惑:
在IE的z-index属性值10背景色为绿色的box却在了z-index属性值20的背景色为黄色的box1之上,和我们分析的结果完全不一致,为什么呢?
解惑:
其实这是IE浏览器(windows)的一个BUG——在IE浏览器中,定位元素会产生一个新的stacking context,并且从z-index的值为0开始。
现在让我们来理解上面的演示在IE中的显示逻辑。设置了相对定位的container产生一个新的stacking
context,所以其被定位的子元素背景色为黄色的box1以这个新的stacking
context为参考来决定层叠顺序。而背景色为绿色的box2此时和背景色为黄色的box1的父元素container为同一个stacking
context,所以他们之间按照z-index来决定层叠顺序,即z-index属性值10背景色为绿色的box2在z-index属性值0的
container之上。
其实这个BUG的影响范围很广,只是大家平时不太注意。下面来说明一个最常见的出现情况z-index的负值解析,很多朋友因为这个BUG的存在甚至武断的认为IE支持z-index的负值,而FF不支持z-index的负值。
?
?
例子二、?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?
?<body> <div id="box1">为什么负值的定位元素在IE和FF下显示不一致呢?Why?</div> </body>
#box1 { position: absolute; top: 100px; left: 210px; width: 200px; height: 200px; background-color: yellow; z-index: -10; }
那为什么负值的定位元素在IE和FF下显示不一致呢?
ie 中根据stack level规则: z-index为负的定位元素的stack level比父级stacking
context(此处是root stacking
context)高,显示在其上方。故box1在ie中能显示。ff3.0和标准一致,也能显示。大家可以试一下。
ff2.0 中由于那条特殊的stack level,即 z-index为负的定位元素的stack level比父级stacking
context(此处是root stacking context)低,所以显示在root stacking context下方。故不能看见。
另外,上面的代码中加上opacity那条后,在ff2.0中即可显示了。这又是什么原因呢?
推测:在火狐中如果给元素设置opacity属性(1除外),即会产生新的stacking context。
上面加上opacity属性后在ff2.0中可显示box1在body下,ff3.0box1在body上,(可以根据上面的stack level规则
自己分析)符合推测。
?
总结:
在一个stacking context中元素的z-轴显示顺序,由元素所处的stack level
决定。对于同一stack level的定位元素由z-index的大小进一步决定显示次序。
除此之外(也许设置其他属性也会产生新的stacking context,但还不知道)只有定位元素设置了z-index(auto除外)才会产生新的stacking context,子元素将按照新的stacking context,定位。
?
http://www.tjkdesign.com/article ... _elements_stack.asp
这个网页上有关于z-index的一个很好的演示
大家可以看看
?
相关文章:
?
? z-index在IE中的迷惑
??Elaborate description of Stacking Contexts
??负值z-index在IE中不再迷惑(怿飞前辈来看下)
?
?