前端面試積累10-對BFC規(guī)范的理解

BFC便锨,塊級格式化上下文澜倦,一個創(chuàng)建了新的BFC的盒子是獨立布局的恬砂,盒子里面的子元素的樣式不會影響到外面的元素。在同一個 BFC 中的兩個毗鄰的塊級盒在垂直方向(和布局方向有關(guān)系)的 margin 會發(fā)生折疊嫩絮。

W3C CSS 2.1 規(guī)范中的一個概念丛肢,它決定了元素如何對其內(nèi)容進(jìn)行布局,以及與其他元素的關(guān)系和相互作用剿干。

一蜂怎、BFC 的概念

1.規(guī)范解釋

塊格式化上下文(Block Formatting Context,BFC)是Web頁面的可視化CSS渲染的一部分置尔,是布局過程中生成塊級盒子的區(qū)域杠步,也是浮動元素與其他元素的交互限定區(qū)域。

2.通俗理解

BFC 是一個獨立的布局環(huán)境,可以理解為一個容器,在這個容器中按照一定規(guī)則進(jìn)行物品擺放,并且不會影響其它環(huán)境中的物品撰洗。

如果一個元素符合觸發(fā) BFC 的條件篮愉,則 BFC 中的元素布局不受外部影響。

浮動元素會創(chuàng)建 BFC差导,則浮動元素內(nèi)部子元素主要受該浮動元素影響试躏,所以兩個浮動元素之間是互不影響的

二设褐、創(chuàng)建 BFC

根元素或包含根元素的元素

浮動元素 float = left | right 或 inherit(≠ none)

絕對定位元素 position = absolute 或 fixed

display = inline-block | flex | inline-flex | table-cell 或 table-caption

overflow = hidden | auto 或 scroll?(≠ visible)

三颠蕴、BFC 的特性

BFC 是一個獨立的容器,容器內(nèi)子元素不會影響容器外的元素助析。反之亦如此犀被。

盒子從頂端開始垂直地一個接一個地排列,盒子之間垂直的間距是由 margin 決定的外冀。

在同一個 BFC 中寡键,兩個相鄰的塊級盒子的垂直外邊距會發(fā)生重疊。

BFC 區(qū)域不會和 float box 發(fā)生重疊雪隧。

BFC 能夠識別并包含浮動元素,當(dāng)計算其區(qū)域的高度時脑沿,浮動元素也可以參與計算了藕畔。

四、BFC 的作用

1.包含浮動元素(清除浮動)

浮動元素會脫離文檔流(絕對定位元素也會脫離文檔流)庄拇,導(dǎo)致無法計算準(zhǔn)確的高度注服,這種問題稱為高度塌陷

解決高度塌陷問題的前提是能夠識別并包含浮動元素措近,也就是清除浮動溶弟。

問題舉例:如上左圖所示,容器(container)沒有高度或者 height = auto ,并且其子元素(sibling)是浮動元素熄诡,所以該容器的高度是不會被撐開的可很,即高度塌陷。

解決方法:在容器(container)中創(chuàng)建 BFC凰浮。

HTML

<div class="container">

? ? ? ? <div class="Sibling"></div>

? ? ? ? <div class="Sibling"></div>

</div>

CSS

.container {

? ? ? ? overflow: hidden; /* creates block formatting context */

? ? ? ? background-color: green;

}

.container .Sibling {

? ? ? ? float: left;

? ? ? ? margin: 10px;

? ? ? ? background-color: lightgreen;?

}

特別提示:

通過 overflow:hidden 創(chuàng)建 BFC我抠,固然可以解決高度塌陷的問題苇本,但是大范圍應(yīng)用在布局上肯定不是最合適的,畢竟 overflow:hidden 會造成溢出隱藏的問題菜拓,尤其是與 JS 的交互效果會有影響瓣窄。

我們可以使用?clearfloat?實現(xiàn)清除浮動,這里就不多介紹了纳鼎,想要了解的可以閱讀清除浮動俺夕。

2.導(dǎo)致外邊距折疊

相鄰的兩個盒子(可能是兄弟關(guān)系也可能是祖先關(guān)系)的垂直邊距相遇時, 它們將形成一個外邊距贱鄙。這個外邊距的高度等于兩個發(fā)生折疊的外邊距的高度中的較大者劝贸。

HTML

<div class="Container">

? ? <p>Sibling 1</p>

? ? <p>Sibling 2</p>

</div>

CSS

.Container {

? ? background-color: red;

? ? overflow: hidden; /* creates a block formatting context */

}

p {

? ? background-color: lightgreen;

? ? margin: 10px 0;

}

如上圖所示:紅色盒子(Container)中包含兩個綠色的兄弟元素(P),并且紅色盒子設(shè)置 overflow: hidden; 則一個BFC 已經(jīng)被創(chuàng)建,即導(dǎo)致外邊距折疊逗宁。

