【CSS】深入理解BFC原理及應(yīng)用

BFC的定義###

先看W3C文檔

In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.

In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).

Block Formatting Context,中文直譯為塊級(jí)格式上下文。BFC就是一種布局方式,在這種布局方式下,盒子們自所在的containing block頂部一個(gè)接一個(gè)垂直排列,水平方向上撐滿整個(gè)寬度(除非內(nèi)部盒子自己建立了新的BFC)。兩個(gè)相鄰的BFC之間的距離由margin決定。在同一個(gè)BFC內(nèi)部,兩個(gè)垂直方向相鄰的塊級(jí)元素的margin會(huì)發(fā)生“塌陷”。

文檔這里也間接指出了垂直相鄰盒子margin合并的解決辦法:就是給這兩個(gè)盒子也創(chuàng)建BFC。

通俗一點(diǎn),可以把BFC理解為一個(gè)封閉的大箱子,箱子內(nèi)部的元素?zé)o論如何翻江倒海,都不會(huì)影響到外部。

如何創(chuàng)建BFC###

再來看一下官方文檔怎么說的

Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.

總結(jié)一下就是:

  • float屬性不為none
  • overflow不為visible(可以是hidden、scroll、auto)
  • position為absolute或fixed
  • display為inline-block、table-cell、table-caption

BFC的作用

1. 清除內(nèi)部浮動(dòng)
我們在布局時(shí)經(jīng)常會(huì)遇到這個(gè)問題:對子元素設(shè)置浮動(dòng)后,父元素會(huì)發(fā)生高度塌陷,也就是父元素的高度變?yōu)?。解決這個(gè)問題,只需要把把父元素變成一個(gè)BFC就行了。常用的辦法是給父元素設(shè)置overflow:hidden。
2. 垂直margin合并
在CSS當(dāng)中,相鄰的兩個(gè)盒子的外邊距可以結(jié)合成一個(gè)單獨(dú)的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結(jié)合成的外邊距稱為折疊外邊距。
折疊的結(jié)果:

  • 兩個(gè)相鄰的外邊距都是正數(shù)時(shí),折疊結(jié)果是它們兩者之間較大的值。
  • 兩個(gè)相鄰的外邊距都是負(fù)數(shù)時(shí),折疊結(jié)果是兩者絕對值的較大值。
  • 兩個(gè)外邊距一正一負(fù)時(shí),折疊結(jié)果是兩者的相加的和。
    這個(gè)同樣可以利用BFC解決。關(guān)于原理在前文已經(jīng)講過了。

3. 創(chuàng)建自適應(yīng)兩欄布局
在很多網(wǎng)站中,我們??吹竭@樣的一種結(jié)構(gòu),左圖片+右文字的兩欄結(jié)構(gòu)。

//CSS
*{
        margin: 0;
        padding: 0;
    }
    .box {
        width:300px;
        border: 1px solid #000;
    }
    .img {
        float: left;
    }
    .info {
        background: #f1f1f1;
        color: #222;
    }
//HTML
<div class="box">
        <img src="03.jpg" alt="" class="img">
        <p class="info">信息信息信息信息信息信息</p>
    </div>

一般情況下,它是這樣的

圖1

但是當(dāng)文字多了以后...

圖2

顯然,這是文字受到了圖片浮動(dòng)的影響。當(dāng)然,如果你想做文本繞排的效果,浮動(dòng)是不二之選。不過在這里,這顯然不是我們想要的。此時(shí)我們可以為P元素的內(nèi)容建立一個(gè)BFC,讓其內(nèi)容消除對外界浮動(dòng)元素的影響。給文字加上overflow:hidden


圖3

兩欄布局就完成了。我們改變圖片的大小:


圖4

兩欄布局的結(jié)構(gòu)依然沒有改變,如此就實(shí)現(xiàn)了兩欄自適應(yīng)布局。

參考鏈接:
https://www.w3.org/TR/CSS2/visuren.html#block-formatting
http://www.zhangxinxu.com/wordpress/?p=4588

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,154評(píng)論 1 92
  • 1.浮動(dòng)元素有什么特征?對父容器、其他浮動(dòng)元素、普通元素、文字分別有什么影響? 何謂浮動(dòng)元素?有什么特征?所謂浮動(dòng)...
    草鞋弟閱讀 928評(píng)論 0 1
  • 先前在學(xué)習(xí)CSS float時(shí),有同學(xué)提到了BFC這個(gè)詞,作為求知好問的好學(xué)生,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對閱讀 6,690評(píng)論 3 19
  • 1.解決margin疊加問題 三P每個(gè)p之間的距離為50px,發(fā)生了外邊距疊加。 要解決這個(gè)疊加問題即讓每個(gè)P之間...
    歲月幫兇ds閱讀 552評(píng)論 1 0
  • #幸福是需要修出來的~每天進(jìn)步1%~幸福實(shí)修11班~學(xué)號(hào)10#賈雙紅 20170910(23/30) 【幸福三朵】...
    幸福實(shí)修賈雙紅閱讀 216評(píng)論 1 1

友情鏈接更多精彩內(nèi)容