BFC,即Block Format Context,塊級格式化做用域,咱們先無論它的目的是什麼,先來了解下格式化做用域的相關類型。css
文檔流中的行內元素和塊級元素,都屬於格式化做用域,因此格式化做用域有兩種類型:html
格式化做用域,規定了當前節點內部的文檔流不受外界文檔流的影響。
(緣由很簡單啊,由於除了正常文檔流還有其餘形式的文檔流,好比float、fixed、absolute等方式會脫離當前正常文檔流)
說白了就是,html和css的一種約定,若是沒有這種約定,瀏覽器去解析下面的代碼瀏覽器
// html <div class="normal"> <div class="absolute"> <div class="son"></div> </div> </div> //css .normal { position: relative; } .absolute { position: absolute; } .son { position: relative; }
對於normal和absolute兩個div能夠進行正常的解析,那son這個div應該怎麼解析這個div?是屬於noraml內部的仍是absolute內部的?瀏覽器就不知道怎麼辦了,而
有了這種約定,就能夠講son解析爲absolute的節點,對文檔進行更好的解析,而後呈如今瀏覽器上面。app
外邊距摺疊也不是必定會發生的,下面兩種狀況就不會發生摺疊:this
總結起來,就是margin可能會在圖中3個地方發生摺疊:spa
既然外邊距摺疊發生在圖中三個位置,那麼咱們就看看三個位置不發生摺疊的狀況code
若是子節點中有浮動元素,而且其餘節點具有clear:both/left/right,那麼就會把兄弟元素放在浮動元素的邊界下方,可是依然會發生外邊距摺疊。orm
行內元素,好比span等等htm
從左到右,不會發生外邊距摺疊blog
寬度取決於包含內容的寬度,若是屏幕足夠寬,就會把全部的內容一行展現,若是設置了寬度,可能還有overflow,舉個例子:
<P>Several <EM>emphasized words</EM> appear <STRONG>in this</STRONG> sentence, dear.</P>
瀏覽器在解析的時候,會解析爲下面的幾個元素:
Anonymous: "Several" EM: "emphasized words" Anonymous: "appear" STRONG: "in this" Anonymous: "sentence, dear."
可是可能會解析爲一個或者幾個line-box,瀏覽器會作對應的分割,
多是一個line-box:
Several emphasized words appear in this sentence, dear.
多是兩個line-box:
Several emphasized words appear in this sentence, dear.
也多是三個line-box:
Several emphasized words appear in this sentence, dear.
具體的分割原理是取決於對應的line-height能不能相互平衡。
固然若是你設置了具體寬度,能夠設置換行等其餘屬性,好比white-space/word-break等,這裏就不作贅述了。
inline的高度取決於line-height,可是inline-block類別的(還有table-cell等),取決於margin等。總結起來一句話就是,line-height的高度是盒子頂點到底部之間的距離。
在line-box裏面,vertical-align,其中的baseline,就是經過line-height計算得來的,主要包括下面三個部分:
最終baseline上面的高度:A + L/2, baseline下面的高度: D + L/2
固然,具體的A和D取決於瀏覽器的標準和不一樣的文字的標準,畢竟英文和中文對應的就不同。