天天看点

BFC / 外边距折叠

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

块格式化上下文(Block Formatting Context),它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用

当涉及到可视化布局的时候,BFC提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。

一个环境中的元素不会影响到其它环境中的布局。比如浮动元素会形成BFC,浮动元素内部子元素的主要受该浮动元素影响,两个浮动元素之间是互不影响的。

下列方式会创建块格式化上下文:

  • 根元素或包含根元素的元素
  • 浮动元素(元素的 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),有时也翻译为外边距合并。注意浮动元素和绝对定位元素的外边距不会折叠。

可以看到, 需要满足以下条件:

  • 块级元素 ( 特意写出来, 是因为要注意 inline-block 有块级元素的一部分特性, 但属于行内元素 - MDN行内元素列表 )
  • 非浮动元素
  • 非绝对定位元素
  • 上下外边距折叠 (也就是说左右是不会折叠的)
  • 相邻, 也就是可以是兄弟, 也可以是父子

所以这里又有一个分类,也就是外边距折叠有两个细分:

  1. 兄弟折叠: 相邻兄弟元素外边距折叠
  2. 父子折叠: 父子外边距折叠

那怎么消除外边距折叠呢?

  • 浮动
  • inline-block
  • 绝对定位
  • 创建BFC

这里要注意:

创建BFC,消除的是父子折叠, 兄弟折叠可不一定, 如overflow:hidden, display:flex等等, 仍会与相邻兄弟发生折叠

创建BFC的方式有非常多种,而浮动元素、inline-block 元素、绝对定位元素, 只是其中的三种, 这三种恰好又是用于消除外边距折叠的方式, 所以,

消除外边距折叠,有创建BFC这个方法,这种方法消除的是父子折叠, 但反过来, 不能说创建了BFC一定能消除外边距折叠

,也就是说,

消除折叠的方法, 是创建BFC方法的子集

上一篇: 了解BFC