CSS中的BFC,外邊距折疊红柱,清除浮動

BFC是什么檐蚜?

BFC(Block Formatting Context)直譯為“塊級格式化范圍 ”贯城。

是 W3C CSS 2.1 規(guī)范中的一個概念加缘,它決定了元素如何對其內容進行定位鸭叙,以及與其他元素的關系和相互作用。當涉及到可視化布局的時候拣宏,Block Formatting Context提供了一個環(huán)境沈贝,HTML元素在這個環(huán)境中按照一定規(guī)則進行布局。一個環(huán)境中的元素不會影響到其它環(huán)境中的布局勋乾。

BFC 的特征

在BFC中宋下,盒子從頂端開始垂直地一個接一個地排列嗡善,兩個盒子之間的垂直的間隙是由他們的margin 值所決定的。在一個BFC中学歧,兩個相鄰的塊級盒子的垂直外邊距會產(chǎn)生折疊滤奈。

在BFC中,每一個盒子的左外邊緣(margin-left)會觸碰到容器的左邊緣(border-left)(對于從右到左的格式來說撩满,則觸碰到右邊緣)。

BFC中的元素的布局是不受外界的影響(我們往往利用這個特性來消除浮動元素對其非浮動的兄弟元素和其子元素帶來的影響绅你。)并且在一個BFC中伺帘,塊盒與行盒(行盒由一行中所有的內聯(lián)元素所組成)都會垂直的沿著其父元素的邊框排列。

計算BFC的高度時忌锯,浮動元素也參與計算(可用于解決浮動造成的高度塌陷問題)

BFC的區(qū)域不會與float box重疊(解決浮動元素文字環(huán)繞問題)

觸發(fā)BFC

  • float 的值不為none
  • position 的值不為static或者relative
  • display的值為 table-cell, table-caption, inline-block, flex, 或者 inline-flex中的其中一個
  • overflow的值不為visible
    滿足上述條件中至少一項伪嫁,即可觸發(fā) BFC

使用場景

1、外邊距折疊問題

折疊的條件:兩個元素的 margin 必須是 相鄰 的偶垮;兩個 margin 是鄰接的必須滿足以下條件:

  • 必須是處于常規(guī)文檔流(非float和絕對定位)的塊級盒子,并且處于同一個 BFC 當中张咳。
  • 沒有inline盒子,沒有空隙似舵,沒有 padding 和 border 將他們分隔開脚猾。
  • 都屬于垂直方向上相鄰的外邊距。
    如下:
<div clss="container">
    <div class="f-block">
    </div>
    <div class="s-block">
    </div>
</div>
.f-block
{
  width:200px;
  height:200px;
  background-color:silver;
  margin:10px;
}
.s-block
{
  width:200px;
  height:200px;
  background-color:silver;
  margin:10px;
}

解決方法:
破壞產(chǎn)生折疊的條件即可:
1砚哗、給元素添加浮動或者絕對定位(會影響整體布局龙助,改動大)
2、將元素改為行內元素(會影響整體布局蛛芥,改動大)
3提鸟、元素間插入一個高度大于0的div
4、使元素不在同一BFC中

  <!--元素間插入一個高度大于0的div-->
  <div class="f-block">
  </div>
  <div style="height:0.01px"></div>
  <div class="s-block">
  </div>
元素間插入一個高度大于0的div
<div class="f-block"></div>
<div>
  <div class="s-block"></div>
</div>

f-block,s-block以及s-block外層div已經(jīng)還是處在相同BFC中仅淑,所以還是會產(chǎn)生外邊距折疊称勋。這里產(chǎn)生的折疊比較復雜:
首先是s-block和外層div的外邊距折疊,然后是合并后的折疊外邊距再與f-block產(chǎn)生外邊距折疊涯竟。
下面解決父子元素的外邊距折疊問題:

給父元素添加padding 或 border(破壞外邊距折疊條件)

<div class="f-block"></div>
<div style="background-color:red;border:1px solid black">
  <div class="s-block"></div>
</div>

給父元素創(chuàng)建新的塊級格式化上下文(創(chuàng)建了新的塊級格式化上下文的塊元素赡鲜,不與它的子元素發(fā)生margin 折疊)

<div class="f-block"></div>
<div style="background-color:red;overflow:hidden">
  <div class="s-block"></div>
</div>

2、清除浮動

<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
.container
{
  width:550px;
  border:5px solid red;
}
.item
{
  width:100px;
  height:100px;
  float:left;
  background-color:silver;
  margin:5px;
}

對于上面的代碼庐船,我們希望得到這樣的結果:


但結果卻是這樣的:


原因是因為浮動元素脫離文檔流蝗蛙,container的高度無法被撐開。

清除浮動的方法及原理:

