BFC原理在CSS中的應用

準確來說,BFC是CSS2.1時代的產物,它是頁面中的一塊渲染區域,並且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關係和相互作用

何爲“BFC”?

BFC 即 Block Formatting Contexts (塊級格式化上下文),它屬於普通流。

具有 BFC 特性的元素可以看作是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,並且 BFC 具有普通容器所沒有的一些特性。

通俗地說,可以把 BFC 理解爲一個封閉的大箱子,箱子內部的元素無論如何翻江倒海,都不會影響到外部。

什麼是“普通流”?
衆所周知,前端三大常見定位方案:普通流 (normal flow)、浮動(float)、絕對定位 (absolute positioning)
普通流:元素按照其在 HTML 中的先後位置至上而下佈局,在這個過程中,行內元素水平排列,直到當行被佔滿然後換行,塊級元素則會被渲染爲完整的一個新行,除非另外指定,否則所有元素默認都是普通流定位,也可以說,普通流中元素的位置由該元素在 HTML 文檔中的位置決定。

觸發BFC

傳說,只要滿足了一下任一要求即可觸發BFC:

  • body 根元素
  • 浮動元素:float 除 none 以外的值
  • 絕對、固定定位元素:position (absolute、fixed)
  • display 爲 inline-block、table-cells、flex
  • overflow 除了 visible 以外的值 (hidden、auto、scroll)

BFC特性

1、摺疊
據說,當兩個border都有邊距時,以最大的那個邊距爲“真”,並不會把兩個margin都“表現出來”。比如:

<head>
div{
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;
}
</head>
<body>
    <div></div>
    <div></div>
</body>

在這裏插入圖片描述
實際上,造成這種效果是因爲兩個 div 元素都處於同一個 BFC 容器下 (這裏指 body 元素) 所以第一個 div 的下邊距和第二個 div 的上邊距發生了重疊,所以兩個盒子之間距離只有 100px,而不是 200px。

但是你接到任務:要讓兩個div的margin都有體現,怎麼辦?
我們可以這樣理解:如果想要避免外邊距的重疊,可以將其放在不同的 BFC 容器中。

<div class="container">
    <p></p>
</div>
<div class="container">
    <p></p>
</div>
<style>
	.container {
    	overflow: hidden;
	}
	p {
    	width: 100px;
    	height: 100px;
    	background: lightblue;
    	margin: 100px;
	}
</style>

2、“高度塌陷”
如下圖:
在這裏插入圖片描述
推測,它的代碼應該是這樣寫的:

<div style="border: 1px solid #000;">
    <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>

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

據此,我們做如下更改:

<div style="border: 1px solid #000;overflow: hidden">
    <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>

在這裏插入圖片描述

3、兩列布局
我們先來看一個“文字環繞”的效果代碼:

<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個左浮動的元素</div>
<div style="width: 200px; height: 200px;background: #eee">我是一個沒有設置浮動, 
也沒有觸發 BFC 的元素, 因爲我沒法觸發,也沒人給我設置</div>

這時候其實第二個div有部分被浮動元素所覆蓋,(但是文本信息不會被浮動元素所覆蓋) 如果想避免元素被覆蓋,可觸第二個元素的 BFC 特性,在第二個元素中加入 overflow: hidden,就可以用來實現經典的“兩列自適應佈局”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章