BFC是什么?
1.1 BFC 是什么?
BFC 全称为块级格式化上下文(Block Formatting Context),BFC 是 W 3 C CSS 2.1 规范中的一个概念,它决定元素如何对其中的内容进行定位,以及与其他元素的关系和相互作用,通俗的讲,BFC 就是一个特殊的块,内部有自己的布局方式,不受外部元素的影响以及不影响外部的元素。
1.2 BFC 的规则
- 内部的盒子会在垂直方向上一个接着一个的排列
- 处于同一个 BFC 中的元素盒子会相互影响,可能会发生外边距重叠
- 每个元素的左外边距(margin)与包含块的左边界(border)相接触(即使是浮动元素也是如此),说明 BFC 中的子元素不会超出它的包含块
- BFC 的区域不会与 float 的元素区域重叠
- 计算 BFC 高度时,浮动子元素参与计算
- BFC 就是页面上一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
1.3 触发 BFC 的条件
- 根元素或其他包含它的元素
- 浮动元素(元素的float 不为 none)
- 绝对定位的元素(元素就有 position 为 absolute 或是 fixed)
- 内联块(元素具有 display:inline-block)
- 表格单元格(元素具有 display:table-cell,HTML 表格单元格默认属性)
- 表格标题(元素具有 display:table-caption,HTML 表格标题默认属性)
- 具有 overflow 且值不是 visible 的块元素
- 弹性盒子(flex 或者 inline-flex)
- display:flow-root
- column-span:all
1.4 BFC的应用场景
<div>
<div class="left">浮动元素,无固定宽度</div>
<div class="right">自适应</div>
</div>
<style>
* {
margin: 0;
padding: 0;
}
.left {
float: left;
height: 200px;
margin-right: 10px;
background-color: red;
}
.right {
overflow: hidden;
height: 200px;
background-color: yellow;
}
</style>
效果:

-
左列设为左浮动,将自身高度塌陷,使得其它块元素可以和它占据同一行的位置
-
右列为div块级元素,利用自身的流特性占满整行
-
右列设置overflow:hidden,触发BFC特性,使其自身与左列的浮动元素隔离开,不占满整行
-
这就是上面说的BFC的特性之一:浮动元素的区域不会和BFC重叠
-
防止外边距重叠
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
p {
color: #f55;
background: #fcc;
width: 200px;
line-height: 100px;
text-align: center;
margin: 100px;
}
</style>
</head>
<body>
<p>Hello World</p>
<p>Hello haha</p>
</body>
</html>

两个 p 元素之间的距离为 100px ,发⽣了 margin 重叠(塌陷),以最⼤的为准,如果第⼀个P的margin 为80的话,两个P之间的距离还是100,以最⼤的为准。
前⾯讲到,同⼀个 BFC 的俩个相邻的盒⼦的 margin 会发⽣重叠,可以在 p 外⾯包裹⼀层容器,并触发这个容器⽣成⼀个 BFC ,那么两个 p 就不属于同⼀个 BFC ,则不会出现 margin 重叠
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
p {
color: #f55;
background: #fcc;
width: 200px;
line-height: 100px;
text-align: center;
margin: 100px;
}
.wrap {
overflow: hidden;
}
</style>
</head>
<body>
<p>Hello World</p>
<div class="wrap">
<p>Hello haha</p>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.par{
border: 5px solid #fcc;
width: 300px;
}
.child{
border: 5px solid #f66;
width: 100px;
height: 100px;
float: left;
}
</style>
</head>
<body>
<div class="par">
<div class="child"></div>
<div class="child"></div>
</div>
</body>
</html>

⽽ BFC 在计算⾼度时,浮动元素也会参与,所以我们可以触发 .par 元素⽣成 BFC ,则内部浮动元素计算⾼度时候也会计算