對(duì)BFC的深層理解

BFC(Block Formatting Context)塊級(jí)格式化上下文

注意:BFC首先是塊姚建,其次需要具備下面的條件之一才可以(通俗來(lái)說(shuō)掸冤,BFC就好比一所985或者211的高校稿湿,想要成為985或者211的高校饺藤,它是有前提條件的策精,首先他得是一所大學(xué)咽袜,不能拿一個(gè)小學(xué)來(lái)說(shuō)询刹,就好比BFC得先是塊萎坷,才是BFC哆档;當(dāng)滿足了前提條件,再需要具備其他的條件才可以比原。)

在正式說(shuō)BFC具體內(nèi)容之前量窘,先說(shuō)一下Box和Formatting Context是個(gè)什么東西:

Box:大家應(yīng)該都不陌生氢拥,Box是CSS布局的對(duì)象和基本單位嫩海,直觀點(diǎn)說(shuō)就是一個(gè)頁(yè)面是由很多個(gè)Box組成的叁怪。不同類型的Box骂束,會(huì)參與不同的Formatting Context(一個(gè)決定如何渲染文檔的容器)展箱,因此Box內(nèi)的元素會(huì)以不同的方式來(lái)渲染混驰。

常見盒子類型:

  • block-level box:display 屬性為block, list-item, table 的元素栖榨,會(huì)生成block-level box明刷。并且參與block fomatting context辈末。
  • inline-level box:display屬性為 inline, inline-block, inline-table 的元素挤聘,會(huì)生成inline-level box。并且參與inline fomatting context鞍陨。
  • run-in box:CSS3中新增的诚撵,是一個(gè)塊/行內(nèi)元素混合,可以使某些塊級(jí)元素成為下一個(gè)元素的行內(nèi)部分幼驶,目前很少有瀏覽器支持該元素盅藻。

Formatting context

Formatting context 是 W3C CSS2.1 規(guī)范中的一個(gè)概念氏淑。它是頁(yè)面中的一塊渲染區(qū)域假残,并且有一套渲染規(guī)則辉懒,它決定了其子元素將如何定位谍失,以及和其他元素的關(guān)系和相互作用快鱼。

常見的Formatting context:

  • Block Formatting Context(簡(jiǎn)稱BFC)
  • Inline Formatting Context(簡(jiǎn)稱IFC)
  • CSS2.1 中只有BFC和IFC, CSS3中還增加了GFC和FFC抹竹。

BFC(Block formatting context)直譯為"塊級(jí)格式化上下文"窃判。它是一個(gè)獨(dú)立的渲染區(qū)域,只有Block-level box參與創(chuàng)建BFC窿凤, 它規(guī)定了內(nèi)部的Block-level Box如何布局雳殊,并且與這個(gè)獨(dú)立盒子里的布局不受外部影響夯秃,當(dāng)然也不會(huì)影響到外面的元素仓洼。

BFC的觸發(fā)條件:

  1. 根元素 (當(dāng)前文檔中 html 標(biāo)簽就是一個(gè)BFC)
  2. float 的值不為 none
  3. overflow 的值不為 visible(有 hidden色建,auto,scroll)
  4. display 的值為 inline-block / table-cell / table-caption / flex / inline-flex
  5. position 的值為 absolute 或 fixed

BFC的特性(優(yōu)點(diǎn))以及應(yīng)用場(chǎng)景

1某残、box垂直方向的距離由margin決定玻墅,屬于同一個(gè)BFC的兩個(gè)相鄰box的margin會(huì)發(fā)生重疊

應(yīng)用場(chǎng)景:可以解釋為什么margin上下會(huì)重疊澳厢,以及解決方法的原因
  • 問(wèn)題分析:默認(rèn)情況下剩拢,兩個(gè)相鄰的box的margin會(huì)發(fā)生重疊的原因徐伐,是因?yàn)閎ox1和box2都屬于html搬素,而html是BFC熬尺。BFC里面規(guī)定了粱哼,屬于同一個(gè)BFC的兩個(gè)相鄰box的margin會(huì)發(fā)生重疊揭措,所以box1和box2重疊了刻蚯,也就是外邊距重疊炊汹。

默認(rèn)情況下,兩個(gè)相鄰的box的margin會(huì)發(fā)生重疊:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body{margin: 0;padding: 0;}
            .box1{width: 300px;height: 300px;background: red;margin-bottom: 50px;}
            .box2{width: 400px;height: 400px;background: yellow;margin-top: 100px;}
        </style>
    </head>
    <body>
        <div class="box1"></div>
        <div class="box2"></div>    
    </body>
</html>

如圖所示


BFC特性1

BFC特性1
  • 重疊之后,想要不重疊伴找,可以給后面的元素添加一個(gè)父元素并且添加聲明overflow: hidden;來(lái)解決(添加其他聲明也可以,只要可以觸發(fā)BFC即可)
  • 可以解決的原因是因?yàn)槎队?dāng)給box2添加了父元素并且添加了overflow:hidden;之后寸五,這個(gè)父元素boxs就是BFC了梳杏,當(dāng)前的結(jié)構(gòu)里面box1屬于BFC html淹接,box2屬于BFC boxs塑悼,這個(gè)時(shí)候box1和box2就不屬于同一個(gè)BFC了,那么也就不會(huì)發(fā)生重疊了霞势。

