什么是BFC(塊級格式上下文)?


㈠什么是BFC?

BFC 全稱為 塊格式化上下文 (Block Formatting Context) 。

定義:浮動元素和絕對定位元素,非塊級盒子的塊級容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不為“visiable”的塊級盒子,都會為他們的內容創建新的BFC(塊級格式上下文)。

 

㈡BFC的布局規則是什么?

1)內部的box會在垂直方向,一個接一個地放置(可以看作BFC中有一個的常規流)。

2)Box垂直方向的距離有margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊

3)每個元素的margin box 的左邊,會包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反),即使存在浮動也是如此

4)BFC的區域不會與float box 重疊

5)BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此

6)計算BFC的高度時,浮動元素也參與計算

 

㈢那些情況會產生新的BFC/如何創建BFC?

⑴根元素或其它包含它的元素

⑵浮動 (元素的 float 不為 none)

⑶絕對定位元素 (元素的 position 為 absolute 或 fixed)

⑷行內塊 inline-blocks (元素的 display: inline-block)

⑸表格單元格 (元素的 display: table-cell,HTML表格單元格默認屬性)

⑹表格標題 (元素的 display: table-caption, HTML表格標題默認屬性)

⑺overflow 的值不為 visible的元素

⑻彈性盒 flex boxes (元素的 display: flex 或 inline-flex)

 

㈣邊距重疊在什么時候或者什么情況下會發生呢?

⑴父與子之間:子級的上下margin會與父級上下margin重疊,以最大值為標准去渲染

⑵空元素:如果設置了margin-top和margin-bottom,它會在這兩之間取一個最大值作為它的最終邊距值

⑶兄弟元素之間:每個兄弟之間都有上邊距或者每個兄弟之間都有下邊距,原則就是取最大的值

 

㈤BFC與高度坍塌

⑴什么是高度坍塌?

父元素高度自適應,子元素 float 后,造成父元素高度為0,稱為高度塌陷問題。

 

⑵為什么坍塌?

float 脫離了普通流,並且創建了新的BFC,而父元素不具備產生 BFC 的條件,所以它的高度為0。

 

⑶如何用BFC解決高度坍塌?

通過了解BFC的特性我們知道,BFC會把它包含的浮動元素高度也算在里面,也就是閉合浮動。

拿 overflow: auto 舉例:

overflow: auto 並不會閉合浮動,而是 overflow: auto 會創建一個新的BFC,避免浮動的元素侵入其他元素。

注:在支持BFC的瀏覽器(IE8+firefoxchromesafari)通過創建新的BFC閉合浮動;

 

 

㈥BFC的常見作用是什么?

1.阻止外邊距折疊

問題案例:margin塌陷問題:在標准文檔流中,塊級標簽之間豎直方向的margin會以大的為准,這就是margin的塌陷現象。可以用overflow:hidden產生bfc來解決。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <head> <style> div{ width: 100px; height: 100px; background: lightblue; margin: 100px; } </style> </head> <body> <div></div> <div></div> </body> </html>

 

效果圖:

 

 

 

 

 

 

從效果上看,因為兩個div元素都處於同一個BFC容器下(這里指body元素),所以第一個div的下邊距和第二個div的上邊距發生了重疊,所以兩個盒子之間距離只有100px,而不是200px。


 

如果想要避免外邊距的重疊,可以將其放在不同的 BFC 容器中。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <head> <style> .container { overflow: hidden; } p { width: 100px; height: 100px; background: lightblue; margin: 100px; } </style> </head> <body> <div class="container"> <p></p> </div> <div class="container"> <p></p> </div> </body> </html>

 

效果圖:

 

 

 

 

 

 

2.包含浮動元素

問題案列:高度塌陷問題,在通常情況下父元素的高度會被子元素撐開,而在這里因為其子元素為浮動元素所以父元素發生了高度坍塌,上下邊界重合,這時就可以用BFC來清除浮動了。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <body> <div style="border: 1px solid blue;"> <div style="width: 100px;height: 100px;background: red;float: left;"> </div> </div> </body> </html>

 

效果圖:

 

 

 由於容器內元素浮動,脫離了文檔流,所以容器只剩下2px的邊距高度。如果觸發容器的BFC,那么容器將會包裹浮動元素。

 

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <body> <div style="border: 1px solid blue;overflow: hidden"> <div style="width: 100px;height: 100px;background: red;float: left;"> </div> </div> </body> </html>

 

效果圖:

 

 

3、阻止元素被浮動元素覆蓋

問題案例:div浮動兄弟這該問題:由於左側塊級元素發生了浮動,所以和右側未發生浮動的塊級元素不在同一層內,所以會發生div遮擋問題。可以給右側元素添加 overflow: hidden,觸發BFC來解決遮擋問題。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <body> <div style="height: 100px;width: 100px;float: left;background: lightblue"> 我是一個左浮動的元素 </div> <div style="width: 200px; height: 200px;background: pink"> 我是一個沒有設置浮動, 也沒有觸發 BFC 元素, 現在看看會發生什么效果吧,要仔細看。 </div> </body> </html>

 

效果圖:

這時候其實第二個元素有部分被浮動元素所覆蓋,但是文本信息不會被浮動元素所覆蓋,如果想避免元素被覆蓋,可觸發第二個元素的BFC特性,在第二個元素中加入overflow:hidden,就會變成:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <body> <div style="height: 100px;width: 100px;float: left;background: lightblue"> 我是一個左浮動的元素 </div> <div style="width: 200px; height: 200px;background: pink;overflow:hidden"> 我是一個沒有設置浮動, 也沒有觸發 BFC 元素, 現在看看會發生什么效果吧,要仔細看。 </div> </body> </html>

 

效果圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM