什么是BFC(Block Formatting Context) ?其如何工作家浇?

BFC 已經(jīng)是一個(gè)耳聽熟聞的詞語了碴裙,網(wǎng)上有許多關(guān)于 BFC 的文章,介紹了如何觸發(fā) BFC 以及 BFC 的一些用處(如清浮動(dòng)莺琳,防止 margin 重疊等),那么今天就來詳細(xì)學(xué)習(xí)下什么是BFC以及他的應(yīng)用载慈。

1.BFC是什么

在解釋什么是BFC之前,需要先介紹BOX办铡、Formatting Context的概念

BOX:CSS布局的基本單位

Box 是 CSS 布局的對(duì)象和基本單位料扰, 直觀點(diǎn)來說,就是一個(gè)頁面是由很多個(gè) Box 組成的晒杈。元素的類型和 display 屬性孔厉,決定了這個(gè) Box 的類型。 不同類型的 Box粪般, 會(huì)參與不同的

Formatting Context(一個(gè)決定如何渲染文檔的容器)污桦,因此Box內(nèi)的元素會(huì)以不同的方式渲染。

block-level box:display 屬性為 block, list-item, table 的元素小作,會(huì)生成 block-level box。并且參與 block fomatting

context达罗;

inline-level box:display 屬性為 inline, inline-block, inline-table 的元素静秆,會(huì)生成 inline-level box。并且參與 inline

formatting context扶认;

run-in box: run-in框的行為如下:

如果run-in框包含一個(gè)塊框殊橙,那么run-in框變?yōu)閴K框。

如果run-in框的后繼兄弟元素為塊框(非浮動(dòng)蛀柴,非絕對(duì)定位),那么run-in框變?yōu)樵搲K框的第一個(gè)行內(nèi)框吊洼。run-in不能插入本身為run-in的塊中制肮,也不能插入塊中已有run-in的塊中。

否則综液,run-in框變?yōu)閴K框儒飒。

Formatting context

Formatting context 是 W3C CSS2.1 規(guī)范中的一個(gè)概念。它是頁面中的一塊渲染區(qū)域附帽,并且有一套渲染規(guī)則井誉,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用喳钟。最常見的 Formatting context 有 Block fomatting context (簡(jiǎn)稱BFC)和 Inline formatting context (簡(jiǎn)稱IFC)。? ? ? ? CSS2.1 中只有 BFC 和 IFC, CSS3 中還增加了 GFC 和 FFC奔则。

IFC

IFC(Inline Formatting Contexts)直譯為"內(nèi)聯(lián)格式化上下文"应狱,IFC的line box(線框)高度由其包含行內(nèi)元素中最高的實(shí)際高度計(jì)算而來(不受到豎直方向的padding/margin影響)? ? ? ? IFC中的line box一般左右都貼緊整個(gè)IFC,但是會(huì)因?yàn)閒loat元素而擾亂疾呻。float元素會(huì)位于IFC與與line box之間,使得line box寬度縮短尉咕。 同個(gè)ifc下的多個(gè)line box高度會(huì)不同璃岳。 IFC中時(shí)不可能有塊級(jí)元素的,當(dāng)插入塊級(jí)元素時(shí)(如p中插入div)會(huì)產(chǎn)生兩個(gè)匿名塊與div分隔開单芜,即產(chǎn)生兩個(gè)IFC犁柜,每個(gè)IFC對(duì)外表現(xiàn)為塊級(jí)元素,與div垂直排列扒腕。? ? ? ? 那么IFC一般有什么用呢萤悴?? ? ? ? 水平居中:當(dāng)一個(gè)塊要在環(huán)境中水平居中時(shí),設(shè)置其為inline-block則會(huì)在外層產(chǎn)生IFC蹋盆,通過text-align則可以使其水平居中硝全。? ? ? ? 垂直居中:創(chuàng)建一個(gè)IFC,用其中一個(gè)元素?fù)伍_父元素的高度,然后設(shè)置其vertical-align:middle拌倍,其他行內(nèi)元素則可以在此父元素下垂直居中噪径。

GFC

GFC(GridLayout Formatting Contexts)直譯為"網(wǎng)格布局格式化上下文"数初,當(dāng)為一個(gè)元素設(shè)置display值為grid的時(shí)候泡孩,此元素將會(huì)獲得一個(gè)獨(dú)立的渲染區(qū)域,我們可以通過在網(wǎng)格容器(grid container)上定義網(wǎng)格定義行(grid definition rows)和網(wǎng)格定義列(grid definition columns)屬性各在網(wǎng)格項(xiàng)目(grid item)上定義網(wǎng)格行(grid row)和網(wǎng)格列(grid columns)為每一個(gè)網(wǎng)格項(xiàng)目(grid item)定義位置和空間仑鸥。? ? ? ? 那么GFC有什么用呢眼俊,和table又有什么區(qū)別呢?首先同樣是一個(gè)二維的表格疮胖,但GridLayout會(huì)有更加豐富的屬性來控制行列澎灸,控制對(duì)齊以及更為精細(xì)的渲染語義和控制。

