BFC的含义及作用
1.BFC是什么
BFC 的全程为块格式化上下文(Block Formatting Context),在 MDN 定义如下:
块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
简单理解为,BFC 是一个完全独立的盒子,内部的元素无论样式是什么,都不会影响到盒子外部的布局。
BFC本质上还是一个block
级别的元素盒子的宽度具有填满父容器,并随着父容器的宽度自适应的流动特性。但BFC不会独占一行。
2.怎样触发BFC
- 浮动元素(
float
不为none
) - 固定定位、绝对定位元素(
position
为absolute
或fixed
) - 行内块元素(
display: inline-block
) - 弹性元素(
display: flex
) - 网格元素(
display: grid
) - overflow: hidden
3.BFC的规则
BFC
就是一个块级元素,块级元素会在垂直方向一个接一个的排列BFC
就是页面中的一个隔离的独立容器,容器里的标签不会影响到外部标签- 垂直方向的距离由margin决定, 属于同一个
BFC
的两个相邻的标签外边距会发生重叠
4.BFC解决了什么问题
1. 外边距塌陷
两个盒子,外边距margin
都设置为50px
,理应两个盒子的间距应该为100px
,但其真实间距为50px
。
这是因为发生了外边距塌陷问题,两个盒子的margin
重叠到了一起,相互影响。
<style>
.son {
width: 100px;
height: 100px;
background-color: blue;
margin: 50px;
}
</style>
<body>
<div class="son"></div>
<div class="son"></div>
</body>
可以利用 BFC 特性来解决外边距塌陷问题。将这两个盒子,分别放入两个 BFC 区域中,因为 BFC 是一个完全独立的盒子,内部的元素不会影响到外部区域。
将以上代码修改为如下即可解决,两盒子间距变为100px
:
<style>
.father {
background-color: yellow;
/* 触发BFC */
overflow: hidden;
}
.son {
width: 100px;
height: 100px;
background-color: blue;
margin: 50px;
}
</style>
<body>
<div class="father">
<div class="son"></div>
</div>
<div class="father">
<div class="son"></div>
</div>
</body>
2. 内边距包含塌陷
父子关系的盒子中,给子盒子加了margin-top
,父盒子也会跟着一起下去。
可以利用 BFC 特性来解决包含塌陷问题。将父盒子设置为一个 BFC,这样父盒子内部的样式就不会影响到外部的布局了。
使用overflow: hidden
触发 BFC:
3. 清除浮动带来的影响
一个没有设置高度的父盒子,里面一个子盒子设置了浮动,那么父盒子失去了高度,不显示在页面上了。
利用 BFC 特性来解决浮动问题。因为父盒子没有高度了,必然影响了外部元素的布局。那将父盒子触发 BFC,这样父盒子内部的子盒子就不会影响到外部布局了。
4. 阻止浮动元素覆盖标准流与两栏布局
可以看到上面元素,第二个div
元素为300px
宽度,但是被第一个div
元素设置Float
脱离文档流给覆盖上去了,解决此方法我们可以把第二个div
元素设置为一个BFC
。
缺点:父元素要清除浮动,若做左盒子高度为500px,右盒子高度为300px,父元素只会给BFC右盒子撑开,而左盒子将会超出父元素,故也要将父元素开启BFC(回应第3点)。