FC(formatting context)是CSS规范中的一个概念,指的是页面布局中的一块渲染区域,在这块区域内有一套渲染规则,用来决定其子元素如何布局,以及与其余元素之间的关系和相互做用。普通流中的每一个盒子都会参与到一个FC中,多是BFC,也多是IFC,但不可能便是BFC又是IFC。css
CSS2定义了两种FC类型:BFC(Block formatting context)和IFC(Inline formatting context)。html
CSS3中又新增了两种:GFC(grid formatting context)和FFC(flex formatting context)。浏览器
只有block-level元素参与的渲染区域,BFC规定并管理内部block-level元素的布局方式。ide
BFC内的盒子均沿着垂直方向逐个排列。布局
BFC内盒子之间的垂直距离由margin属性决定,垂直方向上直接相邻的margin会发生塌陷/合并(不存在padding和border),而且以最大的margin值做为最终的margin值。flex
父子元素ui
<div style="display:inline-block; border: 1px dotted black;">
<div style="margin: 10px;">
<div style="margin: 15px; width: 100px; height: 50px; background-color: blue;"></div>
</div>
</div>
复制代码
兄弟元素spa
<div style="border:1px solid black; width: 100px;">
<div style="margin: 10px; height: 50px; background-color: blue;"></div>
<div style="margin: 5px; height: 20px; background-color: blue;"></div>
</div>
复制代码
空盒子3d
<div style="border: 1px solid black; width: 200px;">
<div style="margin: 10px;"></div>
</div>
复制代码
BFC内盒子的左外边缘都会接触包含块的左边缘(若是从右到左进行排版,那么右边发生接触),即便存在浮动盒子也是如此。code
BFC的内容不会与浮动元素发生重叠,且浮动元素也会参与BFC的高度计算。
BFC是一个隔离的独立容器,容器里面的子元素不会影响外面的元素,反过来也同样。
<html>
知足上述任一条件便可在其内部产生BFC。(更多详细的可参考MDN文档)
根据BFC布局规则: 同一个BFC内相邻盒子之间的外边距会发生合并。
建立新的BFC,不属于同一个BFC的盒子不会出现外边距合并。
<div style="border:1px solid black; width: 100px;">
<div style="margin: 10px; height: 50px; background-color: blue;"></div>
<!--建立新的BFC-->
<div style="overflow: hidden;">
<div style="margin: 10px; height: 20px; background-color: blue;"></div>
</div>
</div>
复制代码
根据BFC布局规则: BFC内浮动元素也会参与BFC的高度计算。
<div style="border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 150px; background-color: red;">浮动</div>
<div style="height: 100px; background-color: blue;"></div>
</div>
复制代码
在包含块内存在一个浮动元素。浮动元素脱离文档流存在,所以包含块没有办法“掌握”整个浮动元素。一旦浮动元素的高度大于它旁边的元素,那它会穿透包含块。
经过设置overflow: hidden或display: inline-block等方式,在包含浮动元素的容器内建立BFC。BFC在计算高度的时候会将识别并计算浮动元素,效果至关于清除内部浮动。
<!--overflow: hidden-->
<div style="overflow: hidden;border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 150px; background-color: red;">浮动</div>
<div style="height: 100px; background-color: blue;"></div>
</div>
复制代码
根据BFC的布局规则: BFC的内容不会与浮动元素发生重叠。
<div style="overflow: hidden;border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 100px; background-color: red;">浮动</div>
<div style="height: 100px; background-color: blue;">这是一段内容。</div>
</div>
复制代码
BFC的内容环绕在浮动元素周围,不会与其发生重叠,能够经过这种方式实现自适应两栏/多栏的布局。
只有inline-level元素参与的渲染区域,IFC规定并管理inline-level元素的布局方式。
根据IFC的布局规则: 水平方向上,经过text-align改变对齐方式。
根据IFC的布局规则: 垂直方向上,经过vertical-align改变对齐方式。
声明display:grid/inline-grid能建立一个网格容器,网格容器会为其内容产生GFC。
网格布局引入了二维网格布局系统,经过一组相交的水平线和垂直线来定义网格的列和行,网格元素被布局到这些行和列相关的位置上。
参考网格布局。
声明display:flex/inline-flex能建立一个弹性容器,弹性容器会为其内容产生FFC。
参考弹性布局。
参考连接: