ie6 z-index不起作用的解决方法

一、概念

z-index伴随着层的概念产生的。网页中,层的概念与photoshop或是flash中层的概念是一致的。熟悉photoshop或是flash的应该知道,层级越高(图层越靠上),越在上面显示,如果层发生重叠,层级高的会覆盖层级低的,如果非透明或半透明,则会遮挡。

在photoshop中

层的高低就是靠手动调的,鼠标拖拽,或是ctrl+]或是ctrl+shift+[快捷键改变层的次序。如下图,鼠标拖移改变层次序的过程中:

在flash中

类似,可以手动改变图层次序,或是使用as脚本,例如:容器对象.setChildIndex(显示对象,0)就是让对象底层显示,而容器对象.setChildIndex(显示对象,容器对象.numChildren-1)就是最上面显示。

在CSS中

Z-index属性决定了一个HTML元素的层叠级别。元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言。一个更高的Z- index值意味着这个元素在叠层顺序中会更靠近顶部。这个层叠顺序沿着垂直的线轴被呈现。显然,只能通过代码改变层级,这个属性就是z-index,要 让z-index起作用有个小小前提,就是元素的position属性要是relative,absolute或是fixed。下为z-index的示意 图:

按照正常的思维,z-index层级越高,内容越应该在上面显示。在大部分的浏览器在大部分的情况下,确实如此,但是不绝对。尤其遇到IE6,这家伙,估计是后妈带大的,从小营养不良,结果后来健康问题一堆又一堆。z-index的问题就是其中之一,而本文就是要讲讲这个IE6下z-index不起作用的问题。

二、关于效果截图的些必要说明

1、页面上固定不动的一个黑色背景,透明度40%,几乎满屏显示的层级为1的绝对定位层。
HTML为:<div id=”blank”></div>
对应CSS为:#blank{width:100%; height:600px; background:black; opacity:0.4; filter:alpha(opacity=40); position:absolute; left:0; top:0; z-index:1;}
作用是为了让层级关系一目了然。看:

这说明内容在z-index为1的绝对定位层之下。

这说明内容在z-index为1的绝对定位层之上。
2、页面上做对比的是美女图片,图片在半透明黑色绝对定位层的上面还是下面很容易辨别,这样,您就能够对我所说的z-index不起作用有很直观的认识了。

三、IE6的抱怨:浮动让我沉沦

首先讲讲第一种z-index无论设置多高都不起作用情况。
这种情况发生的条件有三个:
1、父标签 position属性为relative;
2、问题标签无position属性(不包括static);
3、问题标签含有浮动(float)属性。
您可以拿下面的代码自己做个简单测试:
<div id=”blank”></div>
<div style=”position:relative; z-index:9999;”>
<img style=”float:left;” src=”http://image.zhangxinxu.com/image/study/s/s256/mm2.jpg” />
</div>
z-index都9999了,层级够高吧,但是,看下面的图:


现在去掉浮动,HTML代码如下:
<div id=”blank”></div>
<div style=”position:relative; z-index:9999;”>
<img src=”http://image.zhangxinxu.com/image/study/s/s256/mm2.jpg” />
</div>
结果IE6下:

将外部div的position:relative属性改为 absolute可以解决这一问题
解决方法有三,1、position:relative改为position:absolute;2、去除浮动;3、浮动元素添加position属性(如relative,absolute等)。

四、固执的IE6:它只认第一个爸爸

用术语具体描述为:
父标签position属性为relative或absolute时,子标签的absolute属性是相对于父标签而言的。而在IE6下,层级的表现有时候不是看子标签的z-index多高,而要看它们的父标签的z-index谁高谁低。
但是,相信这里面很多人不知道IE6下,决定层级高低的不是当前的父标签,而是整个DOM tree(节点树)的第一个relative属性的父标签。有时平时我们多处理一个父标签,z-index层级多而复杂的情况不多见,所以难免会有认识上的小小偏差。

例如下面的HTML代码:
<div id=”blank”></div>
<div style=”position:relative;”>
<div style=”position:relative;z-index:1000;”>
<div style=”position:absolute; z-index:9999;”>
<img src=”http://image.zhangxinxu.com/image/study/s/s256/mm3.jpg” />
</div>
</div>
</div>
可以看到,mm3图片的父标签div 是绝对定位,层级9999,比1大多了,绝对定位的父标签层级1000(10000也一样),也比黑色半透明层的z-index:1大多了,但是,我们可怜的IE6童鞋——


IE7与IE6有着同样的bug,原因很简单,虽然图片所在div当前的老爸层级很高(1000),但是由于老爸的老爸不顶用,可怜了9999如此强势的孩子没有出头之日啊!

知道原因解决就很轻松了,给第一任老爸添加z-index后的HTML代码如下:
<div id=”blank”></div>
<div style=”position:relative;z-index:1;“>
<div style=”position:relative; z-index:1000;”>
<div style=”position:absolute; z-index:9999;”>
<img src=”http://image.zhangxinxu.com/image/study/s/s256/mm3.jpg” />
</div>
</div>
</div>
结果IE6童鞋喜笑颜开,春光灿烂:

五、总结

z-index这玩意深不可测,里面所蕴含的知识不是 CSS手册上的那点东西,那只是冰山一角。这涉及到border及background的堆叠模型,涉及到同层级的显示问题,以及浏览器显示的些机制等, 这是很深的一潭水。

时间: 2024-09-29 23:07:17

ie6 z-index不起作用的解决方法的相关文章

node app.js不起作用的解决方法

In Express 3.0, you normally would use app.configure() (or app.use() ) to set up the required middleware you need. Those middleware you specified are bundled together with Express 3.0. e.g. var express = require('express'); var routes = require('./ro

关于使用Github,gitignore不起作用的解决方法

直接上解决方法: 1 2 3 git rm -r --cached . git add . git commit -m 'update .gitignore' 解释: .gitignore文件,具体的规则一搜就有.我在使用Git的过程中,明明写好了规则,但问题不起作用,每次还是重复提交,无法忍受.其实这个文件里的规则对已经追踪的文件是没有效果的.所以我们需要使用rm命令清除一下相关的缓存内容.这样文件将以未追踪的形式出现.然后再重新添加提交一下,.gitignore文件里的规则就可以起作用了.

ios微信浏览器click事件不起作用的解决方法

$(document).on( "click", ".weui_cell", function (event) {alert(); }); JS代码是这样的,html代码是动态追加进去的,click事件在苹果手机没作用,在安卓和pc端事件完全正常 经过一番搜索,解决方法也很奇葩,只需在html代码中添加onclick=""   就可以了,记录下来 ,让后面看到的人少走弯路 如:<div class="weui_cell"

9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法

在使用到9.png的布局上面添加 android:padding="0dip" 比如 <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="20dp"            android:l

关于css中的vertical-align: middle不起作用的解决方法

正在学前台,出现了vertical-align: middle 这个属性怎么都不起作用的情况,解决过程如下: 刚开始是这样: .table_yht{ text-align: center; vertical-align: middle; } 发现文字左右的确居中,但是上下不能居中,然后请教了大神,才知道原因.原来是因为我们引用的css包里也设置了这个属性,而且默认优先级是最高的,所以我们再怎么设置也不起作用了.要改变这种情况,就要想办法在我们写的类里的属性的优先级提高,可以这样: .table_

htaccess不起作用的解决方法,AllowOverride All打开后出现403错误时解决办法

在php程序的目录下有一个htaccess文件,这个文件起着对url重写的作用,但是不巧的,在我的应用程序里不起作用,baidu了一下,发现是 AllowOverride All,  这个选项没有打开, 这个选项,只能写在 <Directory /> </Directory>中,我在http.conf中打开了这个选项,结果网站出现了403禁止访问的错误,经查看,结果发现是 <Directory /> Options Indexes AllowOverride None

gridview 外嵌套HorizontalScrollView 横向滑动后setselection(position)不起作用的解决方法

gridview滑动不起作用 就用外层horizontalscrollview 的滑动方法吧,只需要计算一下需要滑动的横向距离,代码如下: hsv.smoothScrollTo(vStepsHorizonListview.getChildAt(position) .getWidth() * position, 0); 版权声明:本文为博主原创文章,未经博主允许不得转载.

OS X EI Capitan 10.11.4中sudo无法起作用的解决方法

mac升级到OSX EI Capitan 10.11.4后sudo命令无法起作用,执行任何操作总是显示Operation denied.这是因为在10.11.4中引入了Rootless机制,即就算是Root用户也无法对某些文件或者目录进行读写操作,只有Apple或者Apple授权签名的软件可以.Rootless的范围包括: /System /bin /sbin /usr 关闭Rootless的方法就是重启mac,并且再重启时按住Command+R,等mac启动后,在最顶部的菜单栏选择Utilit

IOS7 UITableViewCellSelectionStyleBlue 不起作用的解决方法

在iOS7以后,蓝色的单元格选择效果已经被禁止了,取而代之的可以以下面的代码实现: //从iOS7开始,设置选择背景为蓝色,已经没有作用了 cell.selectionStyle = UITableViewCellSelectionStyle.Blue var bgView = UIView() //蓝色太难看了,设置为棕色 bgView.backgroundColor = UIColor.brownColor() cell.selectedBackgroundView = bgView 基本原