CSS 文档流
流 Flow
流实际上是 CSS 中的一种基本的定位和布局机制,流和现实世界的水流有异曲同工的表现。CSS 世界的“流”似乎就是按照现实世界的“水流”创造的。
CSS 世界构建的基石是 HTML,而 HTML 最具代表的两个基石 <div>
和 <span>
正好是 CSS 世界中 block-level 和 inline-level 的代表,它们对应的正是 图中的盛水容器中的水和木头。

所谓“流”,就是 CSS 世界中引导元素排列和定位的一条看不见的“水流”。
文档流
文档流(Normal Flow, 也有翻译成 普通流
, 常规流
)中的盒肯定属于某一个格式化上下文(Formatting Context),可能是 BFC 和 IFC ,但不能两者都是。
简单点说,把格式化上下文看成是决定盒子详细排列布局的方案,盒子怎么排的。有两种方案,BFC 和 IFC ,每一种排列方案有其各自的规则和特点。
那么有一个疑问,我们不是有 block box 和 inline box 吗,它也规定了 box 的位置排列,一行一行排还是在一行里面一列一列排,那 BFC/IFC 又是什么鬼?
你要知道,总有一些 box 很独秀,就像人类中总有一些人异于常人。像浮动的盒子、绝对定位的盒子、inline-block、flex 这些盒子,就是盒子中比较特殊的盒子。OK,那这些盒子的出现就不能用 block box 和 inline box 的特性来简简单单定义了,我们为它们做了一个新的划分,划分为 BFC 和 IFC 两大类,在原来的 block box 和 inline box 的基础上,再结合那些特殊的 box,定义了一些新的计算高度、margin、位置排列等的一些规范。个人感觉其实 BFC 是主要的成因(因为这些特殊的盒子基本上都在 BFC 规范中),IFC 是一种相对比较被动的存在,更多地是配合 BFC。
另外注意规范中说的是:
Boxes in the normal flow belong to a formatting context, which may be block or inline, but not both simultaneously.
文档流中的盒肯定属于某一个格式化上下文,但并不代表脱离文档流的盒子不属于某一个格式化上下文,比如浮动盒子和绝对定位的盒子,它们属于 BFC。
BFC
BFC(Block Formatting Context) 即块格式化上下文,是一种虚拟概念,可以理解称创建一个 BFC 就会产生一个“结界”,形成了一个封闭的空间,里面的人出不去,外面 的人进不来,具有极强的防御力。
不是每一个 block box 都会创建一个 BFC,创建 BFC 的也不一定是 block box。不要以 block box 来看待 BFC 中的 B,这在 CSS 规范中解释了这个 B 指的是 block-level box('block', 'list-item', and 'table'),但 block-level box 并不仅仅指 block box,说得再简单一点:
- BFC 的 B 不等于 block box,而是 block-level box('block', 'list-item', and 'table')
- 只要创建了 BFC,该 box 就可以设置宽高和 margin 等,毕竟要遵守 BFC 的规则。为了遵守规则,之前的 display 会按照如下表格转化成 block-level box。这也解释了为什么 float 和绝对定位的 inline box 都可以设置宽高和 margin。
- inline-block 的元素。
Specified value | Computed value |
---|---|
inline-table | table |
inline, table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row, table-cell, table-caption, inline-block | block |
其它 | 与指定值相同 |
BFC 规则规定了在该 BFC 中 boxes(包括:浮动的 box,绝对定位的 box,block coantainer box 以及其他 block box)排列布局方式,它在计算盒子高度,margin 值计算等地方有区别于其他环境。
- 清除浮动:由于 BFC 改变了正常 box 的宽高计算规则,所以它可以用来清除浮动。
- 去除父子 margin 重叠:BFC 元素是不会发生 margin 重叠的,因为 margin 重叠会影响外面元素。
- 自适应布局:实现更健壮、更智能的自适应布局。