CSS 中的各种格式化上下文 -FC(BFC、IFC、GFC、FFC)
## 什么是 FC?
FC 是 Formatting Context 的缩写,中文名:格式化上下文。是 W3C 在 CSS2.1 规范中的一个概念。
FC 是指页面中一篇渲染区域,渲染区域内使用的格式化上下文的渲染规则,决定了该区域以及其子元素如何定位。当然,使用同的渲染规则,也会对其他元素的起到相互关系的作用。
## 主要有哪些 FC?
主要的格式化上下文渲染规则一共有 4 种,分别是 BFC(块级格式化上下文)、IFC(行内格式化上下文)、GFC(网格布局格式化上下文)、FFC(自适应格式化上下文)。
4 种格式化上下文渲染规则,也是体现了 CSS 中不同的渲染规则。
## BFC
### 什么是 BFC
Block Formatting Context,块级格式化上下文,一个独立的块级渲染区域,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。
### BFC 的约束规则
内部的 BOX 会在垂直方向上一个接一个的放置;
垂直方向上的距离由 margin 决定。(完整的说法是:属于同一个 BFC 的俩个相邻的 BOX 的 margin 会发生重叠,与方向无关。)
每个元素的左外边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此。(这说明 BFC 中的子元素不会超出它的包含块,而 position 为 absolute 的元素可以超出它的包含块边界);
BFC 的区域不会与 float 的元素区域重叠;
计算 BFC 的高度时,浮动子元素也参与计算;
BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;
### BFC 的应用
防止 margin 发生重叠
防止发生因浮动导致的高度塌陷
### 怎么生成 BFC
float 的值不为 none;
overflow 的值不为 visible;
display 的值为 inline-block、table-cell、table-caption;
position 的值为 absolute 或 fixed;
display:table 也认为可以生成 BFC?其实是在于 Table 会默认生成一个匿名的 table-cell,正是这个匿名的 table-cell 生成了 BFC。
## IFC
### 什么是 IFC
IFC(Inline Formatting Contexts)直译为"行内格式化上下文",IFC 的 line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的 padding/margin 影响)
### IFC 有的特性
IFC 中的 line box 一般左右都贴紧整个 IFC,但是会因为 float 元素而扰乱。float 元素会位于 IFC 与与 line box 之间,使得 line box 宽度缩短。
IFC 中时不可能有块级元素的,当插入块级元素时(如 p 中插入 div)会产生两个匿名块与 div 分隔开,即产生两个 IFC,每个 IFC 对外表现为块级元素,与 div 垂直排列。
### IFC 的应用
水平居中:当一个块要在环境中水平居中时,设置其为 inline-block 则会在外层产生 IFC,通过 text-align 则可以使其水平居中。
垂直居中:创建一个 IFC,用其中一个元素撑开父元素的高度,然后设置其 vertical-align:middle,其他行内元素则可以在此父元素下垂直居中。
## GFC
### 什么是 GFC
GFC(GridLayout Formatting Contexts)直译为"网格布局格式化上下文",当为一个元素设置 display 值为 grid 的时候,此元素将会获得一个独立的渲染区域,我们可以通过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每一个网格项目(grid item)定义位置和空间。
### GFC 有的特性
GFC 将改变传统的布局模式,他将让布局从一维布局变成了二维布局。简单的说,有了 GFC 之后,布局不再局限于单个维度了。这个时候你要实现类似九宫格,拼图之类的布局效果显得格外的容易。
## FFC
### 什么是 FFC
FFC(Flex Formatting Contexts)直译为"自适应格式化上下文",display 值为 flex 或者 inline-flex 的元素将会生成自适应容器(flex container)。
### FFC 有的特性
Flex Box 由伸缩容器和伸缩项目组成。通过设置元素的 display 属性为 flex 或 inline-flex 可以得到一个伸缩容器。设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。
伸缩容器中的每一个子元素都是一个伸缩项目。伸缩项目可以是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。
### FFC 与 BFC 的区别
FFC 与 BFC 有点儿类似,但仍有以下几点区别:
Flexbox 不支持 ::first-line 和 ::first-letter 这两种伪元素
vertical-align 对 Flexbox 中的子元素 是没有效果的
float 和 clear 属性对 Flexbox 中的子元素是没有效果的,也不会使子元素脱离文档流(但是对 Flexbox 是有效果的!)
多栏布局(column-*) 在 Flexbox 中也是失效的,就是说我们不能使用多栏布局在 Flexbox 排列其下的子元素
Flexbox 下的子元素不会继承父级容器的宽
版权声明: 本文为 InfoQ 作者【肥晨】的原创文章。
原文链接:【http://xie.infoq.cn/article/99045d0031f53b314f06c92bb】。文章转载请联系作者。
评论