清除浮动图文解析:BFC的详细概念与触发原理
BFC是指"块级格式化上下文"(Block Formatting Context)。它是CSS中的一个重要概念,用于描述在页面布局时,块级元素如何相互影响和定位的一种规范机制,常用于解决布局问题,如清除浮动、防止外边距合并等。
浮动布局的场景模拟:
当你在页面上放两组图片时,它是这样显示的:
<style>
ul{
font-size:0;
}
/* 图片宽度 */
img{
width: 300px;
}
</style>
<body>
<ul>
<li class="item"><img src="https://img1.baidu.com/it/u=4068347985,765153296&fm=253&fmt=auto&app=138&f=JPEG?w=658&h=370" alt=""></li>
<li class="item"><img src="https://img1.baidu.com/it/u=152517855,1336329057&fm=253&fmt=auto&app=120&f=JPEG?w=889&h=500" alt=""></li>
</ul>
</body>

由于两个li
都为块级元素,如果想让它们都集中在一行,那么大家最先想到的方法肯定是给ul
中的每一个子项li
都添加上浮动属性,于是:
<style>
ul{
font-size:0;
}
/* 图片宽度 */
img{
width: 300px;
}
.item{
float: left;
}
</style>

就在这时,你突然想给这两张图片添加一段文本。
按照正常流程,在ul
之下添加一个名为content
的div
来容纳这段文本:
<body>
<ul>
<li class="item"><img src="https://img1.baidu.com/it/u=4068347985,765153296&fm=253&fmt=auto&app=138&f=JPEG?w=658&h=370" alt=""></li>
<li class="item"><img src="https://img1.baidu.com/it/u=152517855,1336329057&fm=253&fmt=auto&app=120&f=JPEG?w=889&h=500" alt=""></li>
</ul>
<div class="content">你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑!你是否想过.....朋友不在是朋友,家园不再是家园</div>
</body>

但就是在这个时候,由于容器ul
被赋予的浮动属性,塌陷了我们预期出现在图片底部的文本。
各种清除浮动方法:
这个时候有许多方法可以达到我们的目的,包括:
- 设置父元素的高度
- 在父元素结束之前添加一个空元素,并摄制 clear: both;
- 借助伪元素 ::after 清除浮动
- 给后面受影响的元素设置 clear: both;
- 把父元素设置成 BFC 容器
上四点有的只是达到和清除浮动一样的效果,不能做到尽善尽美,有的甚至会产生过多冗余的代码,逐渐形成屎山,因此一般情况下不推荐使用。
BFC的应用原理:
可以看出此时ul
容器中的高度为零,这是因为正常普通的容器不会把浮动元素的高度计算在内,也可以说成是不会把脱离文档流的元素高度计算在内(浮动元素脱离文档流),这就是文本塌陷的原因。
但如果我们将ul
设置成BFC容器:在ul
内添加上overflow:hidden
这段代码
<style>
ul{
font-size:0;
overflow:hidden;
}
/* 图片宽度 */
img{
width: 300px;
}
.item{
float: left;
}
</style>
BFC将浮动元素的高度计算在内,我们所期望的文本回到了它该在的位置,至此,大功告成
BFC的布局规则
- 内部的Box会在垂直方向,一个接一个地放置
- BFC容器内部和外部的容器相互隔离,互不影响 -- 解决margin重叠问题
- BFC容器内,在垂直方向上相邻元素的margin会重叠
- BFC容器在计算高度时,浮动元素也参与计算 --- 清除浮动
补充:触发BFC
当然能触发BFC容器的代码不单单只有overflow:hidden
,以下是其它能将容器设置为BFC容器的代码:
- overflow:hidden || auto || overlay || scroll
- flaot: left || right
- position: absolute || fixed
- display: inline-block
- display: table-cell || table-xxx
- display: flex || inline-flex
转载自:https://juejin.cn/post/7372757076937064483