开发者社区> 问答> 正文

IE 6 7 下子元素传递给父元素

IE 6 7 下子元素的margin-top为什么会传递给父元素?
screenshot

展开
收起
杨冬芳 2016-06-15 11:40:39 2077 0
1 条回答
写回答
取消 提交回答
  • IT从业

    兼容性1:浏览器默认样式

    IE6/7的body之上默认有margin(body { margin: 15px 10px; },同时和其他浏览器不太一样(一般是margin: 8px),见这里)。

    这其中差了14px,用例看上去像是发生了margin-top传递,但实则不是。
    (如果我没有记错,margin传递一般发生在inline-block中,它可以给把自己的margin-top传递给它的包含块)

    我在用例中多做了一个reset:html, body { margin: 0; padding: 0 ; }。测试表明,在各个浏览器中,父元素的margin-top是一致的。见:http://jsfiddle.net/x7DY3/15/show

    兼容性2:padding-top和margin折叠的布局bug

    另外一个问题是:IE6/7下,#parent之上的padding-top设置的表现就像是和子元素的margin-top折叠了一样。

    可以做一个实验查看问题的表现:增大父容器的padding-top/增大子元素的margin-top。

    见:http://jsfiddle.net/x7DY3/21/show/

    我掌握的资料中(W3CHelp,wiki,知识库)没有查到根本原因。
    实际使用中,父子元素同时通过padding/margin表达留白的需求很罕见(常见方案1:父元素overflow:hidden; *zoom: 1,子元素margin;常见方案2,父元素padding),这里暂不深究了。

    对于offsetTop的兼容性,quirksmode给出一个结论在此:

    When calculating offsetTop, IE5-7 does not count elements with position: relative as offsetParents, and moves on to the next offsetParent in the chain. offsetLeft is calculated correctly.

    但就我们这个用例来说,这个CSSOM并没有按照它所说的,offsetTop计算基于body(用例中的next offsetParent,也就是body)的偏差。
    由于这个CSSOM忠实地反映了布局上的bug,问题还是出在布局上。

    P.S. 对于offsetTop和offsetLeft值,IE8返回的是30px。

    2019-07-17 19:39:01
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载