HTML&CSS重點知識點合集第二篇。其他文章見文末。html
前一章咱們瞭解了語義化HTML結構的重要性,也清楚了在寫網頁結構時如何去寫,如今咱們來看看HTML5和CSS中一個很是重要的知識點——BFC。web
BFC(Block Formatting Context),顧名思義,塊格式化上下文。在講它以前,咱們先來看看下面兩點:瀏覽器
首先,什麼是盒子?什麼又是塊盒子?佈局
CSS有一個概念,叫CSS視覺格式化模型(visiual formatting model)。它是用來處理和在視覺媒體上顯示文檔時使用的計算規則。它會根據CSS盒子模型將文檔中的元素轉換爲一個個盒子。也就是說,它定義了盒子的生成。盒子主要包括了塊盒、行內盒、匿名盒以及一些實驗性的盒子,盒子的類型由 display
來決定。post
塊盒子(Block Box),前面說了,盒子的類型由屬性 display
來決定。當元素的 display
爲 block
、 list-item
或 table
時,這個元素就將是塊級元素。一個塊級元素會被格式化成一個塊,默認按照垂直方向排列。每一個塊級元素都會生成至少一個塊級盒子(即主塊級盒子,principal block-level box),而且每一個塊級盒子都會參與塊格式化上下文的建立。學習
咱們說了塊級盒子,那塊級盒子和塊盒子是啥關係?flex
咱們先來看看另外一個概念——塊容器盒子。塊容器盒子指的是該元素的直接子元素只有塊級盒子或只有行內級盒子。flexbox
A block container box either contains only block-level boxes or establishes an inline formatting context and thus contains only inline-level boxes.3d
若是仍是理解起來有些費力,咱們不妨來看張圖片:code
知道塊容器盒子的概念後,咱們再來講塊盒子。塊盒子就是塊容器盒子的一個子集,即當塊容器盒子內的元素所有都是塊級盒子時,它就是塊盒子。有點繞?其實咱們能夠簡單的理解成,塊盒子就是塊容器盒子中的元素都是塊級盒子。行內盒(Inline Box)& 匿名盒(Anonymous Block Boxes)詳情請見:盒類型。
其次,盒子的定位方案有哪些?
在佈局的時候,瀏覽器會根據元素的盒類型和上下文對這些元素進行定位。定位時有三種定位方案,分別是常規流,浮動以及絕對定位。
常規流(Normal flow)
position
爲 static
或 relative
,而且 float
爲 none
時會觸發常規流position
的值爲 static
),盒的位置是常規流佈局。position
的值爲 relative
),盒偏移的位置由 top
,bottom
,left
,right
定義。不過,即使有偏移,仍然保留原有的位置。浮動(Float)
絕對定位(Absolute positioning)
position
的值爲 absolute
或 fixed
,它就是絕對定位元素position: absolute
,元素的定位將相對於最近的一個 ralative
、fixed
或 absolute
的父元素,若是沒有則相對於 body
。好了,如今咱們講回到 塊格式化上下文。從上面的信息能夠看出,塊格式化上下文是頁面CSS視覺渲染的一部分,用於決定塊盒子的佈局及浮動相互影響範圍的一個區域。
<html>
position
爲 absolute
或 fixed
display: inline-block
display: table-cell
overflow
值不爲 visible
的塊元素display: flex
或 inline-flex
一個BFC包含建立該上下文元素的全部子元素,但不包括建立了新BFC中的任意元素。一句話歸納就是,一個元素不能同時存在於兩個BFC中。
BFC的一個重要的效果就是讓處於BFC內部的元素與外部的元素相互隔離。可見,咱們能夠利用這個特定來防止浮動元素與其它元素重疊 —— 讓重疊元素建立一個BFC,兩個BFC之間互不干擾。
margin
會發生疊加根據BFC的這些特性,咱們如今能夠分析一下一些常見的問題:
第一個問題是指,當咱們對子元素設置浮動後,父元素高度發生塌陷現象。這是由於當咱們爲子元素設置浮動後,子元素建立了一個BFC,而其父元素沒有建立BFC,所以父元素計算高度時並無將浮動元素的高度算入,致使父元素的高度塌陷。根據特性,很容易想到解決方案之一就是讓父元素也建立一個BFC。(特性4)
第二個問題是特性2的表現,解決方案之一就是爲兩個相鄰的盒分別建立一個BFC,兩個BFC相互之間不會影響。
這是HTML&CSS重點知識點合集的其中一篇,合集其它文章:
1.語義化HTML的重要性
3.CSS佈局神器——伸縮盒(語法篇)
4.網格佈局 ——(語法篇)
參考文章:
1.學習BFC-2017-09-12