z-index在IE中的迷惑(2)
作者:blank 来源:蓝色经典 发布时间:2007-05-11 16:50:00
首先先来看一个演示例子的代码部分。
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中的显示却不一致。
演示地址:http://www.planabc.net/demo/z-index01.html
迷惑:在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; }
演示地址:http://www.planabc.net/demo/z-index02.html
大家会发现在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; }
演示地址:http://www.planabc.net/demo/z-index03.html
大家会发现和上面没精简的代码显示的结果是一致的。但如果用上面的理解在IE下或许无法解释通。因为此时的理解背景色为黄色的box1的stacking context无论在FF下还是在IE下都是根元素产生的root stacking context。
迷惑:那么在IE浏览器中,按照规则,背景色为黄色的box1也应该消失,然而却没有。
解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。
通过上面两个简单的例子,我想大家应该大致知道为什么负值的z-index在IE和FF解析不一样,不是FF不支持,而是IE的BUG。


猜你喜欢
- 一.__eq__方法在我们定义一个类的时候,常常想对一个类所实例化出来的两个对象进行判断这两个对象是否是完全相同的。一般情况下,我们认为如果
- 键盘事件废话不多说直接上包from selenium.webdriver.common.keys import Keys1、删除键 BACK
- 本文实例讲解了python实现两个程序之间通信的方法,具体方法如下:该实例采用socket实现,与socket网络编程不一样的是socket
- Mysql的分页的两个参数select * from user limit 1,21表示从第几条数据开始查(默认索引是0,如果写1,从第二条
- 本文实例讲述了python实现连接mongodb的方法。分享给大家供大家参考。具体分析如下:通过pymongo可以很容易的链接到mongod
- 一、单表查询—>更新UPDATE table_nameSET field1=new-value1, field2=new-value2
- 登录流程:实例化一个driver,然后driver.get()发送请求最重要的:切换iframe子框架,因为豆瓣的网页中的登录那部分是一个i
- 后台数据库: [Microsoft Access] 与 [Microsoft Sql Server] 更换之后,ASP代码应注意要修改的一些
- PyCharm 中在使用Turtle(海龟)库绘图体系时,代码明明是正确可以运行的,但是没有提示 ,代码出现黄色标记以及红色波浪线 ,经验不
- 两年前,我们开发了一套基于Flash的文件(主要是图片)上传RIA应用,提供给阿里巴巴的用户使用。如果你使用过Wordpress或flick
- Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。文档入
- ps:不曾想还有那么好用的方法。汗一个先。Div即父容器不根据内容自适应高度,我们看下面的代码:<div id="main&
- 缘起这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入
- 本文实例为大家分享了Python实现打乒乓小游戏的具体代码,供大家参考,具体内容如下源码奉上:import sysimport cfgimp
- 本文实例为大家分享了python微信跳一跳的具体代码,供大家参考,具体内容如下部分代码分享:wechat_jump.pyfrom __fut
- QSS介绍前言QSS即Qt样式表,是用来自定义控件外观的一种机制,QSS大量参考了Css的内容,但QSS的功能要比Css弱得多,体现在选择器
- 本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下:import numpy as npimport matplo
- 我就废话不多说了,大家还是直接看代码吧try: s = socket.socket() s.bind(('127.0.0.1'
- 前端的很多静态资源,比如JS,CSS怎么办呢?这时,我们需要一个公共且高速的静态资源托管平台。这里就推荐百度静态资源公共库,百度静态资源公共
- python 文件操作seek() 和 telll() 自我解释file.seek()方法格式: seek(offset,whence=0)