寫在最前:BFC看起來是個很陌生的概念但它卻時時發生在咱們工做中,如何清除浮動影響?如何避免margin穿透問題?如何編寫兩欄自適應佈局?都和BFC有這密不可分的關係,下面走進切圖妞的世界,分分鐘搞定BFC!
BFC概念html
塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是塊盒子的佈局過程發生的區域,也是浮動元素與其餘元素交互的區域。簡而言之,BFC就是一種邊距重疊的解決方案。git
BFC原理github
主流:瀏覽器
float+float具備包裹性和破壞性致使沒法自適應,通常用在塊狀浮動佈局
)absolute脫離文檔流
)overflow可自適應,但因爲溢出不可見限制了應用場景
)inline-block具備包裹性,沒法自適應,IE8如下沒法識別該屬性
)table-cell具備包裹性,無溢出特性,絕對寬度也能自適應
)非主流:ide
寫樣式的時候經常懷疑個人margin是被瀏覽器吞掉了嗎?
做爲一個子元素想離父元素上邊距有50px的距離,正常狀況下是這麼顯示的佈局
<section class="sec" style="overflow:hidden"> <article class="child">height: 50px;margin-top: 50px;</article> </section>
.sec { background: #ebf6fd; } .child { height: 50px;background: #09d;margin-top: 50px; line-height: 50px;}
子元素的margin-top值由於穿透問題沒有實現預想效果flex
解決方法:使父元素變爲BFC,添加overflow:hidden的樣式,就會實現以下效果
<section class="sec" style="overflow:hidden"> <article class="child">height: 50px;margin-top: 50px;</article> </section>
書寫列表結構的時候,margin-top爲20px,margin-bottom爲20px,預想中應該出現40px的效果,可是正常狀況下是這樣的:url
<section class="margin"> <p>切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞</p> <p>切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞</p> </section>
.margin {background: #ebf6fd;} .margin p { margin: 20px auto;background: #09d; line-height: 40px;}
margin-top和margin-bottom在垂直方向的邊距會發生重疊現象,margin-top和margin-bottom哪一個大就間隔哪一個的距離。spa
解決方法:給子元素再建立一個父元素,使父元素是BFC
<section class="margin"> <div style="overflow:hidden"> <p>切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞</p> </div> <div style="overflow:hidden"> <p>切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞</p> </div> </section>
圖片與文字組合的結構,咱們常常會使圖片浮動起來,利用float的包裹性,讓文字環繞圖片,以下:3d
<section class="layout"> <img src="img/bqb1.jpg" class="left" alt="" /> <div class="right"> 傻人有傻福 </div> </section>
.layout {background: #ebf6fd;margin-top: 20px;} .layout .left { float: left; width: 150px;height: 168px;} .layout .right {background: #09d;text-align: left; }
可是當咱們想把圖片和文字的區塊獨立分來一左一右的時候呢?
解決方法:使右側元素爲BFC,添加overflow:hidden的樣式
img src="img/bqb1.jpg" class="left" alt="" /> <div class="right" style="overflow:hidden"> 傻人有傻福 </div> </section>
當咱們須要圖片與文字間距20px時,有兩種方法:左側margin-right或者右側padding-left
<img src="img/bqb1.jpg" class="left" style="margin-right:20px" />
<div class="right" style="overflow:hidden;padding-left:20px"> 傻人有傻福 </div>
父元素包含浮動元素,致使父元素塌陷,正常狀況以下:
<section class="floatBorder"> <div class="float">切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞</div> </section>
.floatBorder { background: #ebf6fd;border: 1px solid #FFBE00;margin-top: 20px;} .floatBorder .float { float: left; line-height: 50px; background: #08d;}
父元素塌陷除了border外失去高度,此時須要利用BFC內子元素即便是浮動元素也會參與計算的原理
解決方法:使父元素變成BFC,添加清除浮動類
.clearfix {*zoom: 1 } .clearfix:after {content: '';display: table; clear: both }
具備BFC屬性的元素是一個獨立的容器,它不受子元素影響也不影響子元素!當margin遇到BFC,邊距重疊問題得以解決;當BFC元素身邊存在浮動時,它拒絕了float的包裹性獨立成一個容器不與其重疊;當浮動元素在BFC元素裏面時,計算高度時將內部浮動元素也進行計算,解決了父元素塌陷的問題!
上面示例代碼已上傳,可下載練習修改→BFC Demo
尊重原創,如需轉載請註明出處!