什么是BFC
BFC 即 Block Formatting Contexts (塊級(jí)格式化上下文)
具有 BFC 特性的元素可以看作是隔離了的獨(dú)立容器,容器里面的元素不會(huì)在布局上影響到外面的元素莲蜘,并且 BFC 具有普通容器所沒(méi)有的一些特性洗出。
通俗一點(diǎn)來(lái)講士复,可以把 BFC 理解為一個(gè)封閉的大箱子,箱子內(nèi)部的元素?zé)o論如何翻江倒海,都不會(huì)影響到外部阱洪。
如何觸發(fā)BFC
- body根元素
- float不為none
- display表現(xiàn)為(inline-block便贵、table-cell、flex)
- position: fixed冗荸、absolute
- overflow不為visible
BFC特性及應(yīng)用
1.在同一個(gè)BFC內(nèi)部的兩個(gè)相鄰元素會(huì)發(fā)生外邊距重疊
<head>
div{
width: 100px;
height: 100px;
background: lightblue;
margin: 100px;
}
</head>
<body>
<div></div>
<div></div>
</body>
從效果上看承璃,因?yàn)閮蓚€(gè) div 元素都處于同一個(gè) BFC 容器下 (這里指 body 元素) 所以第一個(gè) div 的下邊距和第二個(gè) div 的上邊距發(fā)生了重疊,所以?xún)蓚€(gè)盒子之間距離只有 100px蚌本,而不是 200px盔粹。
首先這不是 CSS 的 bug,我們可以理解為一種規(guī)范程癌,如果想要避免外邊距的重疊舷嗡,可以將其放在不同的 BFC 容器中。
<head>
.container {
overflow: hidden;
}
p {
width: 100px;
height: 100px;
background: lightblue;
margin: 100px;
}
</head>
<body>
<div class="container">
<p></p>
</div>
<div class="container">
<p></p>
</div>
</body>
2.BFC 可以包含浮動(dòng)的元素, 計(jì)算BFC高度時(shí)嵌莉,浮動(dòng)元素也參與計(jì)算(清除浮動(dòng))
<div style="border: 1px solid #000;">
<div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
由于容器內(nèi)元素浮動(dòng)进萄,脫離了文檔流,所以容器只剩下 2px 的邊距高度烦秩。如果使觸發(fā)容器的 BFC垮斯,那么容器將會(huì)包裹著浮動(dòng)元素郎仆。
<div style="border: 1px solid #000;overflow: hidden">
<div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
3.形成了BFC的區(qū)域不會(huì)與float box重疊
先來(lái)看一個(gè)文字環(huán)繞效果:
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個(gè)左浮動(dòng)的元素</div>
<div style="width: 200px; height: 200px;background: #eee">我是一個(gè)沒(méi)有設(shè)置浮動(dòng),
也沒(méi)有觸發(fā) BFC 元素, width: 200px; height:200px; background: #eee;</div>
這時(shí)候其實(shí)第二個(gè)元素有部分被浮動(dòng)元素所覆蓋只祠,(但是文本信息不會(huì)被浮動(dòng)元素所覆蓋) 如果想避免元素被覆蓋,可觸第二個(gè)元素的 BFC 特性扰肌,在第二個(gè)元素中加入 overflow: hidden抛寝,就會(huì)變成:
這個(gè)方法可以用來(lái)實(shí)現(xiàn)兩列自適應(yīng)布局,效果不錯(cuò)曙旭,這時(shí)候左邊的寬度固定盗舰,右邊的內(nèi)容自適應(yīng)寬度(去掉上面右邊內(nèi)容的寬度)。