具體代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body{margin: 0;padding: 0;}
            .box1{width: 300px;height: 300px;background: red;margin-bottom: 50px;}
            .box2{width: 400px;height: 400px;background: yellow;margin-top: 100px;}
            .boxs{overflow: hidden;}  
        </style>
    </head>
    <body>
        <div class="box1"></div>
        <div class="boxs">
            <div class="box2"></div>
        </div>
    </body>
</html>

如圖所示
實(shí)現(xiàn)效果:(給box2添加父元素并聲明觸發(fā)BFC即可解決)


BFC特性1

2愕贡、計(jì)算BFC的高度時(shí)固以,浮動(dòng)元素也參與計(jì)算

應(yīng)用場(chǎng)景:可以解釋為什么高度塌陷可以用overflow:hidden等方法解決
  • 分析:為什么添加了overflow:
    hidden;就可以解決高度塌陷憨琳,是因?yàn)樘砑恿酥笱眩陀|發(fā)ul為BFC问拘,而BFC里面規(guī)定了慢味,計(jì)算BFC高度的時(shí)候纯路,浮動(dòng)元素也參與計(jì)算驰唬。

ul未觸發(fā)BFC時(shí)叫编,li浮動(dòng)時(shí)霹抛,ul高度塌陷:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body,ul{margin: 0;padding: 0;}
            ul{border: 3px solid red;}
            ul li{float: left;list-style: none;border: 1px solid yellow;}
        </style>
    </head>
    <body>
         <ul>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         </ul>
    </body>
</html>

如圖所示


BFC特性2

當(dāng)給ul添加了overflow:hidden霞篡;之后端逼,就觸發(fā)了ul為BFC顶滩,而計(jì)算BFC高度的時(shí)候礁鲁,浮動(dòng)元素也參與計(jì)算:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body{margin: 0;padding: 0;}
            ul{border: 3px solid red;overflow: hidden;}
            ul li{float: left;list-style: none;border: 1px solid yellow;}
        </style>
    </head>
    <body>
         <ul>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         <li>浮動(dòng)元素</li>
         </ul>
    </body>
</html>

如圖所示


BFC特性2

overflow:auto冗美,scroll或者display:flex着憨,inline-flex甲抖,table等心铃,都可以解決高度塌陷,也是因?yàn)橛|發(fā)了ul為BFC

3柱衔、BFC的區(qū)域不會(huì)與float box發(fā)生重疊

應(yīng)用場(chǎng)景:自適應(yīng)兩欄布局或者三欄布局
  • 分析: 上面的一個(gè)元素浮動(dòng)唆铐,下面的一個(gè)元素沒(méi)有浮動(dòng),那么會(huì)發(fā)生重疊艾岂,原因是因?yàn)楦?dòng)之后不占據(jù)位置王浴,所以后面的元素會(huì)上去
  • 當(dāng)給下面的元素添加了float、overflow秒裕、display的時(shí)候就不重疊了几蜻,原因是因?yàn)榻o了這些聲明之后入蛆,就觸發(fā)了下面的元素為BFC硕勿,而BFC里面規(guī)定了源武,BFC區(qū)域不會(huì)與浮動(dòng)盒子發(fā)生重疊粱栖。
  • 如果既要BFC區(qū)域不會(huì)與float box發(fā)生重疊,又要右邊的容器自適應(yīng):
    float不可以幔崖,
    overflow:hidden赏寇、auto嗅定、scroll用踩;可以,
    display:flex姊扔、inline-flex旱眯;可以证九。

當(dāng)上面元素設(shè)置浮動(dòng)呀页,下面元素沒(méi)有浮動(dòng),那么就會(huì)發(fā)生重疊:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .left {width: 300px;height: 300px;background: red;float: left;}
            .right {height: 400px;background: yellow;}
        </style>
    </head>
    <body>
        <div class="left">left</div>
        <div class="right">right</div>
    </body>
</html>

如圖所示


BFC特性3

當(dāng)下面元素添加聲明丸氛,觸發(fā)BFC缓窜,就不會(huì)與浮動(dòng)盒子發(fā)生重疊:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .left {width: 300px;height: 300px;background: red;float: left;}
            .right {height: 400px;background: yellow;overflow: hidden;}
        </style>
    </head>
    <body>
        <div class="left">left</div>
        <div class="right">right</div>
    </body>
</html>

如圖所示


