理解css中的BFC

BFC 即 Block Formatting Contexts (塊級格式化上下文),它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。

具有 BFC 特性的元素可以看作是隔離了的獨立容器,容器里面的元素不會在布局上影響到外面的元素,并且 BFC 具有普通容器所沒有的一些特性。

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

觸發(fā)

只要元素滿足下面任一條件即可觸發(fā) BFC :

  • body 根元素
  • 浮動元素:float 除 none 以外的值
  • 絕對定位元素:position (absolute、fixed)
  • display 為 inline-block、table-cells、flex
  • overflow 除了 visible 以外的值 (hidden、auto、scroll)

布局特性

具備 BFC 屬性的元素,在頁面布局上會有如下特性:

  • 內(nèi)部的塊級 Box 會在垂直方向上挨個排列
  • 屬于同一個 BFC 的兩個相鄰 Box 的 margin 會發(fā)生重疊
  • 子元素的 margin 左邊界,與父容器的 border 左邊界是相接觸的,即使設(shè)置了浮動依然如此
  • 具備 BFC 的區(qū)域不會與浮動的 Box 發(fā)生重疊
  • BFC 就是頁面的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素,反之亦然
  • 計算 BFC 的高度時,浮動元素也參與計算

應(yīng)用

利用上述的這些 BFC 特性,我們可以總結(jié)出 BFC 具備如下的運用場景:

兩欄或三欄自適應(yīng)布局

以兩欄為例,如果不給 main 容器添加 overflow: hidden 屬性,main 容器會延展到浮動區(qū)域,使其成為 BFC 后,便可使其實現(xiàn)寬度自適應(yīng)。

<div>
    <div class="float"></div>
    <div class="main"></div>
</div>

<style>
.float{
    width: 200px;
    height: 500px;
    background: skyblue;
    float: left;
}
.main{
    background: pink;
    height: 600px;
    overflow: hidden; /* 使其成為 BFC */
}
</style>

完整代碼-在線預(yù)覽

這個方法也可運用于解決一個元素被浮動元素覆蓋的問題,請戳-完整代碼-在線預(yù)覽

解決父容器高度塌陷

我們知道浮動元素會脫離文檔流,當(dāng)父容器的所有子元素都設(shè)置浮動后,會導(dǎo)致父容器出現(xiàn)高度“塌陷”的問題,如果讓父容器設(shè)置為 BFC ,那么它就會包裹浮動元素,從而解決高度“塌陷”:

<div class="wrap">
    <div class="box"></div>
    <div class="box"></div>
</div>

<style>
.wrap{
    border: 1px solid red;
    overflow: hidden; /* 使其成為 BFC */
}
.box{
    width: 50px;
    height: 50px;
    background: skyblue;
    float: left;
}
</style>

完整代碼-在線預(yù)覽

解決垂直方向 margin 重疊

從上述 BFC 的特性我們知道子元素垂直方向的距離由 margin 決定,屬于同一個 BFC 的兩個相鄰子元素的 margin 會發(fā)生重疊,解決辦法就是使這兩個相鄰的子元素分別屬于不同的 BFC:

<div class="wrap">
    <div class="box">1</div>
    <div class="inner">
        <div class="box">2</div>
    </div>
</div>

<style>
.box {
    width: 50px;
    height:50px;
    background: skyblue;
    margin: 50px;
}
.inner{
    overflow: hidden;
}
</style>

這里我們給其中一個 Box 外面包一個 div(即 inner 容器),然后通過觸發(fā)外面這個 div 的 BFC ,就可以阻止這兩個 Box 的 margin 重疊。

完整代碼-在線預(yù)覽

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

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

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