摘要:詳見權威指南塊級元素即塊級元素是源文檔中被格式化為塊的元素,或者屬性為的元素。概念顧名思義塊級格式化上下文。每個元素的的左邊,與包含塊的左邊相接觸對于從左往右的格式化,否則相反。
情景:浮動的高度塌陷時,使用overflow:hidden可使父元素將浮動的子元素包含起來,解決問題。但背后的原理是什么?這就是今天要談的BFC。
在將BFC之前需要先了解幾個概念:
盒子模型(Box model):相信這個大家已經很了解了,這里就不詳細說了。詳見《CSS權威指南》
塊級元素:
Block-level elements are those elements of the source document that are formatted visually as blocks (e.g., paragraphs). The following values of the "display" property make an element block-level: "block", "list-item", and "table".
即塊級元素是源文檔中被格式化為塊(block)的元素,或者display屬性為:"block", "list-item", and "table"的元素。
塊級盒:
Block-level boxes are boxes that participate in a block formatting context. Each block-level element generates a principal block-level box that contains descendant boxes and generated content and is also the box involved in any positioning scheme.
塊級盒主要存在于BFC中,每個塊級元素會產生主要的塊級盒,該盒包含其子框和生成的內容,同時會受到不同定位方案的影響。
塊容器盒
Except for table boxes, and replaced elements,a block-level box is also a block container box. A block container box either contains only block-level boxes or establishes an inline formatting context and thus contains only inline-level boxes. Not all block container boxes are block-level boxes: non-replaced inline blocks and non-replaced table cells are block containers but not block-level boxes. Block-level boxes that are also block containers are called block boxes.
除了表格框和替換元素,其他的塊級盒都是塊容器盒,塊容器盒要么只包含塊級盒,要么建立一個IFC(內行格式化上下文),并不是所有的塊容器盒都是塊級盒:非替代inline-block和非替代table cells是塊容器盒但不是塊級盒。既是塊級盒又是快容器盒的叫做塊盒。
一下是塊級盒、塊盒和塊容器盒三者的關系
正常流:無論是塊級盒或者是行內盒在正常流都屬于格式化上下文,塊級盒存在于BFC,行內盒存在于IFC,所以,正常流格式化上下文中包含BFC和IFC(行內格式化上下文,另一種格式化上下文)。
概念BFC(Block formatting contexts):顧名思義塊級格式化上下文。通俗的說,它是一個獨立的渲染區域,里面只有Block-level box,并規定他們的布局方式,與其他區域互不影響。
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)
BFC布局規則內部的Box會在垂直方向,一個接一個地放置
Box垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰Box的margin會發生重疊。如果相鄰有一個是BFC的話,則BFC里面的子元素margin與外面的Box的margin不重疊。
每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)。即使存在浮動也是如此。
BFC的區域不會與float box重疊,常用來清除浮動和布局。
BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。
計算BFC的高度時,浮動元素也參與計算
BFC應用1.防止margin值重疊(布局規則2)
舉個例子:
BFC
body{padding:0;margin:0} .red{ background:red ; width:200px; height: 200px; margin: 10px; } .black{ background:black ; width:200px; height: 200px; margin: 10px; }
結果margin重疊:
讓紅色方塊變成BFC后:
BFC之防止margin重疊
body{padding:0;margin:0} .red{ background:red ; width:200px; height: 200px; margin: 10px; } .wrap{overflow: hidden;} .black{ background:black ; width:200px; height: 200px; margin: 10px; }
結果margin不重疊
2.清除浮動
父元素包含浮動子元素(全部)時,高度會出現坍塌。
BFC
body{padding:0;margin:0} .wrap{ width: 500px; border: blue solid 2px; } .red{ border: red solid 1px; width:200px; height: 200px; float: left; } .black{ border: black solid 1px; width:200px; height: 200px; float: right; }
結果:
給父元素添加overflow: hidden;后父元素變成BFC,根據布局規則6,父元素會將子元素包含在內。
BFC
body{padding:0;margin:0} .wrap{ width: 500px; border: blue solid 2px; overflow: hidden; } .red{ border: red solid 1px; width:200px; height: 200px; float: left; } .black{ border: black solid 1px; width:200px; height: 200px; float: right; }
結果
3.兩欄自適應布局
如果左欄設置為浮動,右邊一欄正常顯示,則會將浮動會蓋住右邊。
![clipboard.png](/img/bVHIZZ) l>BFC
body{padding:0;margin:0} .left{ border: red solid 1px; width:200px; height: 200px; float: left; } .main{ border: black solid 1px; width:250px; height: 250px; }
結果
給main那一欄添加 overflow: hidden;后變成BFC(根據布局規則2)。
BFC
body{padding:0;margin:0} .left{ border: red solid 1px; width:200px; height: 200px; float: left; } .main{ border: black solid 1px; width:250px; height: 250px; overflow: hidden; }
結果
因為根元素就是一個BFC,文檔中塊級盒的布局規則符合BFC,所以書里面寫的文檔流是從上到下的排列、相鄰塊級之間的margin會發生重疊,浮動會自動形成block等知識點,其實在這里就能找到答案。包括清除浮動、兩欄自適應布局的原理也清晰明了。因此掌握BFC原理也掌握另一種解決問題的思路。
這里有點建議就是盡量閱讀官網的資料,里面的內容最準確,最權威。
以上是我粗淺的理解,如果哪里有問題,請幫忙指出,有未涉及的知識點,歡迎補充。一起學習,共同進步。
參考https://www.w3.org/TR/2011/RE...
https://developer.mozilla.org...
http://www.yangyong.me/css2-b...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115455.html
摘要:官方說法就是它規定了用戶端在媒介中如何處理文檔樹。是的包含塊,同時又是的包含塊,不是絕對的。因此稱為匿名盒子。行內盒子行內級元素會生成行內級盒子,該盒子同時會參與行內格式化上下文的創建。如果只有一個值指定為,則其使用的值來自相等。 作者:陳大魚頭 github: KRISACHAN 盒模型 The CSS box model describes the rectangular b...
摘要:并且這種過程遵循標準的描述只要不是和絕對定位方式布局的,都在普通流里面。定位相對定位在普通流之中,是相對于它在普通流中的位置中進行移動,元素占據原來位置絕對定位脫離普通流,不占據空間相對于距離它最近的那個已定位的祖先相對絕對元素決定的。 視覺格式化模型 頁面(文檔樹)可以想象成是由一個個的Box組合而成的,而視覺格式化模型(Visual formatting model)是一套規則,將...
摘要:盒模型與本文為收集整理總結網上資源旨在系統復習盒模型與節省復習時間閱讀分鐘什么是盒模型每一個文檔中,每個元素都被表示為一個矩形的盒子它都會具有內容區盒模型主要分兩種標準盒模型盒模型怪異盒模型兩者的區別標準盒模型的寬高則為內容區域的寬高盒模型 css盒模型與BFC 本文為收集整理總結網上資源 旨在系統復習css盒模型與bfc 節省復習時間 閱讀10分鐘 什么是盒模型 每一個文檔中,每...
摘要:盒模型與本文為收集整理總結網上資源旨在系統復習盒模型與節省復習時間閱讀分鐘什么是盒模型每一個文檔中,每個元素都被表示為一個矩形的盒子它都會具有內容區盒模型主要分兩種標準盒模型盒模型怪異盒模型兩者的區別標準盒模型的寬高則為內容區域的寬高盒模型 css盒模型與BFC 本文為收集整理總結網上資源 旨在系統復習css盒模型與bfc 節省復習時間 閱讀10分鐘 什么是盒模型 每一個文檔中,每...
摘要:視覺格式化模型瀏覽器在解析渲染我們所寫的內容,順序渲染普通文檔流。渲染結果如下圖這兒有一個知識點文檔流按我的理解就是在瀏覽器渲染顯示的一個模式,這個模式的特點自上而下,從左到右排列規則。如果不特殊指定,瀏覽器會默認當前的渲染是按文檔流模式。 CSS視覺格式化模型 瀏覽器在解析渲染我們所寫的html內容,順序渲染(普通文檔流)。 1 2 3 4 ...
閱讀 3723·2021-11-24 10:23
閱讀 2770·2021-09-06 15:02
閱讀 1273·2021-08-23 09:43
閱讀 2351·2019-08-30 15:44
閱讀 3045·2019-08-30 13:18
閱讀 778·2019-08-23 16:56
閱讀 1742·2019-08-23 16:10
閱讀 535·2019-08-23 15:08