前面我们已经学习了盒模型(box model),知道了元素会被渲染成一个个盒子。那么这些盒子在屏幕上的位置又是怎么放置的呢?这就是我们现在要学习的——CSS 视觉格式化模型(visual formatting model)。视觉格式化模型是 CSS 布局的一个基础理论体系,需要你有一定的 CSS 功底,所以一时半会是很难掌握的,但是只要你一掌握,对于 CSS 布局就会豁然开朗。(建议整个 CSS 布局学完后再重新细读深入下。)
盒子的位置摆放
默认情况下,盒子按照元素在 HTML 中的先后位置从左至右自上而下一个接着一个排列摆放。如下图:
在图中我们可以看到,有些元素的盒子被渲染为完整的一行,如h1、p、div;而有些元素的盒子则被渲染为水平排列,直到该行被占满然后换行,如span、a、strong。
这是因为不同的盒子使用的是不同的格式化上下文(formatting context)来布局,每个格式化上下文都拥有一套不同的渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。(就如我们参加结婚喜宴一样,有父母长辈席,好友席,同事席,甚至前男/女朋友席等,不同的身份坐到对应位置即可。)
格式化上下文(formatting context)
我们常见的两个格式化上下文分别为:块格式化上下文(block formatting context 简称 BFC)和行内格式化上下文(inline formatting context 简称 IFC)
BFC
块级盒(block-level boxes)
当元素的 CSS 属性 display 的计算值为 block,list-item,table,flex 或 grid 时,它是块级元素。视觉上呈现为块,竖直排列。典型的如 <div>
元素,<p>
元素等都是块级元素。
每个块级元素至少生成一个块级盒,称为主要块级盒(principal block-level box)。一些元素,比如<li>
,生成额外的盒来放置项目符号,不过多数元素只生成一个主要块级盒。
块级盒参与 BFC,被渲染为完整的一个新行。
渲染规则
默认根元素(html 元素)会创建一个 BFC,其块级盒子元素将会按照如下规则进行渲染:
- 块级盒会在垂直方向,一个接一个地放置,