一、什么是BFC
W3C对BFC的定义如下: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为"visiable"的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)
二、产生条件
一个HTML元素要创建BFC,满足下列的任意一个或多个条件即可(下列方式会创建块格式化上下文):
- 根元素
- 浮动元素(元素的float的值除none外)
- 绝对定位元素(元素的position为absolute或fixed)
- 行内块元素(元素的display为inline-block)
- 表格单元格(元素的display为table-cell,HTML表格单元格默认为该值)
- 表格标题(元素的display为table-caption,HTML表格标题默认为该值)
- 匿名表格单元格元素(元素的display为table、table-row、table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或inline-table)
- overflow值不为visible的块元素
- 弹性元素(display为flex或inline-flex元素的直接子元素)
- 网格元素(display为grid或inline-grid 元素的直接子元素)
- 等等
三、BFC产生的效果
- 相处在同一个BFC的元素,垂直方向的边距会产生重叠
- BFC的区域不会与浮动元素的box重叠
- BFC是一个独立的容器,外面的元素不会影响里面的元素
- 计算BFC高度的时候浮动元素也会参与计算
四、应用场景
- 防止子元素浮动导致父元素高度塌陷:
.container {
border: 10px solid red;
}
.inner {
background: #08BDEB;
height: 100px;
width: 100px;
}
<div class="container">
<div class="inner"></div>
</div>
现在将inner元素改为浮动元素后,会变成这样:
.inner {
float: left;
background: #08BDEB;
height: 100px;
width: 100px;
}
这时候只要将父元素设置BFC后,塌陷的问题就解决了(有多种方式,参考产生条件):
.container {
border: 10px solid red;
overflow: hidden;
}
- 去除外边距折叠
.a {
height: 50px
background: red;
margin-bottom: 30px;
}
.b {
height: 50px
background: blue;
margin-top: 50px;
}
<div class="a"></div>
<div class="b"></div>
可以看出两个div中间的边距没有80px那么多,测量得到的是50px。这是因为相处在同一个BFC的元素,垂直方向的边距会产生重叠
这时候将a元素都设置在另一个BFC元素内,问题便就解决了(注意:如果将a元素本身设置为BFC元素,则a和b两个元素还是同处在一个BFC中):
.bfc {
overflow: hidden
}
<div class="bfc">
<div class="a"></div>
</div>
<div class="b"></div>
很明显间距变大了
四、总结
在平时开发中其实css也是占据较多的精力,在明白对应属性能产生的效果后,遇见问题也能很快得到解决