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