面試時經常會被問到有關BFC
的問題,雖然網上有關講解BFC
的文章不少,基本大篇理論知識,雖收穫很多,但面對面試時,殊不知如何回答,不能條理清晰、簡單明瞭的回答出面試官想考察的內容,容易致使回答着把本身都給弄暈了(尤爲在緊張的情緒下,很是容易致使越說越「亂」,從而形成面試官以爲你理解不到位的認知😭)。因此特此記錄下來,一爲了加深對BFC的理解,二則爲了面試能更好的回答。css
雖然上面題目看起來好像不太同樣,可是其實最終考察的點都是同樣的,我們只需分爲什麼是BFC
、BFC有什麼做用
和如何建立BFC
子問題來依依回答便可。html
逢管面試怎麼問BFC,我們就先給它回答一波
什麼是BFC
。git
BFC稱爲塊級格式化上下文,是CSS中的一種渲染機制。是一個擁有獨立渲染區域的盒子(也能夠理解爲結界),規定了內部元素如何佈局,而且盒子內部元素與外部元素互不影響。github
對應的還有IFC、GFC和FFC(後兩個CSS3引入)面試
上面咱們知道BFC
規定了內部元素的佈局渲染,讓咱們查看下CSS規範文檔,看下BFC
有哪些規則:佈局
margin
屬性決定。詳細規則能夠查看9.4.1 塊格式化上下文.net
規則1和規則2應該是好理解的,這裏就不展開敘述,若是你不明白,那麼你可能學了個假CSS。😂3d
這裏是講margin collapse
, 實際上是有以下狀況會發生合併: 1. 父子外邊距;2. 兄弟外邊距;3. 沒有高度的元素自身margin-top
和margin-bottom
會合並。code
不過有幾點須要注意:orm
padding
、border
、clear
和line box
分隔開margin-top
和margin-bottom
只有知足上面幾點纔會發生margin合併效果。
上圖能夠看到,父子的margin-top
和margin-bottom
發生了合併。如何解決呢?觸發元素的BFC便可(注:下面都以設置元素overflow:hidden
來觸發),不過這裏問題來了,咱們是觸發父元素的BFC仍是子元素的BFC呢?
通過試驗,我發現只有觸發父元素的BFC才能避免margin合併,觸發子元素的BFC並沒有效果。
這裏父元素生效能夠借用標準來解釋:
Margins of elements that establish new block formatting contexts (such as floats and elements with "overflow" other than "visible") do not collapse with their in-flow children.(建立了BFC的元素不會和它的子元素髮生外邊距疊加)
那觸發子元素爲什麼沒有生效呢?這裏咱們先看下兄弟之間的合併。
一樣發生了margin合併,這裏不存在父子關係,因此咱們隨便觸發某個元素的BFC來看看效果。
發現仍是發生margin合併,按照規則,雖然觸發了child1的BFC,可是能夠得出兩個元素仍是處於同一個BFC。
通過以上試驗,我得出了未徹底經官方認知的結論:
BFC影響的是內部元素
因此我可使用一個div進行包裹,並觸發該div的BFC,從而使得處於不一樣的BFC中,來避免margin合併。
完美!🎉,咱們這樣就能夠經過觸發BFC來避免margin合併了,固然避免margin合併還有不少方法,好比設置border
等等。
當咱們設置一個元素爲float,該元素脫離文檔流,會覆蓋在下方元素上面。
而若是設置元素BFC,將不會與float重疊,這樣咱們能夠經過該屬性來實現自適應兩欄佈局。
由於浮動元素會脫離文檔流,因此包含塊元素的高度不會包含該浮動元素,致使高度發生塌陷。使用BFC,包含塊的高度包含浮動元素在內。
根據規則+實例,給出BFC有什麼做用。
html
float
的值不爲none
overflow
的值不爲visible
display
的值爲inline-block
、table-cell
、table-caption
position
的值爲absolute
或fixed
若有不對之處,還懇請指出,謝謝~ 🖖 原文連接
好累,花了將近4個小時,第一遍沒保存,又從新寫了一遍。😭