BFC原理

BFC是什么抖苦?

了解BFC之前毁菱,先了解Box,F(xiàn)ormatting Content的概念

  1. Box:CSS布局的基本單位
    Box是CSS布局的對象和基本單位锌历,可以理解為一個(gè)頁面就是有很多個(gè)Box組成的贮庞。元素的類型display屬性決定了Box的類型;一個(gè)不同類型的Box究西,會(huì)參與不同F(xiàn)ormatting Content(一個(gè)決定如何渲染文檔的容器)窗慎,因此Box內(nèi)的元素會(huì)以不同方式進(jìn)行渲染,主要的Box有以下幾種:
  • Block-level box:display屬性為block卤材、list-item遮斥、table的元素,會(huì)生成Block-level box扇丛。并且參與Block Formatting Content
  • Inline-level box:display屬性為inline术吗、inline-block、inline-table的元素帆精,會(huì)生成Inline-level box较屿。并且會(huì)參數(shù)Inline Formatting Content
  • Run-in box:css3才有
  1. Formatting Content
    是CSS2.1里面的一個(gè)概念隧魄。它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則隘蝎,決定了其子元素如何定位以及與周圍元素之間的相互作用购啄。
    常見的Formatting Content有Block Formatting Content(BFC)Inline Formatting Content(IFC)
    注意:CSS2.1中只有BFC和IFC,CSS3中增加了GFC和FFC.

  2. BFC定義
    BFC直譯為塊級格式化上下文嘱么,它是一個(gè)獨(dú)立的渲染區(qū)域狮含,只有Block-level box參與,它規(guī)定了內(nèi)部的Block-level Box如何布局曼振,并且與外部毫不相干辉川。
    注意:可以把BFC理解為一個(gè)大的盒子,其內(nèi)部是由Block-level box組成的

  3. BFC的規(guī)則

  • BFC內(nèi)部的Box會(huì)在垂直方向拴测,一個(gè)接一個(gè)的設(shè)置;
  • Box垂直方向的距離由margin決定府蛇,屬于同一個(gè)BFC的兩個(gè)相鄰box的margin會(huì)發(fā)生重疊
  • 每個(gè)元素的margin box的左邊會(huì)與包含塊border box的左邊相接觸(對于從左到右的格式化集索,否則相反),即使存在浮動(dòng)也會(huì)如此汇跨。
  • BFC的區(qū)域不會(huì)與float box的重疊
  • BFC就是頁面上的一個(gè)獨(dú)立容器务荆,容器里面的元素不會(huì)影響到外面的元素,反之亦然穷遂。(這一點(diǎn)很重要函匕,要牢牢記住)
  • 計(jì)算BFC的高度時(shí)蚪黑,浮動(dòng)元素也參與計(jì)算盅惜。

BFC由什么條件創(chuàng)立?

  • 根元素或其它包含它的元素
  • float屬性不為none
  • position屬性為absolute或fixed
  • display屬性為inline-block、table-cell忌穿、table-caption抒寂、flex、inline-flex
  • overflow屬性不為visible

BFC的用途

  1. 自適應(yīng)兩欄布局
<style >
body{
  position: relative;
  height: 400px;
}
.aside{
  height: 200px;
  width: 200px;
  background-color: pink;
  float: left;
}
.main{
  background-color: grey;
  height: 300px;
}
</style>
<body>
    <div class="aside"></div>
    <div class="main"></div>
</body>

效果:

Paste_Image.png

根據(jù)BFC布局規(guī)則的第三條:

每個(gè)元素的margin box的左邊掠剑,與包含塊border box的左邊相接觸(對于從左到右的格式化屈芜,否則相反)。即使存在浮動(dòng)也是如此

因此朴译,即使存在浮動(dòng)的aside井佑,但是main還是與包含塊的左邊相接觸;
按照BFC布局的第四條規(guī)則:

BFC的區(qū)域不會(huì)與float box重疊

因此眠寿,可以通過使main觸發(fā)BFC躬翁,來實(shí)現(xiàn)自適應(yīng)兩列布局

.main{
  overflow: hidden;
}

當(dāng)main觸發(fā)BFC后,其不會(huì)與浮動(dòng)的aside重疊盯拱。因此會(huì)根據(jù)包含塊的寬度和aside的寬度姆另,自動(dòng)變窄喇肋,效果如下:

Paste_Image.png
  1. 清除內(nèi)部浮動(dòng)
    當(dāng)子元素均浮動(dòng)時(shí),其無法撐開父元素迹辐,這是可以讓父元素生成BFC蝶防,如下:
