寫在最前:BFC看起來是個很陌生的概念但它卻時時發生在我們工作中,如何清除浮動影響?如何避免margin穿透問題?如何編寫兩欄自適應布局?都和BFC有這密不可分的關系,下面走進切圖妞的世界,分分鐘搞定BFC!一、什么是BFC?
BFC概念
塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是塊盒子的布局過程發生的區域,也是浮動元素與其他元素交互的區域。簡而言之,BFC就是一種邊距重疊的解決方案。
BFC原理
BFC內部元素的元素在垂直方向上的邊距會發生重疊
BFC不會與浮動元素重疊
BFC是獨立的容器,不會影響里面的元素,里面的元素也不會影響外面元素
計算BFC元素高度時,浮動元素也會參與計算
二、BFC產生條件主流:
根元素或包含根元素的元素
浮動元素:float不為none(float+float具有包裹性和破壞性導致無法自適應,一般用在塊狀浮動布局)
絕對定位元素:position不為static或者relative(absolute脫離文檔流)
overflow 值不為 visible 的塊元素(overflow可自適應,但由于溢出不可見限制了應用場景)
行內塊元素:display為inline-block(inline-block具有包裹性,無法自適應,IE8以下無法識別該屬性)
表格單元格:元素的 display為 table-cell(HTML表格單元格默認為該值,table-cell具有包裹性,無溢出特性,絕對寬度也能自適應)
非主流:
表格標題:元素的 display 為 table-caption,HTML表格標題默認為該值
匿名表格單元格元素:元素的 display為 table、table-row、 table-row-group、table-header-group、table-footer-group(分別是HTML table、row、tbody、thead、tfoot的默認屬性)或 inline-table
display 值為 flow-root 的元素
contain 值為 layout、content或 strict 的元素
彈性元素:display為 flex 或 inline-flex元素的直接子元素
網格元素:display為 grid 或 inline-grid 元素的直接子元素
多列容器:元素的 column-count 或 column-width 不為 auto,包括 column-count 為 1
column-span 為 all 的元素始終會創建一個新的BFC,即使該元素沒有包裹在一個多列容器中
三、BFC使用場景 1、margin穿透問題1寫樣式的時候常常懷疑我的margin是被瀏覽器吞掉了嗎?
作為一個子元素想離父元素上邊距有50px的距離,正常情況下是這么顯示的
.sec { background: #ebf6fd; } .child { height: 50px;background: #09d;margin-top: 50px; line-height: 50px;}
子元素的margin-top值因為穿透問題沒有實現預想效果
解決方法:使父元素變為BFC,添加overflow:hidden的樣式,就會實現如下效果
書寫列表結構的時候,margin-top為20px,margin-bottom為20px,預想中應該出現40px的效果,但是正常情況下是這樣的:
切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞
切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞
.margin {background: #ebf6fd;} .margin p { margin: 20px auto;background: #09d; line-height: 40px;}
margin-top和margin-bottom在垂直方向的邊距會發生重疊現象,margin-top和margin-bottom哪個大就間隔哪個的距離。
解決方法:給子元素再創建一個父元素,使父元素是BFC
3、兩欄自適應布局
圖片與文字組合的結構,我們經常會使圖片浮動起來,利用float的包裹性,讓文字環繞圖片,如下:
傻人有傻福
.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="" />傻人有傻福
當我們需要圖片與文字間距20px時,有兩種方法:左側margin-right或者右側padding-left
4、清除浮動傻人有傻福
父元素包含浮動元素,導致父元素塌陷,正常情況如下:
切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞切圖妞
.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
尊重原創,如需轉載請注明出處!
參考資料:
張鑫旭-CSS深入理解之overflow
MDB-塊格式化上下文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54786.html
寫在最前:BFC看起來是個很陌生的概念但它卻時時發生在我們工作中,如何清除浮動影響?如何避免margin穿透問題?如何編寫兩欄自適應布局?都和BFC有這密不可分的關系,下面走進切圖妞的世界,分分鐘搞定BFC! 一、什么是BFC? BFC概念 塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是塊盒子的布局過程發生的區域,也是浮動元素...
摘要:寫在最前是的一種布局場景。頁腳永遠固定在頁面的底部,頁面內容不夠長的時候頁腳黏在視窗底部,內容足夠長時會被向下移動。老式門戶網站由于內容過短常常版權頁腳前移,移動端特定布局也需要來解決這些問題。 showImg(https://segmentfault.com/img/bVbrIV9?w=200&h=354); 寫在最前:Sticky Footer是css的一種布局場景。頁腳foot...
摘要:寫在最前是的一種布局場景。頁腳永遠固定在頁面的底部,頁面內容不夠長的時候頁腳黏在視窗底部,內容足夠長時會被向下移動。老式門戶網站由于內容過短常常版權頁腳前移,移動端特定布局也需要來解決這些問題。 showImg(https://segmentfault.com/img/bVbrIV9?w=200&h=354); 寫在最前:Sticky Footer是css的一種布局場景。頁腳foot...
閱讀 2309·2021-08-26 14:14
閱讀 2678·2019-08-29 13:07
閱讀 2084·2019-08-26 11:44
閱讀 676·2019-08-26 10:11
閱讀 2410·2019-08-23 15:43
閱讀 3079·2019-08-23 14:17
閱讀 385·2019-08-23 12:36
閱讀 2082·2019-08-22 15:20