Collapsing margins(外边距合并)

开篇

块元素的上边距或下边距有时会合并为一个margin,这种情况称之为外边距的合并,即collapsing margins.

一个常见的css样式的bug

html&css:

<!DOCTYPE html>
<html>
    <style type="text/css">
        html, body{
            width: 100%;
            height: 100%;
            padding: 0;
            margin: 0;
        }
        #main {
            width: 200px;
            height: 200px;
            background: yellow;
        }
        #sub {
            color: #fff;
            width: 200px;
            padding: 0;
            margin: 0;
            margin-top: 20px;
            background: black;
        }
    </style>
<body>
    <div id="main">
        <div id="sub">this is sub block</div>
    </div>
</body>
</html>

效果:

上图中父div包裹着子div,css的样式很明显想让子div与父容器有20px的margin-top,可是很不幸,父div和子div上边距重合了,而且莫名其妙的与body有了20px的上边距(body为白色背景区域)。

这个bug很常见,也经常被大家忽略,但是它却揭示了一个很重要的概念,即外边距合并(Collapsing margins),想要彻底解决这个问题(当然了,你随便在chrome里修修改改也可以调好,但你懂真正的原因吗?),还是得看W3C的官方规范,为了易于阅读,我截取了一段源自MDN的翻译:

外边距合并发生在下面三种基本情形:

  • 1.毗邻元素Adjacent siblings

    毗邻元素的外边距会合并(当靠后的元素 清除浮动 时除外)。

  • 2.毗邻元素Adjacent siblings

    如果块元素的 margin-top 与它的第一个子元素之间没有border, padding, inline content, 或 clearance 分隔,或者块元素的 margin-bottom 与它的最后一个子元素之间没有padding, inline content, height, min-height, or max-height 分隔,那么外边距会合并。

  • 3.空块元素

    如果块元素 margin-top 与 margin-bottom 之间没有border, padding, inline content, height, 与min-height来分隔, 那么它的上下外边距合并。

可以看到,上面的bug属于情况2,即只要为主div设置padding即可解决(或border等,视具体情况而论)。

Blog同步

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-05 19:03:45

Collapsing margins(外边距合并)的相关文章

CSS外边距合并(折叠)问题。

CSS外边距合并 块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大值,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并.注意浮动元素和绝对定位元素的外边距不会折叠. 下面列出了会发生外边距折叠的三种基本情况: 相邻元素之间 毗邻的两个元素之间的外边距会折叠(除非后一个元素需要清除之前的浮动). 父元素与其第一个或最后一个子元素之间 如果在父元素与其第一个子元素之间不存在边框.内边距.行内内容,也没有创建块格式化上下文.或者清除浮

[ css 外边距 margin ] css中margin外边距合并问题讲解及实例演示

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距;合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 外边距合并外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并.请看下图: CSS 外边距合并实例 1 亲自试一试

margin外边距合并详解

margin外边距合并详解: 外边距合并现象在网页布局中非常的常见,必须对此有明确的把我,以此做到未雨绸缪,否则可能影响工作效率,甚至严重阻碍项目的进度.在网络上已经有大量的相关文章,下面再通过实例结合对网络教材的总结,再来介绍一下外边距合并现象. 概念: 相邻的两个或者多个外边距在垂直方向上合并成一个外边距,这就是所谓的外边距合并. 水平方向不存在此现象. 外边距合并产生条件: 1.相邻的外边距之间没有非空内容.padding和border和clear分隔. 2.对象都处于文档流中,即非浮动和

CSS框模型(框模型概述、内边距、边框、外边距、外边距合并)

CSS 框模型概述 CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边距.边框 和 外边距 的方式. 元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素. 内边距.边框和外边距都是可选的,默认值是零.但是,许多元素将由用户代理样式表设置外边距和内边距.可以通过将元素的 margin 和 padding 设置为零来覆盖这些浏览器样式.这可以分别进行,也可以使用通用选择

CSS中的外边距合并问题

w3school中给出的合并定义为:         外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.         合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者. 此处的“垂直外边距”一词,个人认为不太容易理解. 因为从网页上看来,top margin与bottom margin是平行的,left margin与right margin是平行的,又何来合并一说? 但其所谓的“垂直”,可直接理解为上下两个外边距(此处为个人理解). 因为就其实际合并情况考虑,只有

CSS 外边距合并。

<div id = "parent"> <div id = "child"> demo </div> </div> #parent { background: red; width: 200px; height: 200px; } #child { background: green; width: 50px; height: 50px; margin-top: 50px; } child的margin-top传递到了

外边距合并现象

外边距(外填充)合并现象: 定义:外边距合并指的是,当两个垂直外边距相遇时,它们将合并形成一个外边距. 1.两个层是上下排列关系的时候: ? 当一个元素包含在另一个元素中时(假设没有内边距或边框把外边距分隔开),它们的两个上和下外边距也会发生合并.请看下图: ? 注释:只有普通文档流中块框的垂直外边距才会发生外边距合并.行内框.浮动框或绝对定位之间的外边距不会合并. 举例: 在垂直方向看,当给两个层(div1,div2)设置外边距, 比如:margin-top的时候,(div1:20px,div

CSS基础学习十五:盒子模型补充之外边距合并

今天继续接着CSS盒子模型补充,CSS基础学习十三:盒子模型和CSS基础学习十四:盒子模型补充之display属 性设置都是介绍了盒子模型中的内容概括.开始今天的主题:外边距合并. 外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合 并的外边距的高度中的较大者. (1)外边距合并 外边距合并叠加是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外 边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的

文本溢出、垂直外边距合并、BFC、hasLayout

今天学习文本溢出,又遇到了一些小问题,先上图: 关于文本溢出推荐:http://www.cnblogs.com/yzg1/p/5089534.html 从里面学习到单行文本和多行文本溢出, overflow:hidden;text-overflow: ellipsis是基本.然后在控制多行文本溢出的时候需要用到弹性伸缩盒子-webkit-box ,包括设置盒子的伸缩方向和显示的行数. 用div内嵌div做一个小测试:发现对子元素,margin-left有效但是margin-top是无效的,问题的