【IE6的疯狂之十】父级使用padding后子元素绝对定位的BUG(2010年3月30日更新)

时间:2010年03月30日作者:愚人码头查看次数:17,178 views评论次数:39

在前端开发中,经常会用到css的position:absolute来使层浮动,前通过left,top,right等属性来对层进行定位,但ie6对left,top,right等属性的解释和ie7,ie8及firefox、chrome等不一致。

在父层使用position:relative;和padding(当然0值除外)后,ie6中层的定位起始坐标是从padding后的位置算起,而其他则从层的真实位置算起,而非被padding改变后的那个位置。这点造成使用position:absolute进行层定位时ie6与其他浏览器的表现不一样。

未标题-1

目前解决办法,使用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>
如图:
注:这里如果加宽度和zoom:1,padding-top:20px和padding-bottom:20px的效果就没了,如图:
如果在实际项目中定死高度的,那么加个高度是很好的选择,但是杯具的是往往很多时候这个高度是自动撑的,那么我还是觉得用hack方式比较好!比如:

<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>

声明: 本文采用 BY-NC-SA 协议进行授权 | WEB前端开发
转载请注明转自《【IE6的疯狂之十】父级使用padding后子元素绝对定位的BUG(2010年3月30日更新)

如果你读了我的文章,觉得有帮助: 说明
标签:,分类:html+css
33条评论
  1. jun留言于:2010年02月24日11:44

    博主加入7617538需要什么条件?我是某财经网站的前端架构师,可否加入,94589040

    [回复]

  2. jun留言于:2010年02月25日11:22

    我怎么没试出来啊 把代码贴出来看看

    [回复]

  3. buger留言于:2010年03月22日22:21

    没有BUG呀,在IE6测试正常

    [回复]

  4. 若比邻留言于:2010年03月23日16:38

    我也没试出来

    [回复]

  5. robertsky123留言于:2010年03月30日11:10

    一些样例请测试好再传,会误导读者的,还有ie与其他主流浏览器的盒模式是一样的,不是ie定了width在加padding就不会改变宽度也是改变的,网上有些东西很容易误导读者,请博主对读者负责啊!

    [回复]

  6. robertsky123留言于:2010年03月31日09:03

    对于楼主说的实际应用中的高度不会定死,如果使用hack,我想是否只用一个_height=1%就行了呢,毕竟ie6有了高度而且ie6的高度是会被撑开的,除非定义了overflow:hidden;

    [回复]

  7. 愚人码头留言于:2010年03月31日22:39

    @robertsky123
    使用_height=1%和使用_left不是一样是hack吗?他们有什么区别呢?使用_left还有个好处就是父级的padding还是存在,而使用_height=1%,父级的padding却失效了,而求父级的高度是被test-box撑开的,照理说test-box是脱离文档流的。

    [回复]

  8. robertsky123留言于:2010年04月01日13:12

    @愚人码头
    呵呵,受教了

    [回复]

  9. 杨柳青青留言于:2010年04月02日11:26

    最近模仿google的热图时,发现IE6下的一个问题:html中一元素如果是position:relative,其父元素是float定位,其祖父元素也是:position:relative时,当前元素就无法正常显示。不晓得是不是因为定位过于复杂而导致IE6无法正常定位;
    如果删除祖父元素的relative定位,或其父元素添加relative定位,即可正常显示。但这样的话,定位不是更复杂吗?父元素又是float又是relative定位。但ie6可以正常显示。不过这也导致用javascript的offsetleft获取绝对位置时出负值错误;

    希望这不是一个超低级的问题。

    [回复]

  10. 芝麻丸子留言于:2010年04月05日19:23

    俺用火狐看,,在放大的情况下严重溢出,。。

    [回复]

  11. 风影留言于:2010年04月08日16:11

    博主的 FF 是 4.0 版本?

    [回复]

    愚人码头 回复于:

    不是4.0,只是个皮肤,呵呵

    [回复]

  12. 酋长留言于:2010年04月12日18:09

    码头啊,多走一小步,你就离真相更近了,不多说,上代码:

    1
        内容区域

    [回复]

  13. 酋长留言于:2010年04月12日18:18

    晕哦,还不让上代码的哦,上网址吧:http://youhuata.com/labs/IE6_position_bug.html 我的理解是:IE6的盒模型在触发了layout的情况下和其他浏览器是一致的,另外触发layout不会像你说的那样导致padding消失,你可以看看我网址里的实际效果!

    [回复]

  14. 酋长留言于:2010年04月12日18:51

    进一步捣腾了一下,父级元素触发了layout并且内部只有absolute的子元素时,IE6会吃掉padding-top值,只保留padding-bottom值,我想这才是这个bug最根本的问题吧

    [回复]

  15. bluefire留言于:2010年04月13日14:52

    我看最好的解决方法是加宽度,虽然上下padding会合并,但是父元素里添加其他的内容后padding就正常了

    [回复]

  16. Rssee留言于:2010年04月14日15:11

    我也把代码复制下来测试一下,确实会这样,受教了!

    [回复]

  17. xmlovedoudou留言于:2010年05月05日00:17

    该问题的定位在ie6下只是在水平方向的内填充上有问题,顶部和底部没有定位问题。

    [回复]

  18. 凯瑟琳留言于:2010年05月06日10:02

    我也尝试了一把,在父级元素加一个height:1%也可以,或者只要触发他的hasylayout就行。

    [回复]

  19. fdming留言于:2010年05月23日09:28

    在里面层加个float:left;就可以了嘛!

    [回复]

  20. web前端寒风留言于:2010年08月09日13:33

    这个问题我也遇到过

    [回复]

  21. 留言于:2010年08月26日16:36

    要把一个定位属性为absolute的元素定位于其父元素中,满足两个条件:
    (1)设定top,right,bottom,left
    (2)父级设定position属性
    别人说的。。。

    是不是因为没有满条件1,所以才会显示出问题呢??

    [回复]

  22. peizhiwei留言于:2010年10月27日13:19

    这篇文章写得相当好!受教了,这么好的一网站我怎么今天才发现呢? 相逢恨晚 ……

    [回复]

  23. gafish留言于:2010年11月10日15:20

    找出个错别字,“比如这个父级容器是否(顶)宽定高等其他原因。”

    [回复]

    愚人码头 回复于:

    谢谢!

    [回复]

  24. xiongdan留言于:2010年12月24日10:52

    position:absolute定位在IE6下存在left和bottom的定位错误问题。

    解决办法有两种:1、给父层设置zoom:1触发layout。 2、给父层设置宽度(width)OR 高度(height)

    E6中很多Bug都可以通过触发layout得到解决,以上的解决方法无论是设置zoom:1还是设置width和height其实都是为了触发layout。

    [回复]

  25. sphinx留言于:2011年01月28日18:45

    加一个overflow:hidden;看看是否可以解决啊!

    [回复]

  26. highmind留言于:2011年05月20日14:12

    ie6的盒子模型貌似和其他的不一样,它的width和height貌似有border的值,请博主指教

    [回复]

  27. highmind留言于:2011年05月20日14:15

    博主请看这篇文章:http://hi.baidu.com/wnpers/blog/item/f1a5edb4cf5bb8638ad4b2c3.html
    关于ie6的盒子模型和w3c标准的盒子模型的区别

    [回复]

  28. highmind留言于:2011年05月20日14:27

    个人认为ie5.5的盒子模型确实和别的不一样,ie6貌似是没问题

    [回复]

  29. semdy留言于:2011年09月13日13:37

    我觉得这个问题楼主研究偏了,问题不是出在父层标签的padding上,而是出在父层标签宽度上,如果父标签里面的内容都是左浮动或右浮动的话,它的宽度会有所偏移,如果把它的宽度固定一个值或加上100%应该就会好了。我以前也出现过这个问题。
    以下代码是全兼容的,没有出现你所说的问题。

    *{ margin:0; padding:0; font-size:12px;}
    .box{ height:200px; border:1px solid green; padding-left:100px; margin:100px 0 0 100px; position:relative;}
    .sub{ position:absolute; left:2px; top:2px; width:200px; height:100px; border:1px solid red;}

    12313

    [回复]

  30. xiaoxia留言于:2011年10月24日22:13

    如果说一定要为这些奇怪的现象争论不休的话,请查证一些官方资料,其它中有一章节:IE浏览器的拥有布局正好说明了以上问题(其中布局只能是IE中的概念!!!)是这样定义的:那些称为拥有布局(have layout)的元素负责本身及其子元素的尺寸和定位。如果一个元素没有拥有布局,那么它的尺寸和定位由最近的拥有布局的祖先元素控制。而在IE中有些元素天生就有拥有布局的性质,而有的天生的属性便可以使用元素具有拥有布局,我们在处理bug时常见有这个东东*html{height:1%}想知道为什么吗?—>拥有布局

    [回复]

  31. xiaoxia留言于:2011年10月24日22:14

    我说的资料是

    [回复]

  32. xiaoxia留言于:2011年10月24日22:18

    我想我们通过IE浏览器的原有设计思想出发会觉得问题很简单,如果可能我们可以一起从这里讨论,就拿拥有布局来说,拥有布局的做法就是不给所有元素以布局的能力,有效的减少的浏览器性能的开销,难道这不是对的吗,呵呵,但IE有违的标准……

    [回复]

  33. maml留言于:2011年11月01日08:33

    我这ie6 怎么没有发现这个问题呢

    test box

    [回复]

发表评论

*

*