clear屬性
clear屬性的意義就是禁止特定方向上存在浮動元素醉鳖,例如clear: left就是不允許元素左方存在文檔流之前浮動元素(注意捡硅,這里左邊如果存在文檔流之后的浮動元素是無法清理的)
根據(jù)CSS權威指南,具體的實現(xiàn)原理是通過引入清除區(qū)域盗棵,這個相當于加了一塊看不見的框把定義clear屬性的元素向下擠壮韭,直到元素指定方向剛好沒有浮動元素北发,這樣看起來包含框就把浮動框給包含了,實際上浮動框脫離文本流的性質沒變喷屋,它們依然是“浮”在上面的
用法:
1琳拨、容器內結尾處加空div標簽 clear:both
2、容器定義偽類:after 和 zoom(IE8以上和非IE瀏覽器才支持:after屯曹,原理和方法2有點類似狱庇,zoom(IE轉有屬性)可解決ie6,ie7浮動問題)

.container:after{display:block;clear:both;content:"";visibility:hidden;height:0}
.container{zoom:1}

容器形成新BFC
計算BFC的高度時,浮動元素也參與計算

.container
{
  width:550px;
  border:5px solid red;
  overfow:hidden;
}

或者使容器自身浮動也可以

消除浮動引起的文字環(huán)繞效果:

<div class="box">
    <div class="img">image</div>
    <div class="info">信息信息信息信息信息信息信息信息信息信息信息信信息信息信息信息信息信息信息信息信息信息信息信信息信息信息信息信息信息信息信息信息信息信息信信息信息信息信息信息信息信息信息信息信息信息信</div>
</div>
.box {width:210px;border: 1px solid #000;float: left;} 
.img {width: 100px;height: 100px;background: #696;float: left;} 
.info {background: #ccc;color: #fff;}

帶有浮動屬性的元素會脫離標準流進行排列布局恶耽,脫離標準流后的元素就不和塊元素相處在同一個流不居中密任,使得帶有浮動屬性的元素漂浮在正常塊元素上面。但是浮動的塊雖然脫離了正常的文檔流偷俭,但是依然占據(jù)正常文檔流的文本空間浪讳。于是在其后面寫的文本并不會被浮動元素所覆蓋而是繼續(xù)水平排列超出換行。
標準流中塊元素每個各占一行涌萤。內聯(lián)元素則是水平排列淹遵,直到一行排列不下進行換行操作。因為使用了float的元素占據(jù)文本空間负溪,使得后面的文本以除了浮動元素之外的空間為排列基準透揣,形成了文本環(huán)繞的效果。

清除環(huán)繞效果就是使info形成一個新的BFC(BFC的區(qū)域不會與float box重疊)川抡,添加overflow:hidden即可淌实。
注意:給info絕對定位也會形成一個新的BFC,但是info會按照絕對定位的規(guī)則進行布局猖腕,會與img重疊拆祈。

參考文章
深入理解BFC和Margin Collapse
細說CSS中的BFC

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倘感,隨后出現(xiàn)的幾起案子放坏,更是在濱河造成了極大的恐慌,老刑警劉巖老玛,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淤年,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜡豹,警方通過查閱死者的電腦和手機麸粮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镜廉,“玉大人弄诲,你說我怎么就攤上這事。” “怎么了齐遵?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵寂玲,是天一觀的道長。 經(jīng)常有香客問我梗摇,道長拓哟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任伶授,我火速辦了婚禮断序,結果婚禮上,老公的妹妹穿的比我還像新娘糜烹。我一直安慰自己违诗,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布景图。 她就那樣靜靜地躺著,像睡著了一般碉哑。 火紅的嫁衣襯著肌膚如雪挚币。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天扣典,我揣著相機與錄音妆毕,去河邊找鬼。 笑死贮尖,一個胖子當著我的面吹牛笛粘,可吹牛的內容都是我干的。 我是一名探鬼主播湿硝,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薪前,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了关斜?” 一聲冷哼從身側響起示括,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痢畜,沒想到半個月后垛膝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡丁稀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年吼拥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线衫。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凿可,死狀恐怖,靈堂內的尸體忽然破棺而出授账,到底是詐尸還是另有隱情矿酵,我是刑警寧澤唬复,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站全肮,受9級特大地震影響敞咧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜辜腺,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一休建、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧评疗,春花似錦测砂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至加匈,卻和暖如春存璃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雕拼。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工纵东, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啥寇。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓偎球,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辑甜。 傳聞我的和親對象是個殘疾皇子衰絮,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,748評論 1 92
  • 一磷醋,浮動元素有什么特征岂傲?對父容器、其他浮動元素子檀、普通元素镊掖、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 866評論 0 4
  • relative:生成相對定位的元素褂痰,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 940評論 0 2
  • 文章版權歸饑人谷_Lyndon以及饑人谷所有缩歪。 1. 浮動元素有什么特征归薛?對父容器、其他浮動元素、普通元素主籍、文字分...
    HungerLyndon閱讀 2,381評論 4 10
  • 浮動元素的特征习贫,對父容器、對其他浮動元素千元、普通元素苫昌、文字的影響。 浮動會使應用的元素脫離文檔流幸海。按指定的位置來移動...
    邢烽朔閱讀 661評論 2 7