參考:https://zhuanlan.zhihu.com/p/25321647
https://blog.csdn.net/sinat_36422236/article/details/88763187
一、BFC 概念
BFC 即 Block Formatting Contexts (塊級格式化上下文)
具有 BFC 特性的元素可以看作是隔離了的獨立容器,容器里面的元素不會在布局上影響到外面的元素,并且 BFC 具有普通容器所沒有的一些特性。
二、BFC的特點
1.同一個BFC下的非BFC元素在垂直方向的margin會折疊
<head>
div{
width: 100px;
height: 100px;
background: lightblue;
margin: 100px;
}
</head>
<body>
<div></div>
<div></div>
</body>
其中兩個div都在body這一BFC下,所以兩個div之間的距離只有100px,而不是200px。
要想讓兩個div的距離變成200px,只有把它們分別放入不同的BFC容器中才可以,直接將兩個div變成BFC都沒用。
2.浮動元素會使非BFC的父元素塌陷,但如果將父元素變成了BFC,就不會塌陷了
//坍陷
<div style="border: 1px solid #000;">
<div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
//會包裹著浮動元素
<div style="border: 1px solid #000;overflow: hidden">
<div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
3.BFC元素不會被浮動元素覆蓋
//第一個div會覆蓋第二個div的左上角,但不會覆蓋其文本信息
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個左浮動的元素</div>
<div style="width: 200px; height: 200px;background: #eee">我是一個沒有設(shè)置浮動,
也沒有觸發(fā) BFC 元素, width: 200px; height:200px; background: #eee;</div>
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個左浮動的元素</div>
<div style="width: 200px; height: 200px;background: #eee;overflow: hidden">我是一個沒有設(shè)置浮動,
觸發(fā)了 BFC 元素, width: 200px; height:200px; background: #eee;</div>
給第二個div設(shè)置BFC之后,它會排在浮動元素的右側(cè),不會再被覆蓋。
三、BFC的布局規(guī)則
1.內(nèi)部的box會在垂直方向,一個接一個的放置
2.box垂直方向的距離有margin決定,相鄰的margin會重疊
3.每個盒子(塊盒與行盒)的margin box的左邊,與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)。即使存在浮動也是如此。不會左右相鄰。
4.BFC的區(qū)域不會與float box重疊。
5.BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。
6.計算BFC的高度時,浮動元素也參與計算。
四、如何觸發(fā)BFC
1、float的值不是none。
2、position的值不是static或者relative,是absolute、fixed。
3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex。
4、overflow的值不是visible,是 hidden、auto、scroll。
5、body根元素。