日期:2014-05-17  浏览次数:20770 次

CSS_中的z-index(二)《元素层叠级别(stack level)及z-index剖析》

?

?

声明


定位元素:position属性值设置为除默认值static以外的元素,包括relative,absolute,fixed。
平台:win/IE win/FF

z-index:

用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序

? ? 值:? ?? ?auto | 整数 | inherit
? ? 默认:? ?? ?auto
? ? 适用于:??定位元素
? ? 继承性:??no

理解stacking context

1. 每个box都归属于一个stacking context,它是元素在z轴方向上定位的参考。

2. 根元素形成 root stacking context,其他stacking context由定位元素设置z-index为非auto时产生。

??? 也就是说,如果没有设置z-index为非auto属性,则不会产生stacking context。那这个时候此box归属于哪个stacking context呢?归属于其父层box。依次类推。

?

例子:#div1{position:relative;z-index:0;}使 id=div1的元素产生stacking context。stacking context和 containing block 并没有必然联系。

理解stack level

在一个stacking context中的每个box,都有一个stack level(即层叠级别,以下统一用stack level),它决定着在同一stacking context中每个box在z轴上的显示顺序。

相同 stacking context中

1. 同一stacking context中,stack level值大的显示在上,stack level值小的显示在下

2. 同一stack level的遵循后来居上的原则(back-to-front )

不同 stacking context中

3. 不同stacking context中,元素显示顺序以父级的stacking context的stack level来决定显示 的先后情况。与自身stack level无关 。注意stack level和z-index并不是统一概念。(将在后文慢慢理解)

stack level规则

每个stacking context中可包含块级(block)元素、内联(行内inline)元素,还有设置float属性的元素、定位元素等等他们在同一父级 stacking context中的显示顺序是怎样的?即stack level是怎样的呢?比如一个块级元素和内联元素发生层叠的话谁会在上面呢?是不是谁在后面谁就在上面呢?

根据w3c关于stack level 的介绍可以得出以下stack level规则

每个stacking context都包括以下stack level (后来居上):

? ? 1.父级stacking context的背景、边界
? ? 2.z-index值为负值的定位元素(值越小越在下)
? ? 3.文本流中非定位的、block块级子元素
? ? 4.文本流中非定位的、float浮动子元素
? ? 5.仿佛能产生stacking context的inline元素
? ?? ?? ?否则,inline元素的stack level将在block元素之前。
? ? 6.z-index:auto/0的定位元素
? ? 7.z-index值为正的定位元素(值越大越在上)


以上stack level在浏览器执行情况:
???? firefox3.0下测试完全吻合,firefox2.0下稍有不同即:“z-index值为负值的定位元素”在“父级stacking context的背景、边界”之前。

???? ie6.0和7.0中:inline元素的stack level位于block元素之前,且“文本流中非定位的、float浮动子元素”(以下简称浮动元素)和“文本流中非定位的、block块级子元素”(以下简称block元素)处于同一级。

?

一些测试结果

?

在FF3.0中结果和标准顺序一致。FF2.0中“z-index值为负值的定位元素”在父级stacking context的背景下面。(注意ff2.0的这个特殊性)

?

IE下(无论ie6.0或者ie7.0)“float元素”和“block元素”属同一stack level,而“inline元素”的stack level相对较低。

解释:
“float元素”,“z-index:auto的定位元素”仿佛 产生了新的stacking context(但真正来说并不产生),但其真正能产生新的stacking context的后代,按照自己的stacking context定位,不按其父级(z-index:auto) stacking context定位。

但IE中“z-index:auto的定位元素”会拥有z-index值0,产生一个新的stacking context ,并影响其子元素定位:子元素的父context是新产生的这个context,这些子元素在z轴上的排列顺序已经限制在了这个父context范围内。这是IE一个BUG。
inline元素在FF中仿佛能产生新的stacking context,而在IE中则不能。

至此stack level规则内容已经完毕,现在应该能理解stack level和z-index的不同。stack level来决定这一个stacking context中各元素在z轴上的显示顺序,对于同一stack level的定位元素才由z-index进一步决定显示次序。

?

?

这里整理并重新编辑过,原文请参考这里,并向作者表示感谢!

http://bbs.blueidea.com/thread-2872952-1-1.html