写点什么

CSS 中的各种格式化上下文 -FC(BFC、IFC、GFC、FFC)

作者:肥晨
  • 2023-04-14
    江苏
  • 本文字数:1837 字

    阅读完需:约 6 分钟

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 下的子元素不会继承父级容器的宽

发布于: 刚刚阅读数: 9
用户头像

肥晨

关注

还未添加个人签名 2021-04-15 加入

平台:InfoQ、阿里云、腾讯云、CSDN、掘金、博客园等平台创作者 领域:前端 公众号:农民工前端

评论

发布
暂无评论
CSS中的各种格式化上下文-FC(BFC、IFC、GFC、FFC)_css3_肥晨_InfoQ写作社区