淺談BFC

BFC 的中文意思是塊級格式化上下文,是用于布局塊級盒子的獨(dú)立渲染區(qū)域,一個創(chuàng)建了新的 BFC 的盒子是獨(dú)立布局的,盒子內(nèi)元素的布局 不會影響盒子外面的元素。簡單來說就是 BFC 就是 css 的一個布局概念,是一個獨(dú)立的區(qū)域(容器) 滿足下列條件之一就可以觸發(fā) BFC:

HTML 根元素

position 為 absolute 或 fixed

float 屬性不為 none(常用)

overflow 不為 visible(常用)

display 為 inline-block, table-cell, table-caption, flex(常用)

可以解決什么問題:margin 重疊,清除浮動,自適應(yīng)布局.

BFC 是什么
我們在頁面布局的時候,經(jīng)常出現(xiàn)以下情況:

這個元素高度怎么沒了?

這兩欄布局怎么沒法自適應(yīng)?

這兩個元素的間距怎么有點(diǎn)奇怪的樣子?

......

原因是元素之間相互的影響,導(dǎo)致了意料之外的情況,這里就涉及到BFC概念

BFC(Block Formatting Context),即塊級格式化上下文,它是頁面中的一塊渲染區(qū)域,并且有一套屬于自己的渲染規(guī)則:

內(nèi)部的盒子會在垂直方向上一個接一個的放置

對于同一個 BFC 的倆個相鄰的盒子的 margin 會發(fā)生重疊,與方向無關(guān)。

每個元素的左外邊距與包含塊的左邊界相接觸(從左到右),即使浮動元素也是如此

BFC 的區(qū)域不會與 float 的元素區(qū)域重疊

計算 BFC 的高度時,浮動子元素也參與計算

BFC 就是頁面上的一個隔離的獨(dú)立容器,容器里面的子元素不會影響到外面的元素,反之亦然

BFC目的是形成一個相對于外界完全獨(dú)立的空間,讓內(nèi)部的子元素不會影響到外部的元素

觸發(fā)條件
根元素(HTML)

浮動元素:float屬性不為none

絕對定位元素:position屬性為absolute或fixed

display為inline-block、table-cell等塊狀元素

overflow屬性值不為visible的塊級元素

當(dāng)滿足以上條件之一時,就會創(chuàng)建一個新的BFC區(qū)域,其中元素將按照BFC規(guī)則進(jìn)行布局和渲染。

應(yīng)用場景


<style>

    p{

        color:#f55;

        background:#fcc;

        width:200px;

        line-height:100px;

        text-align:center;

        margin:100px;

    }

</style>

<body>

    <p>Haha</p>

    <p>Hehe</p>

</body>

這時候,邊距則不會重疊:

頁面顯示如下:

兩個p元素之間的距離為100px,發(fā)生了margin重疊(塌陷),以最大的為準(zhǔn),如果第一個 P 的margin為 80 的話,兩個 P 之間的距離還是 100,以最大的為準(zhǔn)。

前面講到,同一個BFC的倆個相鄰的盒子的margin會發(fā)生重疊

可以在p外面包裹一層容器,并觸發(fā)這個容器生成一個BFC,那么兩個p就不屬于同一個BFC,則不會出現(xiàn)margin重疊


<style>

    .wrap{

        overflow:hidden;// 新的BFC

    }

    p{

        color:#f55;

        background:#fcc;

        width:200px;

        line-height:100px;

        text-align:center;

        margin:100px;

    }

</style>

<body>

    <p>Haha</p>

    <div class="wrap">

        <p>Hehe</p>

    </div>

</body>

這時候,邊距則不會重疊:

清除內(nèi)部浮動


<style>

    .par{

        border:5px solid #fcc;

        width:300px;

    }

    .child{

        border:5px solid #f66;

        width:100px;

        height:100px;

        float:left;

    }

</style>

<body>

    <div class="par">

        <div class="child"></div>

        <div class="child"></div>

    </div>

</body>

頁面顯示如下:

而BFC在計算高度時,浮動元素也會參與,所以我們可以觸發(fā).par元素生活才能BFC,則內(nèi)部浮動元素計算高度時候也會計算


.par{

    overflow:hidden;

}

實(shí)現(xiàn)效果如下:

自適應(yīng)多欄布局

這里舉個兩欄的布局


<style>

    body{

        width:300px;

        position:relative;

    }

    .aside{

        width:100px;

        height:150px;

        float:left;

        background:#f66;

    }

    .main{

        height:200px;

        background:#fcc;

    }

</style>

<body>

    <div class="aside"></div>

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

</body>

效果圖如下:

前面講到,每個元素的左外邊距與包含塊的左邊界相接觸

因此,雖然.aslide為浮動元素,但是main的左邊依然會與包含塊的左邊相接觸

而BFC的區(qū)域不會與浮動盒子重疊

所以我們可以通過觸發(fā)main生成BFC,以此適應(yīng)兩欄布局


.main{

    overflow:hidden;

    }

這時候,新的BFC不會與浮動的.aside元素重疊。因此會根據(jù)包含塊的寬度,和.aside的寬度,自動變窄

效果如下:

小結(jié)
可以看到上面幾個案例,都體現(xiàn)了BFC實(shí)際就是頁面一個獨(dú)立的容器,里面的子元素不影響外面的元素

參考文獻(xiàn)
https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context

https://github.com/zuopf769/notebook/blob/master/fe/BFC%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90/README.md

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

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

  • 淺談BFC 引入 那是一個寧靜的夜晚,這個夜晚本應(yīng)如此的完美,代碼加英語,看會直播,睡覺,直到,我遇到了她。她令我...
    不曾忽然七日閱讀 263評論 0 0
  • BFC是什么?為啥要知道這個東西?今天我們來搞搞清楚。 首先,我們得弄清楚“視覺格式化模型”(visual for...
    cyuamber閱讀 513評論 0 0
  • 常見的布局方案 在講 BFC 之前,我們先來了解一下常見的布局方案,有三種常見方案: 普通流 (normal fl...
    饑人谷_zhangfan閱讀 335評論 0 0
  • 什么是BFC? BFC(Blcok Formatting Context) 塊級格式化上下文,僅僅概念上理解是不夠...
    泡杯感冒靈閱讀 293評論 0 0
  • 在我們的開發(fā)中常聽到BFC這個詞,當(dāng)要讓我說出BFC 是什么,卻不能很好的卻解釋,似懂非懂。反正就是沒有清晰的理解...
    費(fèi)萊姆閱讀 316評論 0 1

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