一、什么是 BFC
BFC(Block Formatting Context),即块级格式化上下文,是 CSS 中一个重要的布局概念。
1.1 定义
BFC 是一个独立的渲染区域,在这个区域内,元素的布局不受外界影响,同时也不会影响外界元素。
1.2 生活类比
想象一下,在一个大房间里,有多个独立的泡泡。每个泡泡内部的物品可以自由摆放,但不会影响其他泡泡里的物品。BFC 就像是这样的泡泡。
1.3 BFC 的核心特点
- 内部隔离:BFC 内部的元素布局与外部完全隔离
- 垂直排列:BFC 内的块级元素会垂直排列
- 外边距合并:BFC 内相邻块级元素的垂直外边距会合并
- 不重叠浮动:BFC 不会与浮动元素重叠
- 包含浮动:BFC 可以包含浮动元素,防止父元素高度塌陷
二、触发 BFC 的条件
只要满足以下任一条件,就会触发 BFC:
| 触发方式 | 代码示例 |
|---|---|
| 根元素 | <html> |
| 浮动元素 | float: left/right |
| 绝对定位 | position: absolute/fixed |
| 行内块元素 | display: inline-block |
| 表格单元格 | display: table-cell |
| 表格标题 | display: table-caption |
| overflow 非 visible | overflow: hidden/auto/scroll |
| flex 容器 | display: flex/inline-flex |
| grid 容器 | display: grid/inline-grid |
三、BFC 的三大特性
3.1 特性1:内部元素垂直外边距不会重叠
在普通文档流中,相邻块级元素的垂直外边距会发生重叠。但在 BFC 中,这个问题可以得到解决。
html
<style>
.box {
width: 100px;
height: 100px;
margin: 20px;
background: #f00;
}
.container {
overflow: hidden; /* 触发 BFC */
}
</style>
<!-- 普通情况:外边距重叠,间距只有 20px -->
<div class="box"></div>
<div class="box"></div>
<!-- BFC 情况:外边距不重叠,间距是 40px -->
<div class="container">
<div class="box"></div>
</div>
<div class="container">
<div class="box"></div>
</div>
3.2 特性2:不会与浮动元素重叠
BFC 会自动适应浮动元素的位置,不会与浮动元素重叠。
html
<style>
.float-box {
float: left;
width: 100px;
height: 100px;
background: #f00;
}
.normal-box {
height: 150px;
background: #0f0;
}
.bfc-box {
height: 150px;
background: #00f;
overflow: hidden; /* 触发 BFC */
}
</style>
<!-- 普通情况:会与浮动元素重叠 -->
<div class="float-box"></div>
<div class="normal-box">普通盒子</div>
<!-- BFC 情况:不会与浮动元素重叠 -->
<div class="float-box"></div>
<div class="bfc-box">BFC 盒子</div>
3.3 特性3:可以包含浮动元素
BFC 可以包裹浮动元素,解决父元素高度塌陷问题。
html
<style>
.parent {
border: 2px solid #000;
}
.child {
float: left;
width: 100px;
height: 100px;
background: #f00;
}
.bfc-parent {
border: 2px solid #000;
overflow: hidden; /* 触发 BFC */
}
</style>
<!-- 普通情况:父元素高度塌陷 -->
<div class="parent">
<div class="child"></div>
</div>
<!-- BFC 情况:父元素包含浮动元素 -->
<div class="bfc-parent">
<div class="child"></div>
</div>
四、BFC 的实际应用
4.1 应用1:解决 margin 重叠问题
css
/* 给每个元素包裹一层 BFC 容器 */
.bfc {
overflow: hidden;
}
.box {
margin: 20px;
}
4.2 应用2:实现两栏自适应布局
html
<style>
.left {
float: left;
width: 200px;
height: 300px;
background: #f00;
}
.right {
overflow: hidden; /* 触发 BFC */
height: 300px;
background: #0f0;
}
</style>
<div class="left">固定宽度侧栏</div>
<div class="right">自适应主内容区</div>
4.3 应用3:清除浮动(替代 clearfix)
css
.clearfix {
overflow: hidden; /* 触发 BFC */
}
4.4 应用4:防止文字环绕
html
<style>
.float-img {
float: left;
width: 100px;
height: 100px;
}
.text {
overflow: hidden; /* 触发 BFC */
}
</style>
<img src="example.jpg" class="float-img">
<p class="text">这是一段文字,不会环绕图片...</p>
五、总结
5.1 BFC 的核心作用
- 隔离布局:BFC 内部的布局不受外界影响
- 解决重叠:防止 margin 重叠和浮动重叠
- 包含浮动:解决父元素高度塌陷问题
5.2 关键要点
- BFC 是一个独立的渲染区域
- 多个条件可以触发 BFC(常用
overflow: hidden) - BFC 不会影响外部,外部也不会影响内部