BFC原理及示例

一件缸、常見(jiàn)定位方案

在講 BFC 之前公荧,我們先來(lái)了解一下常見(jiàn)的定位方案,定位方案是控制元素的布局微渠,有三種常見(jiàn)方案:

  • 普通流 (normal flow)

在普通流中搭幻,元素按照其在 HTML 中的先后位置至上而下布局,在這個(gè)過(guò)程中逞盆,行內(nèi)元素水平排列檀蹋,直到當(dāng)行被占滿然后換行,塊級(jí)元素則會(huì)被渲染為完整的一個(gè)新行云芦,除非另外指定俯逾,否則所有元素默認(rèn)都是普通流定位,也可以說(shuō)舅逸,普通流中元素的位置由該元素在 HTML 文檔中的位置決定桌肴。

  • 浮動(dòng) (float)

在浮動(dòng)布局中,元素首先按照普通流的位置出現(xiàn)堡赔,然后根據(jù)浮動(dòng)的方向盡可能的向左邊或右邊偏移识脆,其效果與印刷排版中的文本環(huán)繞相似。

  • 絕對(duì)定位 (absolute positioning)

在絕對(duì)定位布局中善已,元素會(huì)整體脫離普通流灼捂,因此絕對(duì)定位元素不會(huì)對(duì)其兄弟元素造成影響,而元素具體的位置由絕對(duì)定位的坐標(biāo)決定换团。

二悉稠、BFC 概念

Formatting context(格式化上下文) 是 W3C CSS2.1 規(guī)范中的一個(gè)概念。它是頁(yè)面中的一塊渲染區(qū)域艘包,并且有一套渲染規(guī)則的猛,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用想虎。

那么 BFC 是什么呢卦尊?

BFC 即 Block Formatting Contexts (塊級(jí)格式化上下文),它屬于上述定位方案的普通流舌厨。

具有 BFC 特性的元素可以看作是隔離了的獨(dú)立容器岂却,容器里面的元素不會(huì)在布局上影響到外面的元素,并且 BFC 具有普通容器所沒(méi)有的一些特性。

通俗一點(diǎn)來(lái)講躏哩,可以把 BFC 理解為一個(gè)封閉的大箱子署浩,箱子內(nèi)部的元素?zé)o論如何翻江倒海,都不會(huì)影響到外部扫尺。

三筋栋、觸發(fā) BFC

只要元素滿足下面任一條件即可觸發(fā) BFC 特性:

  • body 根元素
  • 浮動(dòng)元素:float 除 none 以外的值
  • 絕對(duì)定位元素:position (absolute、fixed)
  • display 為 inline-block正驻、table-cells弊攘、flex
  • overflow 除了 visible 以外的值 (hidden、auto拨拓、scroll)

四肴颊、BFC 特性及應(yīng)用

1. 同一個(gè) BFC 下外邊距會(huì)發(fā)生折疊

<head>
div{
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;
}
</head>
<body>
    <div></div>
    <div></div>
</body>

avatar

從效果上看,因?yàn)閮蓚€(gè) div 元素都處于同一個(gè) BFC 容器下 (這里指 body 元素) 所以第一個(gè) div 的下邊距和第二個(gè) div 的上邊距發(fā)生了重疊渣磷,所以兩個(gè)盒子之間距離只有 100px,而不是 200px授瘦。

首先這不是 CSS 的 bug醋界,我們可以理解為一種規(guī)范,如果想要避免外邊距的重疊提完,可以將其放在不同的 BFC 容器中形纺。

<div class="container">
    <p></p>
</div>
<div class="container">
    <p></p>
</div>

.container {
    overflow: hidden;
}
p {
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;
}

這時(shí)候,兩個(gè)盒子邊距就變成了 200px

avatar

2. BFC 可以包含浮動(dòng)的元素(清除浮動(dòng))

我們都知道徒欣,浮動(dòng)的元素會(huì)脫離普通文檔流逐样,來(lái)看下下面一個(gè)例子

