css中的中BFC(Block Formatting Context)詳解

???????css中總是存在一些古老而又強(qiáng)大的特性遮怜,雖然css3玻驻,以及即將面世的css4極大節(jié)約了我們的開發(fā)成本凭迹,但是根植于css2中那些巧妙的技巧仍然能夠令我們?yōu)橹@嘆。今天晦炊,我們就來(lái)學(xué)習(xí)一個(gè)功能非常強(qiáng)大鞠鲜,兼容性也非常好的知識(shí)點(diǎn)BFC(格式化上下文)*。

一断国、何為BFC

???????BFC(Block Formatting Context)格式化上下文贤姆,是Web頁(yè)面中盒模型布局的CSS渲染模式,指一個(gè)獨(dú)立的渲染區(qū)域或者說(shuō)是一個(gè)隔離的獨(dú)立容器稳衬,默認(rèn)情況下只有根元素(即body)一個(gè)塊級(jí)上下文霞捡。

二、形成BFC的條件

???????1薄疚、浮動(dòng)元素碧信,floatnone以外的值。
???????2街夭、定位元素position(absolute,fixed)砰碴。
???????3、display 為以下其中之一的值 inline-block板丽,table-cell呈枉,table-caption;
???????4埃碱、overflow 除了 visible 以外的值(hidden猖辫,auto,scroll)砚殿;

三啃憎、BFC的特性

???????1.內(nèi)部的Box會(huì)在垂直方向上一個(gè)接一個(gè)的放置。
???????2.垂直方向上的距離由margin決定
???????3.bfc的區(qū)域不會(huì)與float的元素區(qū)域重疊瓮具。
???????4.計(jì)算bfc的高度時(shí)荧飞,浮動(dòng)元素也參與計(jì)算
???????5.bfc就是頁(yè)面上的一個(gè)獨(dú)立容器凡人,容器里面的子元素不會(huì)影響外面元素名党。
???????如果您之前對(duì)BFC的不是很了解的話,那么上面的幾條特性可能會(huì)讓您感到困惑挠轴。我們下面將逐條進(jìn)行敘述传睹。

四、實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)

1岸晦、BFC中的盒子對(duì)齊

???????特性的第一條是:內(nèi)部的Box(塊級(jí)元素)會(huì)在垂直方向上一個(gè)接一個(gè)的放置欧啤。(這條特性不必糾結(jié)睛藻,即便不在BFC里塊級(jí)盒子也會(huì)垂直排列)

2、外邊距折疊

???????特性的第二條:垂直方向上的距離由margin決定
???????在常規(guī)文檔流中邢隧,兩個(gè)兄弟盒子之間的垂直距離是由他們的外邊距所決定的店印,但不是他們的兩個(gè)外邊距之和,而是以較大的為準(zhǔn)倒慧。


正常文檔流
<div class="container">
     <div class="box1"></div>
     <div class="box2"></div>
</div>

<style>
.container {
    overflow: hidden;
    width: 100px;
    height: 100px;
    background-color: red;
}
        
.box1 {
     height: 20px;
     margin: 10px 0;
     background-color: green;
}
        
.box2 {
     height: 20px;
     margin: 20px 0;
     background-color: green;
}
</style>

???????這里我門可以看到按摘,第一個(gè)子盒子有上邊距(不會(huì)發(fā)生margin穿透的問(wèn)題);兩個(gè)子盒子的垂直距離為20px而不是30px纫谅,因?yàn)榇怪蓖膺吘鄷?huì)折疊炫贤,間距以較大的為準(zhǔn)。

???????那么有沒(méi)有方法讓垂直外邊距不折疊呢付秕?答案是:有兰珍。特性的第5條就說(shuō)了:bfc就是頁(yè)面上的一個(gè)獨(dú)立容器,容器里面的子元素不會(huì)影響外面元素询吴,同樣外面的元素不會(huì)影響到BFC內(nèi)的元素掠河。所以就讓box1或box2再處于另一個(gè)BFC中就行了。

BFC文檔流
<div class="container">
     <div class="wrapper">
         <div class="box1"></div>
     </div>
     <div class="box2"></div>
</div>
<style>
.container {
   overflow: hidden;
   width: 100px;
   height: 100px;
   background-color: red;
}
    
.wrapper {
    overflow: hidden;
}
    
.box1 {
     height: 20px;
     margin: 10px 0;
     background-color: green;
}
    
.box2 {
    height: 20px;
    margin: 20px 0;
    background-color: green;
}
</style>

3汰寓、不被浮動(dòng)元素覆蓋

???????以常見的兩欄布局為例口柳。
???????左邊固定寬度,右邊不設(shè)寬有滑,因此右邊的寬度自適應(yīng)跃闹,隨瀏覽器窗口大小的變化而變化。


