【前端學(xué)習(xí)筆記】CSS常見問題之BFC

之前在開發(fā)的時(shí)候,總會(huì)遇到margin塌陷,浮動(dòng)布局等問題,也知道怎么去解決,但始終不知道其內(nèi)部原理,后來也是通過網(wǎng)友的一篇文章,點(diǎn)醒了我,下面就分享給大家

一 什么是BFC?

BFC(Block formattingcontext)直譯為"塊級(jí)格式化上下文"。它是一個(gè)獨(dú)立的渲染區(qū)域,只有塊級(jí)盒子元素參與,它規(guī)定了內(nèi)部的塊級(jí)盒子元素如何布局,并且與這個(gè)區(qū)域外部毫不相干。

塊級(jí)盒子元素:display:block, list-item, table 這些元素會(huì)參與BFC布局

Formatting Context:Formatting context 是 W3C CSS2.1 規(guī)范中的一個(gè)概念。它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡(jiǎn)稱BFC)和 Inline formatting context (簡(jiǎn)稱IFC)。

二 BFC的布局規(guī)則

1.內(nèi)部的Box會(huì)在垂直方向,一個(gè)接一個(gè)地放置
2.Box垂直方向的距離由margin決定。屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊(傳說中的margin塌陷)
3.每個(gè)盒子(塊盒與行盒)的margin box的左邊,與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化,否則相反)。即使存在浮動(dòng)也是如此
4.BFC的區(qū)域不會(huì)與float box重疊
5.BFC就是頁面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面的元素。反之也如此
6.計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算

如何創(chuàng)建BFC

1.float的值不是none
2.position的值不是static或者relative
4.display的值是inline-block、table-cell、flex、table-caption或者inline-flex
5.overflow的值不是visible

三 BFC應(yīng)用

1.解決margin塌陷問題

html部分

   <div class="top">1</div>
   <div class="bottom">2</div>

css部分

.top{
    margin: 30px;
    width: 150px;
    height: 300px;
    background: lime;
    color: #fff;
}
.bottom{
    margin: 50px;
    width: 150px;
    height: 300px;
    background: rgb(134, 68, 37);
    color: #fff;
}
微信截圖_20210501172603.png

此時(shí)的上下兩個(gè)元素間margin為數(shù)值大的那個(gè)值,即bottom類對(duì)應(yīng)的margin
我們稍加改造一下.bottom的樣式 加上display:inline-block(參考如何創(chuàng)建BFC中的第四條)

.bottom{
    margin: 50px;
    width: 150px;
    height: 300px;
    background: rgb(134, 68, 37);
    color: #fff;
    display: inline-block; 
}
image.png

此時(shí)會(huì)發(fā)現(xiàn),上下兩個(gè)元素的margin的值為各自的margin值,從而解決了margin塌陷

2.清除浮動(dòng)

html部分

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

css部分

.wrap {
    background: lime;
    border: 20px solid linen;
}
.item{
    float: left;
    background: lightsalmon;
    height: 100px;
    width: 150px;
    margin: 10px;
}

image.png

可以看到 父元素沒設(shè)置高度,子元素設(shè)置浮動(dòng)時(shí),父元素的高度沒有被撐開,這時(shí)需要清除浮動(dòng)
我們參考如何設(shè)置BFC中的第五條 設(shè)置overflow屬性auto或者h(yuǎn)idden
奇跡出現(xiàn)鳥!
image.png

此外,還可以設(shè)置display:inline-block(只不過需要給定父容器寬度)

image.png

3.自適應(yīng)兩列布局

每個(gè)盒子的margin box的左邊,與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化,否則相反)。即使存在浮動(dòng)也是如此。(這有些抽象,直接看效果吧)

    <div class="left">1</div>
    <div class="right">2</div>
.left{
    width: 150px;
    background: coral;
    color: #fff;
    text-align: center;
    height: 300px;
    float: left;
}
.right{
    background:lightseagreen;
    color: #fff;
    text-align: center;
    height: 500px;
}

image.png

此時(shí)當(dāng)然不是我們期望的結(jié)果,所以參考BFC的區(qū)域不會(huì)與float box重疊
我們單獨(dú)給right類設(shè)置BFC (加上overflow:hidden)
image.png

四 總結(jié)

這幾個(gè)例子都說明了

BFC就是頁面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面的元素。反之也如此。

[參考文章]
什么是BFC?看這一篇就夠了_Leon的博客-CSDN博客_bfc

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

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

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