什么是BFC?
在系统性的阐述什么是BFC之前,我们首先介绍下CSS中常见的布局。1. 普通流。行内元素排成一行,一行不够则换行,块级元素,一个占一行。2. 浮动。元素会脱离普通流。3. 定位。元素会脱离普通流。BFC也属于普通流,设置为BFC的元素,相当于一种隔离了的元素,容器内部的元素不会在布局上影响外面的元素。
BFC指的是块级格式化上下文,一个元素如果具备了BFC的条件,那么这个元素会形成一个独立的渲染区域,内部元素的渲染不会影响外界。
如何触发BFC?
-
根元素(<html>)
-
浮动元素(元素的float不是none)
-
绝对定位元素(元素的position为absolute或fixed)
-
display为下面几种:

-
overflow的值不为visible的块元素
-
contain的值为layout、content或paint的元素
BFC的应用场景
1. 避免外边距重叠
在同一个BFC内两个相邻的盒子会出现外边距塌陷的问题,我们可以让这两个div分别位于两个不同的BFC中,则可以有效的避免外边距塌陷的问题。 codeSandBox在线演示
2. 清除浮动
BFC容器之所以能够清除浮动,是因为BFC容器可以包裹浮动元素。
3. 阻止元素被浮动元素覆盖
如果一个元素设置了浮动,但是下面的元素没有设置浮动,下面的元素会顶上来,形成一个浮动覆盖的效果,我们可以通过给非浮动元素设置成BFC元素,可以防止被浮动元素覆盖。
4. 使用BFC实现左侧盒子定宽,右侧盒子自适应布局
左侧设置为浮动,右侧浮动,右侧的宽度计算为100% - 左侧
手写clearfix来清除浮动
<style>
.clearfix::after {
content: '';
clear: both;
display: block;
}
</style>
</head>
<body>
<div class="clearfix">
<div style="width:100px;height:100px;background-color: red;float: left;"></div>
<div style="width:100px;height:100px;background-color: green;float: left;"></div>
</div>
<div>456</div>
<p>789</p>
</body>
核心总结:
BFC(Block Formatting Context,块级格式化上下文)是CSS中一个独立的渲染区域,内部元素的布局不会影响外部,主要用来解决margin塌陷、清除浮动、防止文字环绕等问题。
具体说明:
1. BFC是什么
可以理解为一个"隔离的容器",容器内的元素按照特定规则排列,不会影响外面的布局。就像一个独立的小世界,有自己的布局规则。
2. 如何创建BFC
常用的触发方式:
overflow: hidden/auto/scroll(最常用)display: flex/grid/inline-blockposition: absolute/fixedfloat: left/right- 根元素
<html>本身就是BFC
实际开发中我最常用overflow: hidden来创建BFC,简单直接。
3. BFC的核心规则
- 内部的盒子会垂直排列
- 同一个BFC内相邻元素的margin会合并(塌陷)
- BFC区域不会与浮动元素重叠
- 计算BFC高度时,浮动元素也参与计算
- BFC是一个隔离容器,内外元素互不影响
4. 实际应用场景
场景1:解决margin塌陷
/* 问题:两个div的margin会合并成20px而不是40px */
.box1 { margin-bottom: 20px; }
.box2 { margin-top: 20px; }
/* 解决:给其中一个包一层BFC容器 */
.bfc-wrapper {
overflow: hidden; /* 创建BFC */
}
场景2:清除浮动
/* 问题:子元素浮动导致父元素高度塌陷 */
.parent {
/* 没有高度 */
}
.child {
float: left;
}
/* 解决:给父元素创建BFC */
.parent {
overflow: hidden; /* BFC会包含浮动元素的高度 */
}
场景3:防止文字环绕浮动元素
/* 问题:文字会环绕浮动的图片 */
.image {
float: left;
width: 100px;
}
.text {
/* 文字会环绕图片 */
}
/* 解决:给文字容器创建BFC */
.text {
overflow: hidden; /* BFC不会与浮动元素重叠 */
}
场景4:自适应两栏布局
.sidebar {
float: left;
width: 200px;
}
.content {
overflow: hidden; /* 创建BFC,自动适应剩余宽度 */
}
5. 为什么overflow: hidden能清除浮动
因为BFC在计算高度时,会把内部的浮动元素也算进去。普通容器不会计算浮动子元素的高度,导致高度塌陷,但BFC容器会。
6. BFC vs IFC
- BFC:块级格式化上下文,垂直排列
- IFC(Inline Formatting Context):行内格式化上下文,水平排列,像文字、span这些
7. 实际开发经验
我遇到的最多的场景:
- 清除浮动用
overflow: hidden - margin塌陷问题现在用Flex布局基本不会遇到了
- 两栏布局现在都用Flex或Grid,不用浮动+BFC这种老方法了
说实话,自从用了Flex和Grid之后,专门去创建BFC的场景少了很多。但理解BFC对排查布局问题很有帮助,特别是维护老项目的时候。
记忆口诀:
"BFC是隔离容器,margin会塌陷,浮动被包含,外面不重叠"