Formatting Context,格式化上下文,指页面中一个渲染区域,拥有一套渲染规则,它决定了其子元素如何定位,以及与其余元素的相互关系和做用。布局
Block Formatting Context,块级格式化上下文,一个独立的块级渲染区域,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。flex
display:table也认为能够生成BFC?实际上是在于Table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC。orm
IFC(Inline Formatting Contexts)直译为"行内格式化上下文",IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)继承
IFC中的line box通常左右都贴紧整个IFC,可是会由于float元素而扰乱。float元素会位于IFC与与line box之间,使得line box宽度缩短。文档
IFC中时不可能有块级元素的,当插入块级元素时(如p中插入div)会产生两个匿名块与div分隔开,即产生两个IFC,每一个IFC对外表现为块级元素,与div垂直排列。it
水平居中:当一个块要在环境中水平居中时,设置其为inline-block则会在外层产生IFC,经过text-align则可使其水平居中。io
垂直居中:建立一个IFC,用其中一个元素撑开父元素的高度,而后设置其vertical-align:middle,其余行内元素则能够在此父元素下垂直居中。table
GFC(GridLayout Formatting Contexts)直译为"网格布局格式化上下文",当为一个元素设置display值为grid的时候,此元素将会得到一个独立的渲染区域,咱们能够经过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每个网格项目(grid item)定义位置和空间。容器
GFC将改变传统的布局模式,他将让布局从一维布局变成了二维布局。简单的说,有了GFC以后,布局再也不局限于单个维度了。这个时候你要实现相似九宫格,拼图之类的布局效果显得格外的容易。bfc
FFC(Flex Formatting Contexts)直译为"自适应格式化上下文",display值为flex或者inline-flex的元素将会生成自适应容器(flex container)。
Flex Box 由伸缩容器和伸缩项目组成。经过设置元素的 display 属性为 flex 或 inline-flex 能够获得一个伸缩容器。设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。
伸缩容器中的每个子元素都是一个伸缩项目。伸缩项目能够是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。
FFC与BFC有点儿相似,但仍有如下几点区别:
Flexbox 不支持 ::first-line 和 ::first-letter 这两种伪元素
vertical-align 对 Flexbox 中的子元素 是没有效果的
float 和 clear 属性对 Flexbox 中的子元素是没有效果的,也不会使子元素脱离文档流(可是对Flexbox 是有效果的!)
多栏布局(column-*) 在 Flexbox 中也是失效的,就是说咱们不能使用多栏布局在Flexbox 排列其下的子元素
Flexbox 下的子元素不会继承父级容器的宽