理論上兩個兄弟元素之間的邊距應(yīng)該是兩個元素的邊距之和(20px)映九,但實際是 10px。這就是外邊距折疊導(dǎo)致的瞎颗。

2.1 折疊外邊距的值

兩個相鄰的外邊距都是?正數(shù)?時件甥,折疊外邊距是兩者中較大的值。

兩個相鄰的外邊距都是?負(fù)數(shù)?時哼拔,折疊外邊距是兩者中絕對值較大的值引有。

兩個相鄰的外邊距是?一正一負(fù)?時,折疊外邊距是兩者相加的和倦逐。

2.2?外邊距折疊的條件是 margin 必須相鄰!

3.避免外邊距折疊

這一聽起來可能有些困惑譬正,因為我們在前面討論了 BFC 導(dǎo)致外邊距折疊的問題。但我們必須記住的是外邊距折疊(Margin collapsing)只會發(fā)生在屬于同一BFC的塊級元素之間檬姥。如果它們屬于不同的 BFC导帝,它們之間的外邊距則不會折疊。所以通過創(chuàng)建一個不同的 BFC?穿铆,就可以避免外邊距折疊。

修改前面的例子并添加第三個兄弟元素斋荞,CSS不變荞雏。

HTML

<div class="Container">

? ? ? ? <p>Sibling 1</p>

? ? ? ? <p>Sibling 2</p>

? ? ? ? <p>Sibling 3</p>

</div>

結(jié)果不會改變,還會折疊外邊距平酿,三個兄弟元素(P)將會以垂直距離為 10px 的距離分開凤优。原因是三個兄弟元素都屬于同一個 BFC。

創(chuàng)建一個不同的 BFC 蜈彼,就可以避免外邊距折疊筑辨。

HTML

<div class="Container">

? ? ? ? <p>Sibling 1</p>

? ? ? ? <p>Sibling 2</p>

? ? ? ? <div class="newBFC">

? ? ? ? ? ? <p>Sibling 3</p>

? ? ? ? </div>

</div>

CSS

.Container {

? ? ? ? ? ? background-color: red;

? ? ? ? ? ? overflow: hidden; /* creates a block formatting context */

}

p {

? ? ? ? ? ? background-color: lightgreen;

? ? ? ? ? ? margin: 10px 0;

}

.newBFC {

? ? ? ? ? ? overflow: hidden; /* creates new block formatting context */

}


當(dāng)?shù)诙偷谌齻€兄弟元素屬于不同的 BFC 時,它們之間就沒有外邊距折疊幸逆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棍辕,一起剝皮案震驚了整個濱河市暮现,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楚昭,老刑警劉巖栖袋,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抚太,居然都是意外死亡塘幅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門尿贫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來电媳,“玉大人,你說我怎么就攤上這事庆亡∝遗遥” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵身冀,是天一觀的道長钝尸。 經(jīng)常有香客問我,道長搂根,這世上最難降的妖魔是什么珍促? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮剩愧,結(jié)果婚禮上猪叙,老公的妹妹穿的比我還像新娘。我一直安慰自己仁卷,他們只是感情好穴翩,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦积,像睡著了一般芒帕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丰介,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天背蟆,我揣著相機與錄音,去河邊找鬼哮幢。 笑死带膀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橙垢。 我是一名探鬼主播垛叨,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柜某!你這毒婦竟也來了嗽元?” 一聲冷哼從身側(cè)響起敛纲,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎还棱,沒想到半個月后载慈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡珍手,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年办铡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳要。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寡具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚补,到底是詐尸還是另有隱情童叠,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布课幕,位于F島的核電站厦坛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乍惊。R本人自食惡果不足惜杜秸,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望润绎。 院中可真熱鬧撬碟,春花似錦、人聲如沸莉撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍郎。三九已至其障,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涂佃,已是汗流浹背静秆。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡李,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓扶认,卻偏偏與公主長得像侨拦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辐宾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案狱从? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,737評論 1 92
  • 1.浮動元素有什么特征?對父容器与涡、其他浮動元素惹谐、普通元素、文字分別有什么影響? 何謂浮動元素驼卖?有什么特征氨肌?所謂浮動...
    草鞋弟閱讀 809評論 0 1
  • 1. 在什么場景下會出現(xiàn)外邊距合并桥胞?如何合并恳守?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 外邊距合并:外...
    進(jìn)擊的阿群閱讀 902評論 1 2
  • 案主自述:性別女贩虾,年齡:26催烘;職業(yè):項目管理。出去旅游一趟印象特別深刻整胃,就畫出來了颗圣。先確認(rèn)主題,童話世界印在畫里屁使,...
    皮皮爸爸時代閱讀 202評論 0 2
  • 今天的心情就像這天氣一樣在岂,時晴時陰,特別是下午蛮寂,在家坐立不安蔽午,不到點就開車去學(xué)校了,一直在等你放學(xué)酬蹋。今天你...
    梓浩媽媽閱讀 228評論 0 1