学习BFC前首先了解一下Box、Formatting Context的概念
Box:CSS布局的基本单位。
Box是CSS布局的对象和基本单位,直观点来说,就是一个页面是由很多个Box组成的。
元素的类型和display属性,决定了这个Box的类型,不同类型的Box,会参与不同的Formatting Context(一个决定如何渲染文档的容器)
因此,Box内的元素会以不同的方式渲染。
有哪些盒子? block-level box: display:block list-item table 参与:BFC inline-level box: display:inline inline-block inline-table 参与:IFC
Formatting Context
Formatting Context 是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素如何定位,以及和其他元素的关系和相互作用。 最常见的Formatting Context 有 BLock Formatting Context (简称BFC) Inline Formatting Context (简称IFC)
BFC
Block Formatting Context直译为“块级格式化上下文”,是一个独立的渲染区域,只有block-level box参与,它规定了内部的block-level box如何布局,并且与这个区域外部毫不相干。
简单的来说,BFC就是一个容器,管理块级元素
BFC布局规则:
- 内部的Box会在垂直方向,一个接一个放着;
- BFC的区域不会与float box区域重叠;(可以用来 两列布局 )
- 内部Box的垂直方向的距离由margin决定,属于同一个BFC的额两个相邻Box的margin会发生重叠;
- 计算BFC的高度时,浮动元素也参与计算
- BFC就是页面上的一个隔离的独立容器,在容器里面的子元素不会影响到外面的元素
BFC什么时候出现(那些元素会生成BFC?)
- 根元素或包含根元素的元素 (
html就是) 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,即使该元素没有包裹在一个多列容器中