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/01fe6cf50c98f218c65ed1589】。文章转载请联系作者。
评论