最近了解了一下前端面試題,發現有一個名詞經常出現,那就是BFC
BFC是什么呢?
我們好像感覺這是新出的什么東西嗎?怎么突然就闖入我們的世界了?
實則不然,其實呢 BFC 在前端隨處可見,只要你有過接觸,接觸過前端,寫過靜態網頁就已經和它打交道了。
接下來我們一起來看看 BFC是怎么定義的。
定義:
BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,
只有 Block-level box 參與,它規定了內部的 Block-level Box 如何布局,並且與這個區域
外部毫不相干。
什么巴拉巴拉一堆,也看不懂。那我們取出來當中有用的部分:
它是一個獨立的渲染區域,其實就是符合某些特征的HTML標簽。
記住這句話並且理解這句話應該就懂得到底什么是BFC了。
接下來BFC有兩條重要的內容:
一、布局規則:
也就是形成BFC的特性 會怎么怎么樣?。。。
1、內部的 Box 會在垂直方向,一個接一個地放置
2、Box 垂直方向的距離由 margin 決定。屬於同一個 BFC 的兩個相鄰 Box 的 margin
會發生重疊
3、每個元素的 margin box 的左邊, 與包含塊 border box 的左邊相接觸(對於從左往
右的格式化,否則相反)。即使存在浮動也是如此
4、BFC 的區域不會與 float box 重疊
5、BFC 就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反
之也如此
6、計算 BFC 的高度時,浮動元素也參與計算
二、哪些元素會生成 BFC:
也就是形成BFC的條件。 需要誰誰誰?。。。
1、根元素
2、float 屬性不為 none
3、position 為 absolute 或 fixed
4、display 為 inline-block, table-cell, table-caption, flex, inline-flex
5、overflow 不為 visible
想理解BFC, 首先我們先看布局規則前兩條:
1、內部的 Box 會在垂直方向,一個接一個地放置
2、Box 垂直方向的距離由 margin 決定。屬於同一個 BFC 的兩個相鄰 Box 的 margin
會發生重疊
第一條就很好理解,就拿最簡單的例子來說明:標准流布局
正如第一條:標准流布局的盒子會上下排列,獨占一行。
而第二條的前半句 就是margin可以擠開盒子與盒子直接的距離。
代碼實現:
后半句就是外邊距塌陷問題
怎么理解呢? 大盒子里面套個小盒子,再給定了margin值 此時就會出現第二條后半句的情況
比如下面情況:
正常布局,當我們給了父盒子一個margin-top的值,自然會頂着上面往下走100px,
但此時我們也想讓子盒子在父盒子里面往下走50px,給定子盒子margin-top值並不能實現。
這就是外邊距塌陷,也是第二條后半句 屬於同一個 BFC 的兩個相鄰 Box 的 margin
會發生重疊,這也就沒有形成BFC,
那我還是想讓子盒子也在父盒子往下走個50px怎么辦呢?,那么回去看看形成BFC的條件第五條:5、overflow 不為 visible
給父元素 overflow: hidden; 唄!
效果實現。總結一下:
此時這個大的父盒子就形成了BFC,回顧概念它是一個形成BFC的特性第五條應該也能理解
這樣就初步地理解了BFC是什么。
再舉個栗子:
搞張圖片,丟進一個盒子里:
快看,並沒有給box高度圖片就把盒子撐開了,因為背景顏色顯現了。
那么看好了 此時給圖片一個浮動 float: left;
現在背景顏色沒了,box的高度也沒了 完了芭比Q了~
前后來對比一下!
為甚會這樣,因為浮動的元素脫落標准文檔流(就是我們所說的托標了,不會有人忘記了HTML的知識了吧),浮在了普通文檔流之上了。
那么怎么讓box形成BFC呢? 很簡單看形成條件唄,也加 overflow: hidden;
加上之后就和最初是一樣的,box有高度 也被撐開 也就變成了BFC
變成了BFC有什么特性呢?現在來一起看 形成BFC的特性第六條:
6、計算 BFC 的高度時,浮動元素也參與計算
box形成了BFC,img浮動參與計算,沒有給box高度,img參與計算box就被撐開了。
那么接着再來
我們在加一個p標簽
如果按最開始的布局應該這樣:
那么圖片有浮動是這樣:
那么有時候我們因為布局不想讓p標簽在圖片下面怎么辦呢?
很簡單給p加overflow: hidden; 唄! 還真是好用吼~
那么接着回去看形成BFC的特性第四條:
4、BFC 的區域不會與 float box 重疊
p標簽形成了BFC獨立區域就不與浮動的img重疊,很好理解嘛.
HTML標簽符合了一些條件或者特性就形成了BFC
所以這么多條件有一個就能形成BFC,並不是需要都具備所有的條件,哦~搜嘎~這不就懂了嘛!
這么多特性就不一一舉例了,形成條件多記一兩個夠用了
接下來有精力的人可以去嘗試理解一下第三條形成BFC的特性
結尾總結一下:
相信講到這里大家應該就理解了到底什么是BFC了,其實bfc就是一個獨立的渲染區域、一個抽象的概念,並不是什么標簽,什么css樣式。最初我看到這個概念也是不理解。學習之后才明白原來前面學的知識里早就出現了BFC ,一直陪在我們身邊了,只是近些年推出了這個概念。
好的,今天就暫時分享到這里。
希望這篇文章能幫助到大家,讓你能很好 很簡單的理解到底什么是BFC。