是 W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其餘元素的關係和相互做用。css
每個元素左外邊(margin)與包含塊的左邊相接觸(對於從右到左的格式化,右外邊接觸右邊), 即便存在浮動也是如此(儘管一個元素的內容區域會因爲浮動而壓縮),除非這個元素也建立了一個新的 Block Formatting Context 。chrome
例如:
<div class="con"> <img class="headImg floatLeft" src="mm.jpg" /> <div class="mainCon">many text and pic here</div> </div>
.headImg 和 div.mainCon的左外邊框是與div.con左邊框接觸的,當div.mainCon內容較多時,表現爲圍繞浮動的.headImg元素,觸發div.mainCon元素的BFC即避免圍繞浮動元素,從而實現2列布局.佈局
當涉及到可視化佈局的時候,Block Formatting Context提供了一個環境,HTML元素在這個環境中按照必定規則進行佈局。BFC環境中的元素不會影響到其它環境中的佈局。好比浮動元素會造成BFC,浮動元素內部子元素的主要受該浮動元素影響,兩個浮動元素之間是互不影響的。這裏有點相似一個BFC就是一個獨立的行政單位的意思。ui
若是一個浮動元素後面跟着一個非浮動的元素,那麼就會產生一個覆蓋的現象,不少自適應的兩欄佈局就是這麼作的。好比下圖的效果,參考例子spa
<div style="float:left; border: 2px solid red"><img src="user-img" /></div> <p style="border: 2px solid blue;display:block;overflow:hidden;*zoom:1"> The quick brown fox jumped over the 4seohunt.com lazy dog's back. The quick brown fox jumped over the lazy dog's back. The quick brown fox jumped over the lazy dog's back. The quick brown fox jumped over the lazy dog's back. The quick brown fox jumped over the lazy dog's back. </p>
只要把父元素設爲BFC就能夠避免子元素的浮動致使父元素的高度塌陷的問題,最多見的用法就是在父元素上設置overflow: hidden樣式,對於IE6加上zoom:1就能夠了(觸發IE Haslayout)。scala
按照BFC的定義,只有同屬於一個BFC時,兩個元素纔有可能發生垂直Margin的重疊,這個包括相鄰元素,嵌套元素,只要他們之間沒有阻擋(例如邊框,非空內容,padding等)就會發生margin重疊。(子元素和父元素margin重疊,子元素和父元素的兄弟元素margin重疊)code
所以要解決垂直margin重疊問題,只要讓它們不在同一個BFC就好了,可是對於兩個相鄰元素來講,意義不大,沒有必要給它們加個外殼,可是對於嵌套元素來講就頗有必要了,只要把父元素設爲BFC就能夠了。這樣子元素的margin就不會和父元素的margin發生重疊了。orm
<div class="prev">prev div</div> <div class="next mt10 h100 bg-darkred"> <h2 class="mt100 h10 bg-darkblue">i am title</h2> </div>
div.pre 和 div.next的垂直間距爲100px; 由於 div.next 和它內部的h2屬於同一個BFC,因此垂直margin重疊了(h2的垂直margin穿透了父元素 影響了父元素和其餘元素的關係)seo
解決方法:string