FFC

FFC(Flex Formatting Contexts)直譯為"自適應(yīng)格式化上下文"性昭,display值為flex或者inline-flex的元素將會(huì)生成自適應(yīng)容器(flex container)巩梢,可惜這個(gè)牛逼的屬性只有谷歌和火狐支持,不過在移動(dòng)端也足夠了括蝠,至少safari和chrome還是OK的,畢竟這倆在移動(dòng)端才是王道搁拙。? ? ? ? Flex Box 由伸縮容器和伸縮項(xiàng)目組成法绵。通過設(shè)置元素的 display 屬性為 flex 或 inline-flex 可以得到一個(gè)伸縮容器。設(shè)置為 flex 的容器被渲染為一個(gè)塊級(jí)元素盐茎,而設(shè)置為 inline-flex 的容器則渲染為一個(gè)行內(nèi)元素徙赢。? ? ? ? 伸縮容器中的每一個(gè)子元素都是一個(gè)伸縮項(xiàng)目探越。伸縮項(xiàng)目可以是任意數(shù)量的窑业。伸縮容器外和伸縮項(xiàng)目?jī)?nèi)的一切元素都不受影響常柄。簡(jiǎn)單地說,F(xiàn)lexbox 定義了伸縮容器內(nèi)伸縮項(xiàng)目該如何布局西潘。

BFC定義

BFC(Block formatting context)直譯為"塊級(jí)格式化上下文"秸架。它是一個(gè)獨(dú)立的渲染區(qū)域,只有Block-level box參與东抹, 它規(guī)定了內(nèi)部的Block-level

Box如何布局缭黔,并且與這個(gè)區(qū)域外部毫不相干。

2.BFC布局規(guī)則:

內(nèi)部的Box會(huì)在垂直方向馏谨,一個(gè)接一個(gè)地放置。

Box垂直方向的距離由margin決定哎媚。屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊

每個(gè)元素的margin box的左邊喊儡, 與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化,否則相反)买喧。即使存在浮動(dòng)也是如此匆赃。

BFC的區(qū)域不會(huì)與float box重疊。

BFC就是頁面上的一個(gè)隔離的獨(dú)立容器低淡,容器里面的子元素不會(huì)影響到外面的元素。反之也如此事期。

計(jì)算BFC的高度時(shí)纸颜,浮動(dòng)元素也參與計(jì)算

3.哪些元素會(huì)生成BFC

根元素

float屬性不為none

position為absolute或fixed

display為inline-blcok绎橘、table-cell、table-caption

overflow不為visible

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涮较,一起剝皮案震驚了整個(gè)濱河市冈止,隨后出現(xiàn)的幾起案子熙暴,更是在濱河造成了極大的恐慌,老刑警劉巖周霉,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俱箱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乃摹,警方通過查閱死者的電腦和手機(jī)跟衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門与斤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磷支,你說我怎么就攤上這事食寡。” “怎么了善榛?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悼院。 經(jīng)常有香客問我咒循,道長(zhǎng),這世上最難降的妖魔是什么颖医? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任裆蒸,我火速辦了婚禮僚祷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘久妆。我一直安慰自己,他們只是感情好肋演,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布爹殊。 她就那樣靜靜地躺著奸绷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号醉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天铅碍,我揣著相機(jī)與錄音线椰,去河邊找鬼。 笑死烦绳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的径密。 我是一名探鬼主播睹晒,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锉试?” 一聲冷哼從身側(cè)響起览濒,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎应又,沒想到半個(gè)月后乏苦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洞就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旬蟋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了革娄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匆浙,死狀恐怖架忌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饰恕,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布破加,位于F島的核電站雹嗦,受9級(jí)特大地震影響范舀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜了罪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一锭环、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泊藕,春花似錦辅辩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讼呢,卻和暖如春撩鹿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悦屏。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窜管,地道東北人散劫。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幕帆,于是被迫代替她去往敵國(guó)和親获搏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案失乾? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,741評(píng)論 1 92
  • 先前在學(xué)習(xí)CSS float時(shí)常熙,有同學(xué)提到了BFC這個(gè)詞,作為求知好問的好學(xué)生碱茁,哪里不懂查哪里裸卫,那么今天就來研究一...
    這名字真不對(duì)閱讀 6,548評(píng)論 3 19
  • 大家好,我是IT修真院鄭州分院纽竣,一枚正直墓贿、純潔茧泪、善良的web程序員。 今天給大家分享一下聋袋,修真院官網(wǎng) CSS任務(wù)中...
    初晨曬暖心閱讀 395評(píng)論 0 0
  • H5移動(dòng)端知識(shí)點(diǎn)總結(jié) 閱讀目錄 移動(dòng)開發(fā)基本知識(shí)點(diǎn) calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,453評(píng)論 0 26
  • relative:生成相對(duì)定位的元素队伟,通過top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 933評(píng)論 0 2