<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>

顯示:

Paste_Image.png

根據(jù)BFC布局規(guī)則的第六條:

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

因此為了達(dá)到清除內(nèi)部浮動(dòng)明吩,可以讓.par觸發(fā)BFC间学,那么計(jì)算par的高度時(shí),浮動(dòng)元素也參與計(jì)算印荔,par就被撐開了低葫;
代碼:

.par{
    overflow: hidden;
}

顯示:

Paste_Image.png
  1. 防止marin重疊
    代碼:
<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>

頁面:

Paste_Image.png

可以發(fā)現(xiàn),兩個(gè)p元素之間的垂直margin出現(xiàn)了重疊仍律;
根據(jù)BFC的第二條規(guī)則:

Box垂直方向的距離由margin決定嘿悬,屬于同一BFC的兩個(gè)Box會(huì)發(fā)生margin重疊

因此,可以在其中一個(gè)p上包裹容器水泉,然后觸發(fā)其BFC善涨,這樣兩個(gè)p就不在同一個(gè)BFC,因此就不會(huì)發(fā)生重疊

<style>
    .wrap {
        overflow: hidden;
    }
    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>

效果如下:

Paste_Image.png

總結(jié)

以上幾個(gè)例子都體現(xiàn)了BFC的第五條規(guī)則:

BFC就是頁面上一個(gè)隔離的獨(dú)立容器草则,容器內(nèi)的子元素不會(huì)影響外部的元素钢拧,反之亦然。

因?yàn)锽FC內(nèi)部的元素不會(huì)影響外部的元素炕横,因此當(dāng)BFC外部有浮動(dòng)元素時(shí)源内,BFC為了不影響內(nèi)部Box的布局,BFC會(huì)通過變窄份殿,避免與浮動(dòng)元素重疊膜钓;同樣的,當(dāng)BFC內(nèi)部有浮動(dòng)時(shí)卿嘲,為了不影響外部元素的布局呻此,BFC計(jì)算高度時(shí)會(huì)包括浮動(dòng)元素的高度。避免margin重疊也是如此

轉(zhuǎn)自:前端精選文摘:BFC 神奇背后的原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腔寡,一起剝皮案震驚了整個(gè)濱河市焚鲜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌放前,老刑警劉巖忿磅,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凭语,居然都是意外死亡葱她,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門似扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吨些,“玉大人搓谆,你說我怎么就攤上這事『朗” “怎么了泉手?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偶器。 經(jīng)常有香客問我斩萌,道長,這世上最難降的妖魔是什么屏轰? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任颊郎,我火速辦了婚禮,結(jié)果婚禮上霎苗,老公的妹妹穿的比我還像新娘姆吭。我一直安慰自己,他們只是感情好唁盏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布内狸。 她就那樣靜靜地躺著,像睡著了一般升敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轰传,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天驴党,我揣著相機(jī)與錄音,去河邊找鬼获茬。 笑死港庄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恕曲。 我是一名探鬼主播鹏氧,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佩谣!你這毒婦竟也來了把还?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤茸俭,失蹤者是張志新(化名)和其女友劉穎吊履,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體调鬓,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艇炎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腾窝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀踪。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡居砖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驴娃,到底是詐尸還是另有隱情奏候,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布托慨,位于F島的核電站鼻由,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厚棵。R本人自食惡果不足惜蕉世,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婆硬。 院中可真熱鬧狠轻,春花似錦、人聲如沸彬犯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谐区。三九已至湖蜕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宋列,已是汗流浹背昭抒。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炼杖,地道東北人灭返。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像坤邪,于是被迫代替她去往敵國和親熙含。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案艇纺? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,734評論 1 92
  • 一怎静、 什么是BFC? 1 CSS布局的基本單位:Box(盒模型) Box是CSS布局的對象和基本單位黔衡,一份網(wǎng)頁由多...
    有個(gè)水友閱讀 1,196評論 0 2
  • 先前在學(xué)習(xí)CSS float時(shí)消约,有同學(xué)提到了BFC這個(gè)詞,作為求知好問的好學(xué)生员帮,哪里不懂查哪里或粮,那么今天就來研究一...
    這名字真不對閱讀 6,548評論 3 19
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進(jìn)行定位...
    zx9426閱讀 932評論 0 2
  • BFC的定義### 先看W3C文檔 In a block formatting context, boxes ar...
    蘇星河閱讀 10,387評論 1 14