http://www.css88.com/archives/1584
在前端开发中,经常会用到css的position:absolute来使层浮动,前通过left,top,right等属性来对层进行定位,但ie6对left,top,right等属性的解释和ie7,ie8及firefox、chrome等不一致。
在父层使用position:relative;和padding(当然0值除外)后,ie6中层的定位起始坐标是从padding后的位置算起,而其他则从层的真实位置算起,而非被padding改变后的那个位置。这点造成使用position:absolute进行层定位时ie6与其他浏览器的表现不一样。
目前解决办法,使用csshack,_left针对ie6进行重设。
另:IE6 BUG大全: http://www.css88.com/archives/579
===========================以下内容2010年3月30日更新=============================
今天收到robertsky123的留言(见留言区):
一些样例请测试好再传,会误导读者的,还有ie与其他主流浏览器的盒模式是一样的,不是ie定了width在加padding就不会改变宽度也是改变的, 网上有些东西很容易误导读者,请博主对读者负责啊!
非常感谢robertsky123的留言和建议!由于robertsky123当头棒喝使我重新对该问题进行了测试。
确实该问题还有其他的解决:不过这些方案很和实际项目有关,比如这个父级容器是否顶宽定高等其他原因。
首先看问题的产生,HTML和CSS如下:
<div style="position:relative; padding:20px; border:2px solid #F00;"> <div style="position:absolute; top:0; left:0; border:1px solid #690;">test box</div> </div>
显示如图:
robertsky123在留言中说的“ie与其他主流浏览器的盒模式是一样的”我真不敢苟同,我始终觉得IE6的盒模式就是和其他主流浏览器盒模式存在差异,如果是一样的,那么试问这个例子IE6为什么会和其他浏览器不同呢?
虽然相对定位的父级容器加宽度,高度,zoom:1都能使本来中定位的test box圆点和其他主流浏览器一致,例如:
<div style="position:relative; padding:20px; border:2px solid #F00;height:20px"> <div style="position:absolute; top:0; left:0; border:1px solid #690;">test box</div> </div>
<div style="position:relative; padding:20px 20px; border:2px solid #F00;"> <div style="position:absolute; top:0;_top:2px; left:0;_left:-20px; border:1px solid #690;">test box</div> </div>






22 条评论
博主加入7617538需要什么条件?我是某财经网站的前端架构师,可否加入,94589040
我怎么没试出来啊 把代码贴出来看看
没有BUG呀,在IE6测试正常
我也没试出来
一些样例请测试好再传,会误导读者的,还有ie与其他主流浏览器的盒模式是一样的,不是ie定了width在加padding就不会改变宽度也是改变的,网上有些东西很容易误导读者,请博主对读者负责啊!
对于楼主说的实际应用中的高度不会定死,如果使用hack,我想是否只用一个_height=1%就行了呢,毕竟ie6有了高度而且ie6的高度是会被撑开的,除非定义了overflow:hidden;
@robertsky123
使用_height=1%和使用_left不是一样是hack吗?他们有什么区别呢?使用_left还有个好处就是父级的padding还是存在,而使用_height=1%,父级的padding却失效了,而求父级的高度是被test-box撑开的,照理说test-box是脱离文档流的。
@愚人码头
呵呵,受教了
最近模仿google的热图时,发现IE6下的一个问题:html中一元素如果是position:relative,其父元素是float定位,其祖父元素也是:position:relative时,当前元素就无法正常显示。不晓得是不是因为定位过于复杂而导致IE6无法正常定位;
如果删除祖父元素的relative定位,或其父元素添加relative定位,即可正常显示。但这样的话,定位不是更复杂吗?父元素又是float又是relative定位。但ie6可以正常显示。不过这也导致用javascript的offsetleft获取绝对位置时出负值错误;
希望这不是一个超低级的问题。
俺用火狐看,,在放大的情况下严重溢出,。。
博主的 FF 是 4.0 版本?
不是4.0,只是个皮肤,呵呵
码头啊,多走一小步,你就离真相更近了,不多说,上代码:
内容区域
晕哦,还不让上代码的哦,上网址吧:http://youhuata.com/labs/IE6_position_bug.html 我的理解是:IE6的盒模型在触发了layout的情况下和其他浏览器是一致的,另外触发layout不会像你说的那样导致padding消失,你可以看看我网址里的实际效果!
进一步捣腾了一下,父级元素触发了layout并且内部只有absolute的子元素时,IE6会吃掉padding-top值,只保留padding-bottom值,我想这才是这个bug最根本的问题吧
我看最好的解决方法是加宽度,虽然上下padding会合并,但是父元素里添加其他的内容后padding就正常了
我也把代码复制下来测试一下,确实会这样,受教了!
该问题的定位在ie6下只是在水平方向的内填充上有问题,顶部和底部没有定位问题。
我也尝试了一把,在父级元素加一个height:1%也可以,或者只要触发他的hasylayout就行。
在里面层加个float:left;就可以了嘛!
这个问题我也遇到过
要把一个定位属性为absolute的元素定位于其父元素中,满足两个条件:
(1)设定top,right,bottom,left
(2)父级设定position属性
别人说的。。。
是不是因为没有满条件1,所以才会显示出问题呢??
一 个引用通告
[...] 【IE6的疯狂之十】父级使用padding后,子元素绝对定位的BUGhttp://www.css88.com/archives/1584 [...]