外边距合并

首先理解什么是块格式化上下文

块格式化上下文(Block Formatting Context,BFC)

是Web页面的可视化CSS渲染的一部分,是布局过程当中生成块级盒子的区域,也是浮动元素与其余元素的交互限定区域。html

下列方式会建立块格式化上下文:布局

根元素或包含根元素的元素flex

  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • 行内块元素(元素的 display 为 inline-block)
  • 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)
  • 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
  • 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table)
  • overflow 值不为 visible 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layout、content或 strict 的元素
  • 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
  • 网格元素(display为 grid 或 inline-grid 元素的直接子元素)
  • 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
  • column-span 为 all 的元素始终会建立一个新的BFC,即便该元素没有包裹在一个多列容器中(标准变动,Chrome bug)。

外边距合并

块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并spa

相邻元素之间

毗邻的两个元素之间的外边距会折叠(除非后一个元素须要清除以前的浮动)。翻译

父元素与其第一个或最后一个子元素之间

若是在父元素与其第一个子元素之间不存在边框、内边距、行内内容,也没有建立块格式化上下文、或者清除浮动将二者的 margin-top 分开;或者在父元素与其最后一个子元素之间不存在边框、内边距、行内内容、height、min-height、max-height将二者的 margin-bottom 分开,那么这两对外边距之间会产生折叠。此时子元素的外边距会“溢出”到父元素的外面。3d

空的块级元素

若是一个块级元素中不包含任何内容,而且在其 margin-top 与 margin-bottom 之间没有边框、内边距、行内内容、height、min-height 将二者分开,则该元素的上下外边距会折叠。code

一些须要注意的地方:orm

  • 上述状况的组合会产生更复杂的外边距折叠。
  • 即便某一外边距为0,这些规则仍然适用。所以就算父元素的外边距是0,第一个或最后一个子元素的外边距仍然会“溢出”到父元素的外面。
  • 若是参与折叠的外边距中包含负值,折叠后的外边距的值为最大的正边距与最小的负边距(即绝对值最大的负边距)的和。
  • 若是全部参与折叠的外边距都为负,折叠后的外边距的值为最小的负边距的值。这一规则适用于相邻元素和嵌套元素。
父元素与其第一个或最后一个子元素之间

是指没有被非空内容、padding、border 或 clear 分隔开,说明其位置关系。cdn

注意一点,在没有被分隔开的状况下,一个元素的 margin-top 会和它普通流中的第一个子元素(非浮动元素等)的 margin-top 相邻; 只有在一个元素的 height 是 "auto" 的状况下,它的 margin-bottom 才会和它普通流中的最后一个子元素(非浮动元素等)的 margin-bottom 相邻。htm

<div style="border:1px solid red; width:100px;height: 200px;">
    <div style="background-color:green; width:50px; margin: 0 auto;">
       <div style="margin-top:100px; ">
         <div style="height: 50px"></div>
       </div>
    </div>
</div>
复制代码

效果如图

更改成建立块格式化上下文之后

<div style="border:1px solid red; width:100px;height: 200px;">
    <div style="background-color:green; width:50px; margin: 0 auto;display: inline-block;">
       <div style="margin-top:100px; ">
         <div style="height: 50px"></div>
       </div>
    </div>
</div>
复制代码

相关文章
相关标签/搜索