<div style="border: 1px solid #000;">
    <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>

avatar

由于容器內(nèi)元素浮動(dòng),脫離了文檔流打肝,所以容器只剩下 2px 的邊距高度脂新。如果使觸發(fā)容器的 BFC,那么容器將會(huì)包裹著浮動(dòng)元素粗梭。

<div style="border: 1px solid #000;overflow: hidden">
    <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>

效果如圖:

avatar

3. BFC 可以阻止元素被浮動(dòng)元素覆蓋

先來(lái)看一個(gè)文字環(huán)繞效果:

<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個(gè)左浮動(dòng)的元素</div>
<div style="width: 200px; height: 200px;background: #eee">
我是一個(gè)沒(méi)有設(shè)置浮動(dòng), 
也沒(méi)有觸發(fā) BFC 元素, width: 200px; height:200px; background: #eee;</div>

avatar

這時(shí)候其實(shí)第二個(gè)元素有部分被浮動(dòng)元素所覆蓋争便,(但是文本信息不會(huì)被浮動(dòng)元素所覆蓋) 如果想避免元素被覆蓋,可觸第二個(gè)元素的 BFC 特性断医,在第二個(gè)元素中加入 overflow: hidden滞乙,就會(huì)變成:

avatar

這個(gè)方法可以用來(lái)實(shí)現(xiàn)兩列自適應(yīng)布局,效果不錯(cuò)鉴嗤,這時(shí)候左邊的寬度固定斩启,右邊的內(nèi)容自適應(yīng)寬度(去掉上面右邊內(nèi)容的寬度)。

參考文章: https://zhuanlan.zhihu.com/p/25321647

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末醉锅,一起剝皮案震驚了整個(gè)濱河市兔簇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖男韧,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴摊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡此虑,警方通過(guò)查閱死者的電腦和手機(jī)甚纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朦前,“玉大人介杆,你說(shuō)我怎么就攤上這事【麓纾” “怎么了春哨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恩伺。 經(jīng)常有香客問(wèn)我赴背,道長(zhǎng),這世上最難降的妖魔是什么晶渠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任凰荚,我火速辦了婚禮,結(jié)果婚禮上褒脯,老公的妹妹穿的比我還像新娘便瑟。我一直安慰自己,他們只是感情好番川,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布到涂。 她就那樣靜靜地躺著,像睡著了一般颁督。 火紅的嫁衣襯著肌膚如雪践啄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天适篙,我揣著相機(jī)與錄音往核,去河邊找鬼。 笑死嚷节,一個(gè)胖子當(dāng)著我的面吹牛聂儒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硫痰,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衩婚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了效斑?” 一聲冷哼從身側(cè)響起非春,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奇昙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體护侮,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年储耐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羊初。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡什湘,死狀恐怖长赞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闽撤,我是刑警寧澤得哆,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站哟旗,受9級(jí)特大地震影響贩据,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闸餐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一乐设、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绎巨,春花似錦、人聲如沸蠕啄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)歼跟。三九已至和媳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哈街,已是汗流浹背留瞳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骚秦,地道東北人她倘。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像作箍,于是被迫代替她去往敵國(guó)和親硬梁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案胞得? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • 1. 前言 前端圈有個(gè)“褂梗”:在面試時(shí),問(wèn)個(gè)css的position屬性能刷掉一半人,其中不乏工作四五年的同學(xué)跃巡。在...
    YjWorld閱讀 4,446評(píng)論 5 15
  • 一危号,浮動(dòng)元素有什么特征?對(duì)父容器素邪、其他浮動(dòng)元素外莲、普通元素、文字分別有什么影響? 浮動(dòng)模型是一種可視化格式模型娘香,浮動(dòng)...
    DeeJay_Y閱讀 872評(píng)論 0 4
  • relative:生成相對(duì)定位的元素苍狰,通過(guò)top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 943評(píng)論 0 2
  • String、StringBuffer烘绽、StringBuilder
    zero_21閱讀 491評(píng)論 0 0