BFC

1. 含义

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。

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

  • 根元素或包含根元素的元素
  • 浮动元素(元素的 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)。

块格式化上下文包含创建它的元素内部的所有内容.

块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。
– MDN 戳此查看

2. 应用

同一个 BFC 下外边距会发生折叠

前两个元素(1-1 1-2)位于同一个BFC内部,所以上边元素的 margin-bottom 与 下边元素的 margin-top 发生坍缩,坍缩的结果为最终的 margin 值是两者中的较大值.
后两个元素(2-1 3-1)位于不同BFC内部,所以没有发生坍缩,最终 margin 等于上边元素的 margin-bottom 加下边元素的 margin-top

包含浮动的元素(清除浮动)

上方容器Parent 1内元素浮动,脱离了文档流,所以容器只剩下 2px 的边距高度。如果使触发容器的 BFC,那么容器将会包裹着浮动元素(Parent 2)。

阻止元素被浮动元素覆盖

上边的布局是一个常见的图文混排的模版,但是有时候我们不需要这种布局,我们期望一个左右布局的页面,如下边的Demo展示的这种,就可以通过触发下面元素的 BFC 来实现。

这个方法来实现两列自适应布局,左边宽度固定,右边的内容自适应宽度(去掉上面右边内容的宽度)。

当然也可以用来实现多列布局,也是相当方便。

3. (*)FC

FC 即 Formatting Contexts,包含:IFC、BFC、GFC 与 FFC 。FC是网页CSS视觉渲染的一部分,用于决定盒子模型的布局、其子元素将如何定位以及和其他元素的关系和相互作用。
其中:IFC(Inline Formatting Contexts)与 BFC(Block Formatting Contexts)是 CSS2.1 规范中引进的;后面两个是 CSS3 新增规范,GFC(GridLayout Formatting Contexts)以及 FFC(Flex Formatting Context)。

关于这几个 FC 的具体区别可参考:https://github.com/chokcoco/iCSS/issues/5

参考链接

https://zhuanlan.zhihu.com/p/25321647
https://www.zhangxinxu.com/wordpress/2015/02/css-deep-understand-flow-bfc-column-two-auto-layout/
https://github.com/chokcoco/iCSS/issues/5