position中z-index问题

本文主要是参考了他人关于z-index这个属性在ie6下的bug,加入了一些自己的理解。

z-index这属性在大多数浏览器下,还算是中规中矩的,没有太多的兼容问题(我很少见到...),不过在ie6下,就有两个很大的问题,非常影响界面显示的哦!


ie6下z-index属性不起作用的情况:

直接上代码吧。

<style type="text/css">
#blank{width:100%; height:600px; background:black; opacity:0.4; filter:alpha(opacity=40); position:absolute; left:0; top:0; z-index:1;}
</style>

<div id="blank"></div>
<div style="position:relative; z-index:9999;background:red;border:1px solid red;">asd
	<img style="float:left;" src="images/img1.jpg" />
</div>


看下这会怎么样显示:

由这个图片上面的效果,你可以看出几个问题?

1:ie6下,img元素被绝对定位的id=blank的div元素覆盖,在其他浏览器下,img元素却可以显示在id=blank的div元素之上,看似是因为z-index在ie6没有起作用导致的结果。

2:asd内容区域的红色背景,在所有浏览器下,都显示在被绝对定位的id=blank的div元素之上,而asd的元素结点也就是img的父节点,这又说明z-index是起到了作用的。

3:img的父节点,并没有能把float的img元素包含在内,说明父节点没有对其子节点进行浮动清理,那么就必定没有拥有布局。

总结,根据上面说的三条,可以判断,并不是因为z-index在ie6下不起作用而导致了img元素位于被绝对定位的id=blank的div元素之下,主要原因是,相对定位依然属于文档流中,而浮动的img元素,却脱离了文档流。由图中可以看出,img元素并没有被其父元素包含在内。

猜测其原因是:在ie6下,相对定位的属于文档流的元素,和其已经浮动,脱离文档流的元素,是彻底的断开了链接。成为完全不相关的两个元素。


这个问题的解决方法也有三种:1、position:relative改为position:absolute;2、去除浮动;3、浮动元素添加position属性(如relative,absolute等)。

据我自己的看法猜测原因是:在ie6下,相对定位的属于文档流的元素,和其已经浮动,脱离文档流的子元素,是彻底的断开了链接,成为完全不相关的两个元素。(这里说的有点问题,并不是完全不相关,在文章结尾进行补充),它的z-index和父元素的z-index就没有联系了。所以呢,这里给出的三种解决方法,其实就是两个思想:要么你不脱离普通流,要么咱们父子一起脱离,保持一致性,这就叫做,父子齐心,其利断金!!!
换句话说,老版本的z-index属性就像是在古代皇家,皇子走丢了,和家里联系不上,别人也不知道你是皇家的人,自然有点地位的就会欺负皇子了。新版的就不一样了,就算是走丢了,依然有电话,网络等各种手段联系家里,地位依然被认可,存在,稍微有点地位的其他人,想欺负皇子,那也看他有没有这个能耐。
这一切呢,都在说明,ie6已经老去了,赶紧走吧,说拜拜!!


说到上面问题的第三种解决方法,浮动元素添加position属性(如relative,absolute等)。就引出了另外一个问题:z-index在ie6下拼祖先的z-index进行显示的bug。这里就不多说了。如果想要了解,查看下面提到的两篇文章吧。


关于该文章的有些思想是参考了他人文章:IE6下z-index犯癫不起作用bug的初步研究和之前转载的一篇文章:关于z-index的那些事儿


2013.11.9号补充:

前面红色删除线的叙述内容有误,这个时候的父子元素并不是完全断开的。只能说是断了联系,当浮动的子元素同样选择了定位之后,又取得了联系,z-index就实现了它的效果。

#blank{width:100%; height:600px; background:black; opacity:0.4; filter:alpha(opacity=40); position:absolute; left:0; top:0; z-index:1;}
.bc{
	width:500px;
	height:300px;
	background:red;
}

<div id="blank"></div>
<div style="position:relative;background:red;z-index:4;border:1px solid blue;">asd
	<img style="float:left;position:relative;" src="images/img1.jpg" />asdf
</div>
<img style="float:left;position:relative;" src="images/img1.jpg" />


ie6下的显示效果:(img加了相对定位)

ie6下的显示效果:(img没有加相对定位)


用上面两幅图分析一下:

1:没有加相对定位时,两个float都被覆盖,说明他们完全没有z-index属性的影响(他们都没有设置定位,肯定没有z-index的属性的),第一个img元素呢,它的父元素是有定位的,也有很高的z-index属性,浮动的子元素完全不起作用。

2:文字没有被覆盖,文字的背景色也没有被覆盖,说明文档流的元素,受到了父元素z-index的影响了。

3:把两个img元素都加了相对定位,第一个元素虽然没有设置z-index属性,但是仍然浮出水面,第二个img元素却依然在水中,说明第一个元素的z-index属性,只能是受它的父元素影响得到的。

总结一下:父元素和浮动的子元素,在ie6下,只是z-index出现了断掉联系,当浮动的子元素被定位之后,又取得了联系。

不去考虑,ie6什么原因导致这个现象了,希望ie6赶紧闪人吧,离开大家的视线吧!!!


再加一个这个问题修复的方法吧:ie6下,只要元素设置了宽度,高度等,就可以使元素拥有布局,按照上面提到的,拥有布局的就会清理浮动了,所以,也可以解决这个z-inde不起作用的问题哦。。

比如把img的父元素的width:100%,就可以了啊,有兴趣的可以试试哦!!



都是个人的一些关于z-index的思想,如果您发现有错误的地方,欢迎指正。大家共同学习进步。谢谢!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值