English  中文

CSS 视觉格式化模型

W3C: http://www.ayqy.net/doc/css2-1/visuren.html
MDN: https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model

图示

块级盒

(匿名) 块盒

块容器盒

原子行内级盒

行内级盒

(匿名) 行内盒

内容参与父容器的
行内格式化上下文

display { block | list-item | table }

块级替换元素, 表格元素

创建: 块级格式化上下文 (BFC)

创建: 行内格式化上下文 (IFC)

非替换行内块, 非替换表格单元

行内级替换元素, 行内表格元素

display { inline | inline-block | inline-table }

非替换行内元素


BFC
块容器盒
块盒
块级盒
or
块容器盒
BFC
块盒
块级盒
匿名块盒
IFC
行内级盒
or
块容器盒
IFC
浮动盒
BFC
行盒
行内盒
原子行内级盒
匿名行内盒




Case 1: 块级元素 in 行内级元素

[W3C] 当行内盒包含流内块级盒时,该行内盒(及与它处于同一行盒里的行内祖先)会打破周围的块级盒(以及任何连续的或只被可合并的空白符和/或流外元素隔开的块级兄弟),把行内盒分成两个盒(即使有一边是空的),分别位于块级盒的两边。拆分前的行盒与拆分后的行盒都被包进匿名块盒,并且该块级盒作为这些匿名盒的兄弟。

  <span>
    <span>行内级元素</span>
    <p>块级元素</p>
    Inline Text
  </span>
行内级元素

块级元素

Inline Text
as
行内盒
IFC
行盒
行内盒
块级盒
匿名行内盒
↓↓↓
BFC
匿名块盒
行内盒
IFC
行盒
行内盒
块级盒
匿名块盒
行内盒
IFC
行盒
匿名行内盒



Case 2: float vs display:inline-block

[W3C] 然而,挨着浮动(盒)创建的当前及后续的行盒,会根据需要被缩短,以便给浮动(盒)的外边距框让出空间。

  <div>
    <span style="float: left;">浮动盒</span>
    <p style="display: inline-block;">原子行内级盒</p>
  </div>
浮动盒

原子行内级盒
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur quas quisquam beatae illo, sit aliquid. Debitis architecto distinctio perspiciatis commodi!

浮动盒
Lorem ipsum dolor sit amet commodi!

原子行内级盒

as
块盒
BFC
匿名块盒
IFC
行内盒
块盒
IFC
匿名行内盒
↓↓↓
块盒
IFC
浮动盒
BFC
匿名块盒
IFC
匿名行内盒
行盒
原子行内级盒
BFC
匿名块盒
IFC
匿名行内盒



Case 3: float vs overflow:hidden

[W3C] 表格、块级替换元素或常规流中建立了新的块格式化上下文的元素(例如一个’overflow’不为’visible’的元素)不能和与元素自身处于同一块格式化上下文中的任何浮动(盒)的外边距框重叠。

  <div>
    <span style="float: left;">浮动元素</span>
    <p style="overflow: hidden;">块级元素</p>
  </div>
浮动元素

块级元素
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur quas quisquam beatae illo, sit aliquid. Debitis architecto distinctio perspiciatis commodi!

浮动元素
Lorem ipsum dolor sit amet commodi!

块级元素

as
块盒
BFC
匿名块盒
IFC
行内盒
块盒
IFC
匿名行内盒
↓↓↓
块盒
BFC
浮动盒
BFC
匿名块盒
IFC
匿名行内盒
块盒
BFC
匿名块盒
IFC
匿名行内盒





块级元素 [MDN]

行内级元素 [MDN]




块级盒 [W3C]

参与块级格式化上下文

1. 块盒

块级盒 ∩ 块容器盒

2. 匿名块盒
3. 块容器盒

只包含块级盒 或 只包含行内级盒


行内级盒 [W3C]

1. 行内盒

其内容参与父容器的行内格式化上下文 (IFC)

2. 匿名行内盒
3. 原子行内级盒

其内容参与父容器的行内格式化上下文 (IFC)




块级格式化上下文 [W3C, MDN]

规则

条件

将为其内容创建新的 BFC


行内格式化上下文 [W3C]

规则

行盒

包含来自同一行的盒的矩形区域