当前位置: 首页 > 图文教程 > 网页制作 > CSS样式表 > css z-index 在IE中的迷惑

CSS样式表
让图片 div居中实现代码
去掉点击链接时周围的虚线框outline属性
CSS 优先级 详细分析
广告始终定位到网页右下角 css
superLink 让伪链接更有可用性
CSS 模块化 实现方法
css 选择器 介绍
CSS 语法 学习css入门者看
firefox 滚动条消失引起页面抖动的问题
纯CSS定位的固定垂直居中浮动层代码,附经典解说 《详解定位与定位应用》
渲染CSS选择器
CSS 兼容问题
css textarea 高度自适应,无滚动条
CSS 网页表单实现鼠标悬停交互效果
鼠标激活显示背景色网页特效CSS代码
CSS制作用户登录和用户注册的用户体验表单
CSS代码 注释的3种方法
网页头部css代码优化实例
IE7和IE8的兼容性问题
CSS 网页布局网页制作技巧总结

CSS样式表 中的 css z-index 在IE中的迷惑


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 98 ::
收藏到网摘: n/a

z-index属性简介

引用:
z-index : auto | number

auto:默认值。
number:无单位的整数值,可为负数。

z-index 值较大的元素将叠加在z-index值较小的元素之上。对于未指定此属性的定位对象,z-index 值为正数的对象会在其之上,而z-index 值为负数的对象在其之下。

注意:这个属性不会作用于窗口控件,如selct 对象。在IE 5.5+中,iframe 对象开始支持此属性。而在之前的浏览器版本中,iframe 对象是窗口控件,会忽略此属性。

z-index属性适用于定位元素(position 属性值为 relative 或 absolute 或 fixed的对象),用来确定定位元素在垂直于显示屏方向(称为Z轴)上的层叠顺序(stack order)。

每一个定位元素都归属于一个stacking context。根元素形成root stacking context,而其他的stacking context则由定位元素产生(此定位元素的z-index被定义一个非auto的z-index值),定位子元素会以这个local stacking context为参考,用相同的规则来决定层叠顺序。并且stacking context和 containing block 之间并没有必然联系。

当stacking context一样的时候,就用z-index的值来决定怎样显示,如果z-index也相同(即stack level相同),则按照档中后来者居上的原则(back-to-front )的顺序来层叠。

当任何一个元素层叠另一个包含在不同stacking context元素时,则会以stacking context的层叠级别(stack level)来决定显示的先后情况。也就是说,在相同的stacking context下才会用z-index来决定先后,不同时则由stacking context的z-index来决定。例如:
定位元素A(z-index:100)里面有定位元素A1(z-index:300),而定位元素B和元素A兄弟关系(z-index:200)。你会发现无论A1的z-index是多大,也会被z-index是200的B所覆盖,因为A的z-index只有100。

IE中z-index BUG
首先先来看一个演示例子的代码部分。
XHTML部分: <div id="container">
<div id="box1">这个box应该在上面</div>
</div>
<div id="box2">这个box应该在下面,IE浏览器会对定位元素产生一个新的stacking context ,甚至当元素 z-index的为“auto”。</div>
CSS部分:

#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之上。


下面我们在FF和IE中分别测试最终的效果,会发现FF中显示的效果和上面分析的效果是完全一致的,而IE中的显示却不一致。

迷惑:在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的负值。

举个例子或许更能形象表达。

XHTML部分:

<body>
<div id="container">
<div id="box1">为什么负值的定位元素在IE和FF下显示不一致呢?Why?</div>
</div>
</body>
CSS部分:

#container { position: relative; }
#box1 { position: absolute; top: 100px; left: 210px; width: 200px; height: 200px; background-color: yellow; z-index: -10; }
大家会发现在FF下,背景色为黄色的box1消失了,而IE下却显示。这也是我上面所说的,部分朋友武断的认为IE支持z-index的负值,而FF不支持z-index的负值的原因。我们要透过现象看本质。

在上个例子中的分析,我们知道:设置了相对位置(position: relative)的元素但没有给出非auto的z-index就不会产生stacking context,也就不会影响其子元素的层叠顺序。所以背景色为黄色的box1的stacking context为根元素产生的root stacking context。在上一节中我们讲到“对于未指定此属性的定位对象,z-index 值为正数的对象会在其之上,而 z-index 值为负数的对象在其之下”,按照规则,应该是设定了z-index为-10的黄色的box1会显示在于未指定z-index属性的元素(比如body)之下。所以在FF下背景色为黄色的box1消失了。而在IE中设置了相对位置的 container会拥有z-index值0,产生一个新的stacking context,背景色为黄色的box1在新的stacking context内层叠顺序,故在IE中会看到显示。

不过这里还有一个问题,对于上面的代码,我们再精简一下:

XHTML部分:

<body>
<div id="box1">为什么负值的定位元素在IE和FF下显示不一致呢?Why?</div>
</body>
CSS部分:

#box1 { position: absolute; top: 100px; left: 210px; width: 200px; height: 200px; background-color: yellow; z-index: -10; }
大家会发现和上面没精简的代码显示的结果是一致的。但如果用上面的理解在IE下或许无法解释通。因为此时的理解背景色为黄色的box1的stacking context无论在FF下还是在IE下都是根元素产生的root stacking context。

迷惑:那么在IE浏览器中,按照规则,背景色为黄色的box1也应该消失,然而却没有。
解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。