CSS 10 分鐘理解 BFC 原理

2022-04-28 21:42:14 字數 3420 閱讀 3604

在講 bfc 之前,我們先來了解一下常見的定位方案,定位方案是控制元素的布局,有三種常見方案:

在普通流中,元素按照其在 html 中的先後位置至上而下布局,在這個過程中,行內元素水平排列,直到當行被佔滿然後換行,塊級元素則會被渲染為完整的乙個新行,除非另外指定,否則所有元素預設都是普通流定位,也可以說,普通流中元素的位置由該元素在 html 文件中的位置決定。
在浮動布局中,元素首先按照普通流的位置出現,然後根據浮動的方向盡可能的向左邊或右邊偏移,其效果與印刷排版中的文字環繞相似。(脫離文件流,其他dom元素無視他,在其下方布局,但是其未脫離文字流,其他元素的文字會認為他存在,環繞他布局。父元素會無視他,因此無法獲取其高度,這也就是浮動元素父元素高度塌陷的原因。)
在絕對定位布局中,元素會整體脫離普通流,因此絕對定位元素不會對其兄弟元素造成影響,而元素具體的位置由絕對定位的座標決定。(完全脫離文件流,其他元素無視他,在其下方布局)
formatting context(格式化上下文) 是 w3c css2.1 規範中的乙個概念。它是頁面中的一塊渲染區域,並且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關係和相互作用。

那麼 bfc 是什麼呢?

bfc 即 block formatting contexts (塊級格式化上下文),它屬於上述定位方案的普通流。

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

通俗一點來講,可以把 bfc 理解為乙個封閉的大箱子,箱子內部的元素無論如何翻江倒海,都不會影響到外部。

只要元素滿足下面任一條件即可觸發 bfc 特性:

1. 同乙個 bfc 下外邊距會發生摺疊

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

首先這不是 css 的 bug,我們可以理解為一種規範,如果想要避免外邊距的重疊,可以將其放在不同的 bfc 容器中。

<

div

class

="container"

>

<

p>

p>

div>

<

div

class

="container"

>

<

p>

p>

div>

.container p
這時候,兩個盒子邊距就變成了 200px

2. bfc 可以包含浮動的元素(清除浮動) ——計算bfc的高度時,浮動元素也參與計算。

我們都知道,浮動的元素會脫離普通文件流,來看下下面乙個例子

由於容器內元素浮動,脫離了文件流,父元素會無視他,因此無法獲取其高度,父元素高度塌陷,所以容器只剩下 2px 的邊距高度。如果使觸發容器的 bfc,那麼容器將會包裹著浮動元素。

3. bfc 可以阻止元素被浮動元素覆蓋 

先來看乙個文字環繞效果: 

<

div

style

="height: 100px;width: 100px;float: left;background: lightblue"

>我是乙個左浮動的元素

div>

<

div

style

="width: 200px; height: 200px;background: #eee"

>

我是乙個沒有設定浮動,

也沒有觸發 bfc 元素, width: 200px; height:200px; background: #eee;

這時候其實第二個元素有部分被浮動元素所覆蓋,如上圖藍色部分,(但是文字資訊不會被浮動元素所覆蓋) 如果想避免元素被覆蓋,可觸第二個元素的 bfc 特性,在第二個元素中加入 overflow: hidden,就會變成:

這個方法可以用來實現兩列自適應布局,效果不錯,這時候左邊的寬度固定,右邊的內容自適應寬度(去掉上面右邊內容的寬度)。

以上例子都體現了:bfc就是頁面上的乙個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。反之也如此。

因為bfc內部的元素和外部的元素絕對不會互相影響,因此, 當bfc外部存在浮動時,它不應該影響bfc內部box的布局,bfc會通過變窄,而不與浮動有重疊。同樣的,當bfc內部有浮動時,為了不影響外部元素的布局,bfc計算高度時會包括浮動的高度。避免margin重疊也是這樣的乙個道理。

10 分鐘理解 BFC 原理

在講 bfc 之前,我們先來了解一下常見的定位方案,定位方案是控制元素的布局,有三種常見方案 在普通流中,元素按照其在 html 中的先後位置至上而下布局,在這個過程中,行內元素水平排列,直到當行被佔滿然後換行,塊級元素則會被渲染為完整的乙個新行,除非另外指定,否則所有元素預設都是普通流定位,也可以...

10 分鐘理解 BFC 原理

在講 bfc 之前,我們先來了解一下常見的定位方案,定位方案是控制元素的布局,有三種常見方案 在普通流中,元素按照其在 html 中的先後位置至上而下布局,在這個過程中,行內元素水平排列,直到當行被佔滿然後換行,塊級元素則會被渲染為完整的乙個新行,除非另外指定,否則所有元素預設都是普通流定位,也可以...

10分鐘 深入less

三種方式引用less 瀏覽器引用 less.js link type text lesss node中使用 工程中使用 變數 key value在js中,條件語句中 可以使用 if,else,switch定義,less中語句中跟switch中case比較像。less 沒有像js中這樣的關鍵字,但是也...