<div class="column"></div>
<div class="column"></div>

<style>
.column:nth-of-type(1) {
      float: left;
      width: 200px;
      height: 300px;
      margin-right: 10px;
      background-color: red;
}
        
.column:nth-of-type(2) {
      overflow: hidden;/*創(chuàng)建bfc */
      height: 300px;
      background-color: purple;
}
</style>

???????還有三欄布局毛好。
???????左右兩邊固定寬度望艺,中間不設(shè)寬,因此中間的寬度自適應(yīng)肌访,隨瀏覽器的大小變化而變化找默。


BFC實(shí)現(xiàn)三欄布局
<div class="contain">
    <div class="column"></div>
    <div class="column"></div>
    <div class="column"></div>
</div>
<style>
.column:nth-of-type(1),
.column:nth-of-type(2) {
     float: left;
     width: 100px;
     height: 300px;
     background-color: green;
}
        
.column:nth-of-type(2) {
     float: right;
}
        
.column:nth-of-type(3) {
      overflow: hidden;  /*創(chuàng)建bfc*/
      height: 300px;
      background-color: red;
}
</style>

???????也可以用來(lái)防止字體環(huán)繞:
???????眾所周知,浮動(dòng)的盒子會(huì)遮蓋下面的盒子吼驶,但是下面盒子里的文字是不會(huì)被遮蓋的惩激,文字反而還會(huì)環(huán)繞浮動(dòng)的盒子。這也是一個(gè)比較有趣的特性蟹演。


html

<div class="left"></div>
<p>你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
       你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
       你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
</p>

css
(1)環(huán)繞

.left {
     float: left;
     width: 100px;
     height: 100px;
     background-color: yellow;
}
        
p {
      background-color: green;
      /* overflow: hidden; */
}

(2)利用bfc防止環(huán)繞

.left {
     float: left;
     width: 100px;
     height: 100px;
     background-color: yellow;
}
        
p {
     background-color: green;
     overflow: hidden;
}

4风钻、BFC包含浮動(dòng)的塊

???????我們經(jīng)常會(huì)在父元素里設(shè)置某個(gè)子元素浮動(dòng)。浮動(dòng)后酒请,子元素脫離了文檔流骡技,使得父元素?zé)o法包住這個(gè)浮動(dòng)的子元素。我們通常在父元素上設(shè)置一個(gè)clearfix的偽元素來(lái)清除浮動(dòng);同樣布朦,我們可以利用BFC可以包含浮動(dòng)這一特性來(lái)清除浮動(dòng)囤萤。

???????當(dāng)給.parent設(shè)置overflow:hidden時(shí),實(shí)際上創(chuàng)建了一個(gè)超級(jí)屬性BFC是趴,此超級(jí)屬性反過(guò)來(lái)決定了height:auto是如何計(jì)算的涛舍。在“BFC布局規(guī)則”中提到:計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算唆途。因此做盅,父元素在計(jì)算其高度時(shí),加入了浮動(dòng)元素的高度窘哈,“順便”達(dá)成了清除浮動(dòng)的目標(biāo)吹榴,所以父元素就包裹住了子元素

???????除了給.parent設(shè)置overflow:hidden滚婉,我們還可以設(shè)置display:inline-block图筹、position:absolutefloat:left等方式來(lái)創(chuàng)建一個(gè)BFC让腹,從而達(dá)到包裹浮動(dòng)子元素的效果(具體使用哪種方法要看項(xiàng)目需求).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末远剩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骇窍,更是在濱河造成了極大的恐慌瓜晤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腹纳,死亡現(xiàn)場(chǎng)離奇詭異痢掠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嘲恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門足画,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人佃牛,你說(shuō)我怎么就攤上這事淹辞。” “怎么了俘侠?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵象缀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我爷速,道長(zhǎng)央星,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任遍希,我火速辦了婚禮等曼,結(jié)果婚禮上里烦,老公的妹妹穿的比我還像新娘凿蒜。我一直安慰自己禁谦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布废封。 她就那樣靜靜地躺著州泊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漂洋。 梳的紋絲不亂的頭發(fā)上遥皂,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音刽漂,去河邊找鬼演训。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贝咙,可吹牛的內(nèi)容都是我干的样悟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼庭猩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窟她!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蔼水,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤震糖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后趴腋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊说,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年优炬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疏叨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穿剖,死狀恐怖蚤蔓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糊余,我是刑警寧澤秀又,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贬芥,受9級(jí)特大地震影響吐辙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蘸劈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一昏苏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦贤惯、人聲如沸洼专。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屁商。三九已至,卻和暖如春颈墅,著一層夾襖步出監(jiān)牢的瞬間蜡镶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工恤筛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留官还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓毒坛,卻偏偏與公主長(zhǎng)得像妻枕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粘驰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355