BFC:一個神奇的渲染區(qū)域

一海蔽、什么是FC、BFC

FC:格式化上下文(Formatting Context)扁位,其實指的是一個渲染區(qū)域准潭,擁有一套渲染規(guī)則,它決定了其子元素如何定位域仇,以及與其他元素之間的關系和相互作用刑然。

FC又分為BFC、IFC暇务、GFC與FFC泼掠,這里只講BFC。

BFC: 塊格式化上下文(Block Formatting Context垦细,BFC) 是Web頁面的可視化CSS渲染的一部分择镇,是塊盒子的布局過程發(fā)生的區(qū)域,也是浮動元素與其他元素交互的區(qū)域括改。 (出自MDN)

BFC用來生成一個隔離的空間腻豌、清除內(nèi)部元素的相互影響。

二、BFC的生成條件:

  • 根元素或包含根元素的元素
  • 浮動元素(元素的 float 不是 none
  • 絕對定位元素(元素的 positionabsolutefixed
  • 行內(nèi)塊元素(元素的 displayinline-block
  • 表格單元格(元素的 displaytable-cell吝梅,HTML表格單元格默認為該值)
  • 表格標題(元素的 displaytable-caption虱疏,HTML表格標題默認為該值)
  • 匿名表格單元格元素(元素的 displaytabletable-row苏携、 table-row-group做瞪、table-header-grouptable-footer-group(分別是HTML table右冻、row装蓬、tbody、thead纱扭、tfoot的默認屬性)或 inline-table
  • overflow 值不為 visible 的塊元素
  • display 值為 flow-root 的元素
  • contain 值為 layout牍帚、contentstrict 的元素
  • 彈性元素(displayflexinline-flex元素的直接子元素)
  • 網(wǎng)格元素(displaygridinline-grid 元素的直接子元素)
  • 多列容器(元素的 column-countcolumn-width 不為 auto,包括 ``column-count1
  • column-spanall 的元素始終會創(chuàng)建一個新的BFC,即使該元素沒有包裹在一個多列容器中(標準變更Chrome bug)嚷缭。

以上較為常見的有overflow:hidden蝶桶、float:left/rightposition:absolutedisplay: flex爱榔。也就是說被环,當滿足上訴其中的一個或多個條件時,就代表了該元素已經(jīng)創(chuàng)建了一個BFC了详幽。

三筛欢、BFC的規(guī)范

  • 內(nèi)部的盒子會在垂直方向,一個個地放置唇聘;
  • 盒子垂直方向的距離由margin決定版姑,屬于同一個BFC的兩個相鄰Box的上下margin會發(fā)生重疊;
  • 每個元素的左邊迟郎,與包含的盒子的左邊相接觸剥险,即使存在浮動也是如此;
  • BFC的區(qū)域不會與float重疊宪肖;
  • BFC就是頁面上的一個隔離的獨立容器表制,容器里面的子元素不會影響到外面的元素,反之也如此控乾;
  • 計算BFC的高度時么介,浮動元素也參與計算。

四蜕衡、BFC可以用來干什么

1. 利用BFC避免外邊距折疊

??在CSS當中壤短,相鄰的兩個盒子(可能是兄弟關系也可能是祖先關系)的外邊距可以結合成一個單獨的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結合成的外邊距稱為折疊外邊距久脯。折疊遵循如下規(guī)則:
* 兩個相鄰的外邊距都是正數(shù)時纳胧,折疊結果是它們兩者之間較大的值。
* 兩個相鄰的外邊距都是負數(shù)時桶现,折疊結果是兩者絕對值的較大值躲雅。
* 兩個外邊距一正一負時,折疊結果是兩者的相加的和骡和。

舉個栗子:
??當兩個盒子處于同一個BFC時相赁,外邊距會發(fā)生重疊現(xiàn)象

.demo1, .demo2 {
  height: 100px;
  width: 100px;
  background-color: red;
  margin-top: 20px;
  margin-bottom: 10px;
}
.demo2 {
  background-color: lightblue;
}

<div class='box'>
  <div class='demo1'></div>
  <div class='demo2'></div>
</div>
外邊距折疊

解決方式:
??使兩者不處于同一個BFC中即可。

新建BFC
2. 防止發(fā)生因浮動而產(chǎn)生的高度塌陷問題

??當一個元素屬性為浮動時慰于,會脫離標準文檔流(也就是所謂的"脫標")钮科,導致它的父元素計算高度時無法計算到浮動的元素。

舉個栗子:
??當父元素box不是BFC時婆赠,無法計算出浮動元素的高度绵脯,導致content(內(nèi)容)無法被撐開。

.box {
  background-color: skyblue;
}
 .demo1 {
  height: 100px;
  width: 100px;
  background-color: rgba(0,0,0, 0.1);
  float: left;
 }

<div class='box'>
  <div class='demo1'></div>
</div>
子元素浮動

解決方式:
??根據(jù)上述的BFC規(guī)范的最后一點可以看出休里,可以通過生成BFC(方法參考上述的BFC生成條件蛆挫,這里使用display: flow-root作為栗子)來解決浮動時高度無法被計算的問題。

.box {
   background-color: skyblue;
   display: flow-root;   //different妙黍,無副作用悴侵,適合在父元素使用
}
.demo1 {
  height: 100px;
  width: 100px;
  background-color: rgba(0,0,0, 0.1);
  float: left;
}

<div class='box'>
  <div class='demo1'></div>
</div>
通過BFC來清除浮動影響
3. 解決浮動時元素重疊

??剛才上面有講到:浮動會產(chǎn)生‘脫標’。脫標會導致覆蓋標準文檔流的元素上拭嫁,因此會發(fā)生元素重疊的現(xiàn)象可免。

舉個栗子:
??當我們在一個元素中放置了一個浮動元素和一個普通元素時,浮動元素會被置于普通元素中做粤。

.demo1 {
  height: 100px;
  width: 100px;
  float: left;
  background-color: rgba(0, 0, 0, 0.1);
}
.demo2 {
  height: 200px;
  width: 200px;
  background-color: skyblue;
}

<div class='box'>
  <div class='demo1'></div>
  <div class='demo2'></div>
</div>
元素重疊

解決辦法:
??由上面的規(guī)則(BFC的區(qū)域不會與float重疊)可得浇借,為非浮動元素建立一個BFC就可以避免此情況發(fā)生。

.demo1 {
  height: 100px;
  width: 100px;
  float: left;
  background-color: rgba(0, 0, 0, 0.1);
}
.demo2 {
  height: 200px;
  width: 200px;
  background-color: skyblue;
  overflow: auto;
}

<div class='box'>
  <div class='demo1'></div>
  <div class='demo2'></div>
</div>
通過創(chuàng)建BFC來解決重疊
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怕品,一起剝皮案震驚了整個濱河市妇垢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堵泽,老刑警劉巖修己,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迎罗,居然都是意外死亡睬愤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門纹安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尤辱,“玉大人砂豌,你說我怎么就攤上這事」舛剑” “怎么了阳距?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長结借。 經(jīng)常有香客問我筐摘,道長,這世上最難降的妖魔是什么船老? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任咖熟,我火速辦了婚禮,結果婚禮上柳畔,老公的妹妹穿的比我還像新娘馍管。我一直安慰自己,他們只是感情好薪韩,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布确沸。 她就那樣靜靜地躺著,像睡著了一般俘陷。 火紅的嫁衣襯著肌膚如雪罗捎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天拉盾,我揣著相機與錄音宛逗,去河邊找鬼。 笑死盾剩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的替蔬。 我是一名探鬼主播告私,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼承桥!你這毒婦竟也來了驻粟?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凶异,失蹤者是張志新(化名)和其女友劉穎蜀撑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剩彬,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酷麦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉恋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃饶。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡母廷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糊肤,到底是詐尸還是另有隱情琴昆,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布馆揉,位于F島的核電站业舍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏升酣。R本人自食惡果不足惜舷暮,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拗踢。 院中可真熱鬧脚牍,春花似錦、人聲如沸巢墅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽君纫。三九已至驯遇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓄髓,已是汗流浹背叉庐。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留会喝,地道東北人陡叠。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像肢执,于是被迫代替她去往敵國和親枉阵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案预茄? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,737評論 1 92
  • 1.盒模型是CSS的基石之一兴溜,它指定元素如何顯示以及(在某種程度上)如何相互交互。頁面上的每個元素被看作是一個矩形...
    garble閱讀 524評論 0 0
  • relative:生成相對定位的元素耻陕,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 932評論 0 2
  • 黑科技一詞曾經(jīng)是各大互聯(lián)網(wǎng)科技公司的專利拙徽,巴特,培訓學習行業(yè)的人也不甘寂寞诗宣,下面讓我們來瞧瞧他們推出來的培訓學習 ...
    特里斯譚閱讀 791評論 0 50
  • 今日侧蘸,全世界都在準備一場儀式,為了跟他告別鹉梨。我們的科比讳癌,一個我們用心愛的球星。吾愛存皂,別兮晌坤。 對于一個狂熱的球迷,陪...
    Ajun俊閱讀 829評論 7 4