• 子元素应该margin-top为何会影响父元素【转】


    这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事,居然是CSS2.1盒模型规范……虽然很别扭,非常别扭的规定。   问题如下图,两层Div结构,Outer Div属性为“margin:0 auto”,本该紧贴外框顶部的,如果没有Inner Div,或者没有Inner Div的“margin-top”属性,一切如预期。但是当Inner Div设置了“margin-top:10px”之后,它的父元素Outer Div也被撑出来一个本不该有的“margin-top:10px”效果。


    Inner Div [margin-top: 10px]

    Outer Div [margin: 0 auto]

     HTML Demo Area

     这个“问题”……它是CSS2.1的盒模型中规定的内容——Collapsing margins

    In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin. 所有毗邻的两个或更多盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级或者嵌套的盒元素,并且它们之间没有非空内容、Padding或Border分隔。

      这就是原因了。“嵌套”的盒元素也算“毗邻”,也会 Collapsing Margins。这个合并Margin其实很常见,就是文章段落元素<p/>,并列很多个的时候,每一个都有上下1em的margin,但相邻的<p/>之间只会显示1em的间隔而不是相加的2em。这个很好理解,我就是奇怪为什么W3C要让嵌套的元素也共享Margin,想不出来在什么情况下需要这样的表现。   这个问题的避免方法很多,只要破坏它出现的条件就行。给 Outer Div 加上 padding/border,或者给 Outer Div / Inner Div 设置为 float/position:absolute(CSS2.1规定浮动元素和绝对定位元素不参与Margin折叠)。   更多信息,关于不同值的margin折叠后表现的计算方法等等,可自行查阅W3C的CSS2.1规范:Collapsing margins

    http://blog.csdn.net/duran1986/article/details/6930967

     html部分代码

    <body>
    <div  class="div1">
    <div class="div2"></div>
    </div>
    </body>

    出问题的代码

            html,html body {
                margin: 0;
                padding: 0;
                border: 0;
            }
            .div1 {
                height: 100px;
                background-color: red;
            }
    
            .div2 {
                height: 20px;
                background-color: green;
                margin-top: 80px;
            }

    已经解决问题的代码

            html,html body {
                margin: 0;
                padding: 0;
                border: 0;
            }
            .div1 {
                height: 100px;
                background-color: red;
                position: absolute;
                width: 100%;
            }
    
            .div2 {
                height: 20px;
                background-color: green;
                margin-top: 80px;
                width: 100%;
            }
  • 相关阅读:
    Bootstrap标签(label)的使用
    Docker学习(二)
    linux 的tee命令
    解决 Docker pull 出现的net/http: TLS handshake timeout 的一个办法
    win 10 安装.msi 程序出现the error code is 2503
    Kbuntu16.04利用快捷键调用终端Konsole
    ubuntu上swift开发学习2
    ubuntu上swift开发学习1
    Linux中常用文件传输命令及使用方法
    Kbuntu16.04添加工作空间
  • 原文地址:https://www.cnblogs.com/sexintercourse/p/5668389.html
Copyright © 2020-2023  润新知