BFC特性3
應(yīng)用:自適應(yīng)兩欄布局
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body,ul,ol{ margin: 0; padding: 0;}
            html,body{height: 100%;}
            .left{width: 300px;height:500px;background: #0000FF;float: left;} 
            .right{height: 600px;background: yellow;overflow: hidden;}
        </style>
    </head>
    <body>
        <div class="left">left固定</div>
        <div class="right">right自適應(yīng)</div>
    </body>
</html>

實(shí)現(xiàn)效果如圖所示:


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

可以實(shí)現(xiàn)右側(cè)自適應(yīng)的方法屬性有:
overflow: hidden、auto黄娘、scroll;
display: flex、inline-flex;

應(yīng)用:三欄布局
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body{ margin: 0; padding: 0;}
            html,body{height: 100%;}
            .left{
                width: 100px;height: 200px;background: red;float: left;
            }
            .center{
                height: 400px;background: #00FFFF;overflow: hidden;margin-right: 200px;
            }
            .right{
                width: 200px;height: 300px;background: #008000;float: left;position: absolute;top: 0;right: 0;
            } 
        </style>
    </head>
    <body>
        <div class="left">left</div>
        <div class="center">center</div>
        <div class="right">right</div>
    </body>
</html>

實(shí)現(xiàn)效果如圖所示:


三欄布局

不同分辨率下左右兩側(cè)內(nèi)容固定不變氮凝,中間內(nèi)容自適應(yīng)(下面因?yàn)閳D片放大了所以左右兩側(cè)顯得變大了,實(shí)際上并沒(méi)有改變大衅羯恪):


三欄布局
想要了解更多寫法傅是,可以看下篇詳解蕾羊,應(yīng)用場(chǎng)景中的自適應(yīng)兩欄布局或者三欄布局以及圣杯布局和雙飛翼布局龟再。
在BFC中利凑,最重要的就是上面三組特性,每個(gè)特性的應(yīng)用場(chǎng)景都是非常廣泛的牌借,在現(xiàn)實(shí)開發(fā)過(guò)程中膨报,也會(huì)經(jīng)常用到。至于下面的三個(gè)特性就簡(jiǎn)單了解一下就可以了适荣。

4丙躏、BFC內(nèi)部的Box會(huì)在垂直方向,一個(gè)接一個(gè)的放置束凑。

5晒旅、每個(gè)元素的margin box的左邊會(huì)與包含塊border box的左邊相接觸(對(duì)于從左到右的格式化,否則相反)汪诉,即使存在浮動(dòng)也會(huì)如此废恋。

6、BFC就是頁(yè)面上的一個(gè)獨(dú)立容器扒寄,容器里面的元素不會(huì)影響到外面的元素


到這里BFC就結(jié)束了鱼鼓,總結(jié)一下BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器该编,容器里面的子元素不會(huì)影響到外面的元素置媳。反之也如此拇囊。

喜歡的朋友可以點(diǎn)點(diǎn)關(guān)注寥袭,點(diǎn)點(diǎn)贊队寇,前端小白炭序,需要各位大佬的垂愛,歡迎評(píng)論區(qū)留言互動(dòng)辜纲,多多指教杀糯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疗琉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌香浩,老刑警劉巖呀非,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幢尚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門管嬉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)著隆,“玉大人项栏,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵左电,是天一觀的道長(zhǎng)栈拖。 經(jīng)常有香客問(wèn)我染簇,道長(zhǎng)青灼,這世上最難降的妖魔是什么弹沽? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任蚌堵,我火速辦了婚禮够挂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好魄健,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布良哲。 她就那樣靜靜地躺著嚎货,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘱吗。 梳的紋絲不亂的頭發(fā)上患膛,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天枝缔,我揣著相機(jī)與錄音,去河邊找鬼顿涣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛背捌,可吹牛的內(nèi)容都是我干的垮衷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翻默,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翘单!你這毒婦竟也來(lái)了属提?” 一聲冷哼從身側(cè)響起恕酸,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胞谭,沒(méi)想到半個(gè)月后彩库,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皇忿,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爹梁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年跨嘉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片力崇。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廓俭,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站葬荷,受9級(jí)特大地震影響扒吁,放射性物質(zhì)發(fā)生泄漏晨逝。R本人自食惡果不足惜牧挣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚷闭。 院中可真熱鬧挠进,春花似錦嘲碱、人聲如沸鹅巍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颗味。三九已至晶默,卻和暖如春坞靶,著一層夾襖步出監(jiān)牢的瞬間妻味,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踊淳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屁魏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • relative:生成相對(duì)定位的元素沿后,通過(guò)top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 943評(píng)論 0 2
  • 1.背景介紹 BFC全稱是Block Formatting Context坪哄,是CSS2.1規(guī)范定義的,關(guān)于CSS渲...
    你隔壁的陌生人閱讀 1,129評(píng)論 0 0
  • BFC 已經(jīng)是一個(gè)耳聽熟聞的詞語(yǔ)了,網(wǎng)上有許多關(guān)于 BFC 的文章霎冯,介紹了如何觸發(fā) BFC 以及 BFC 的一些用...
    _Yfling閱讀 417評(píng)論 0 0
  • BFC全稱是Block Formatting Context磷雇,即塊格式化上下文忠怖。它是CSS2.1規(guī)范定義的,關(guān)于C...
    xf0128閱讀 337評(píng)論 0 0
  • 什么是BFC BFC全稱是Block Formatting Context侮措,即塊格式化上下文。它是CSS2.1規(guī)范...
    陌客百里閱讀 533評(píng)論 3 4