CSS--外边距合并的问题

外边距合并指的是,当两个垂直外边距相遇时,它们将造成一个外边距。 合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。css

首先看下W3C对于外边距合并的介绍:浏览器

外边距合并

简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将造成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。spa

  • 当一个元素出如今另外一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。请看下图:
    图片描述3d

  • 当一个元素包含在另外一个元素中时(假设没有内边距或边框把外边距分隔开),它们的上和/或下外边距也会发生合并。请看下图:
    图片描述
    尽管看上去有些奇怪,可是外边距甚至能够与自身发生合并。blog

  • 假设有一个空元素,它有外边距,可是没有边框或填充。在这种状况下,上外边距与下外边距就碰到了一块儿,它们会发生合并:
    图片描述继承

  • 若是这个外边距遇到另外一个元素的外边距,它还会发生合并:
    图片描述图片

    这就是一系列的段落元素占用空间很是小的缘由,由于它们的全部外边距都合并到一块儿,造成了一个小的外边距。文档


外边距合并初看上去可能有点奇怪,可是实际上,它是有意义的。以由几个段落组成的典型文本页面为例。第一个段落上面的空间等于段落的上外边距。若是没有外边距合并,后续全部段落之间的外边距都将是相邻上外边距和下外边距的和。这意味着段落之间的空间是页面顶部的两倍。若是发生外边距合并,段落之间的上外边距和下外边距就合并在一块儿,这样各处的距离就一致了。
图片描述it

注释: 只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。在css2.1中,水平的margin不会被折叠。io

垂直margin可能在一些盒模型中被折叠:

  1. 在常规文档流中,2个或以上的块级盒模型相邻的垂直margin会被折叠。
    最终的margin值计算方法以下:

    • 所有都为正值,取最大者;

    • 不全是正值,则都取绝对值,而后用正值减去最大值;

    • 没有正值,则都取绝对值,而后用0减去最大值。
      注意:相邻的盒模型可能由DOM元素动态产生并无相邻或继承关系。

  2. 相邻的盒模型中,若是其中的一个是浮动的(floated),垂直margin不会被折叠,甚至一个浮动的盒模型和它的子元素之间也是这样。

  3. 设置了overflow属性的元素和它的子元素之间的margin不会被折叠(overflow取值为visible除外)。

  4. 设置了绝对定位(position:absolute)的盒模型,垂直margin不会被折叠,甚至和他们的子元素之间也是同样。

  5. 设置了display:inline-block的元素,垂直margin不会被折叠,甚至和他们的子元素之间也是同样。

  6. 若是一个盒模型的上下margin相邻,这时它的margin可能折叠覆盖(collapse through)它。在这种状况下,元素的位置(position)取决于它的相邻元素的margin是否被折叠。

    • 若是元素的margin和它的父元素的margin-top折叠在一块儿,盒模型border-top的边界定义和它的父元素相同。

    • 另外,任意元素的父元素不参与margin的折叠,或者说只有父元素的margin-bottom是参与计算的。若是元素的border-top非零,那么元素的border-top边界位置和原来同样。
      一个应用了清除操做的元素的margin-top毫不会和它的块级父元素的margin-bottom折叠。

    注意,那些已经被折叠覆盖的元素的位置对其余已经被折叠的元素的位置没有任何影响;只有在对这些元素的子元素定位时,border-top边界位置才是必需的。

  7. 根元素的垂直margin不会被折叠。

  • 浮动的块级元素的margin-bottom老是与它后面的浮动块级兄弟元素(floated next in-flow block-level sibling)的margin-top相邻,除非那个同级元素使用了清除操做。

  • 浮动的块级元素的margin-top和它的第一个浮动块级子元素(floated first in-flow block-level child)的margin-top相邻(若是该元素没有border-top,没有padding-top,而且子元素没有使用清除操做)。

  • 浮动的块级元素的margin-bottom若是符合下列条件,那么它和它的最后一个浮动块级子元素的margin-bottom相邻(若是该元素没有指定padding-bottom或border):

  • 若是一个元素的min-height属性设置为0,那么它所拥有的margin是相邻的,而且它既没有border-top和border- bottom,也没有padding-top和padding-bottom,它的height属性能够是0或auto,它不能包含一个内联的盒模型 (line box),它全部的浮动子元素(若是有的话)的margin也都是相邻的。

  • 当一个元素拥有的margin折叠了,而且它使用了清除操做,那么它的margin-top会和紧随其后的兄弟元素的相邻margin折叠,但结果是它的margin将没法和其块级父元素的margin-bottom折叠。

  • 折叠操做是以padding、margin、border的值为基础的(即在浏览器解析全部这些值以后),折叠后的margin计算将覆盖已使用的不一样margin的值。

相关文章
相关标签/搜索