FFC(Flex Formatting Context,弹性格式化上下文)是随着 Flexbox 布局模型引入的。它是为了解决 BFC 在复杂布局(特别是对齐、分配空间)上的局限性而诞生的。

1. 触发元素与子元素的相互影响

这是 FFC 最强大的地方。一旦开启 FFC,子元素(Flex Items)的行为会发生剧变:

  • 摆脱块级束缚: 子元素不再遵循“块级占一行、行内随流走”的规则。无论子元素原本是 <div> 还是 <span>,它们现在都统一成了 Flex Item
  • 外边距不塌陷: 在 FFC 内部,子元素之间的垂直外边距(Margin)永远不会发生塌陷
  • 空间分配: 父元素可以通过 flex-growflex-shrinkflex-basis 动态地拉伸或压缩子元素的尺寸,以填满或适应父容器的空间。
  • 轴线对齐: 父元素通过 justify-contentalign-items 控制子元素在主轴和交叉轴上的精确对齐。

2. 触发元素与兄弟元素的相互影响

FFC 在处理与“外部世界”的关系时,表现得非常像一个“加强版的 BFC”:

  • 独立性: FFC 容器是一个独立的布局单元。它内部的布局变化完全不会影响到外部的兄弟元素。
  • 避开浮动: 如果 FFC 容器(Flex Container)旁边有浮动元素,它会像 BFC 一样,根据自身的边界收缩或定位,而不会让内部内容重叠在浮动元素之下。
  • 清除浮动影响: FFC 容器可以自动包含内部所有的子元素(包括那些设置了浮动的子元素,尽管在 FFC 里给子元素设浮动通常是无效的)。

3. 特定格式化上下文的触发条件

FFC 的触发条件非常直接:

  • 核心触发: display: flexdisplay: inline-flex
  • 区别: * flex 让容器本身表现为块级盒子(占据整行)。
    • inline-flex 让容器本身表现为行内块盒子(宽度由内容决定,可以和其他行内元素并排)。

4. 边界与包含块

FFC 重新定义了包含块内部的空间逻辑:

  • 容器即边界: FFC 的边缘构成了内部子元素的绝对边界。子元素的所有对齐(如 centerspace-between)都是基于这个包含块的几何尺寸计算的。
  • 溢出处理: 如果子元素总和超过了 FFC 的边界,且没有设置 flex-wrap: wrap,子元素会根据 flex-shrink 自动收缩。如果依然放不下,则会溢出容器(除非设置了 overflow: hidden)。
  • 绝对定位受限: 如果 FFC 内部有绝对定位的子元素,其定位基准依然是这个 FFC 容器(前提是容器设置了 position: relative 等)。