CSS-BFC

BFC

  1. box,Formatting Context

    在解釋 BFC 是什么之前痪蝇,需要先介紹 Box、Formatting Context的概念本冲。

  2. Box: CSS布局的基本單位

    Box 是 CSS 布局的對(duì)象和基本單位讶隐, 直觀點(diǎn)來說鞍帝,就是一個(gè)頁(yè)面是由很多個(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: css3 中才有, 這兒先不講了椒拗。
  3. Formatting context

    Formatting context 是 W3C CSS2.1 規(guī)范中的一個(gè)概念似将。它是頁(yè)面中的一塊渲染區(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译红。

  4. 什么是BFC
    在一個(gè)Web頁(yè)面的CSS渲染中预茄,塊級(jí)格式化上下文 (Block Fromatting Context)是按照塊級(jí)盒子布局的。W3C對(duì)BFC的定義如下:

    浮動(dòng)元素和絕對(duì)定位元素侦厚,非塊級(jí)盒子的塊級(jí)容器(例如 inline-blocks, table-cells, 和 table-captions)耻陕,以及overflow值不為“visiable”的塊級(jí)盒子,都會(huì)為他們的內(nèi)容創(chuàng)建新的BFC(塊級(jí)格式上下文)刨沦。
    為了便于理解诗宣,我們換一種方式來重新定義BFC。一個(gè)HTML元素要?jiǎng)?chuàng)建BFC想诅,則滿足下列的任意一個(gè)或多個(gè)條件即可:

    1召庞、float的值不是none。

    2来破、position的值不是static或者relative篮灼。

    3、display的值是inline-block徘禁、table-cell诅诱、flex、table-caption或者inline-flex

    4送朱、overflow的值不是visible

    BFC是一個(gè)獨(dú)立的布局環(huán)境娘荡,其中的元素布局是不受外界的影響,并且在一個(gè)BFC中驶沼,塊盒與行盒(行盒由一行中所有的內(nèi)聯(lián)元素所組成)都會(huì)垂直的沿著其父元素的邊框排列炮沐。

    IFC布局規(guī)則:

    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垂直排列赢底。
    在行內(nèi)格式化上下文中失都,框(boxes)一個(gè)接一個(gè)地水平排列柏蘑,起點(diǎn)是包含塊的頂部。水平方向上的 margin粹庞,border 和 padding在框之間得到保留咳焚。框在垂直方向上可以以不同的方式對(duì)齊:它們的頂部或底部對(duì)齊庞溜,或根據(jù)其中文字的基線對(duì)齊革半。包含那些框的長(zhǎng)方形區(qū)域,會(huì)形成一行流码,叫做行框又官。

    那么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)元素則可以在此父元素下垂直居中播掷。

      .container{
         background: grey;
         text-align: center;
         height: 400px;
         width: 800px;
         display: table-cell;
         vertical-align: middle;
    
    
     }
    
     .column {
         width: 200px;
         height: 50px;
         background-color: green;
         display: inline-block;
         
     }
    

    BFC布局規(guī)則:

    1. 內(nèi)部的Box會(huì)在垂直方向审编,一個(gè)接一個(gè)地放置。
    2. Box垂直方向的距離由margin決定叮趴。屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊
    3. 每個(gè)元素的margin box的左邊, 與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化权烧,否則相反)眯亦。即使存在浮動(dòng)也是如此。
    4. BFC的區(qū)域不會(huì)與float box重疊般码。
    5. BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器妻率,容器里面的子元素不會(huì)影響到外面的元素。反之也如此板祝。
    6. 計(jì)算BFC的高度時(shí)宫静,浮動(dòng)元素也參與計(jì)算
  5. 怎么創(chuàng)建BFC

    要顯示的創(chuàng)建一個(gè)BFC是非常簡(jiǎn)單的,只要滿足上述4個(gè)CSS條件之一就行券时。例如:

     <div class="container">
       你的內(nèi)容
     </div>
    

    在類container中添加類似 overflow: scroll孤里,overflow: hidden,display: flex橘洞,float: left捌袜,或 display: table 的規(guī)則來顯示創(chuàng)建BFC。雖然添加上述的任意一條都能創(chuàng)建BFC炸枣,但會(huì)有一些副作用:

    1虏等、display: table 可能引發(fā)響應(yīng)性問題
    2弄唧、overflow: scroll 可能產(chǎn)生多余的滾動(dòng)條
    3、float: left 將把元素移至左側(cè)霍衫,并被其他元素環(huán)繞
    4候引、overflow: hidden 將裁切溢出元素

    因而無論什么時(shí)候需要?jiǎng)?chuàng)建BFC,都要基于自身的需要來考慮敦跌。對(duì)于本文澄干,將采用 overflow: hidden 方式:

     .container {
         overflow: hidden;
     }
    
  6. BFC可以做什么呢?

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

      BFC可能造成外邊距折疊峰髓,也可以利用它來避免這種情況傻寂。BFC產(chǎn)生外邊距折疊要滿足一個(gè)條件:兩個(gè)相鄰元素要處于同一個(gè)BFC中。所以携兵,若兩個(gè)相鄰元素在不同的BFC中疾掰,就能避免外邊距折疊。

       <head>
           <meta charset="UTF-8">
           <title>bfc</title>
           <style>
               body,ul,p,li{
                   margin: 0;
                   padding: 0;
               }
               .container{
                   width: 800px;
                   height: 700px;
                   background: grey;
                   float: left;
               }
       
               .container p{
                   width: 200px;
                   height: 100px;
                   margin: 50px;
                   background: yellow;
               }
       
               .p3_container{
                   overflow: hidden;
               }
           </style>
       </head>
       <body>
           <div class="container">
               <p>p1</p>
               <p>p2</p>
               <div class="p3_container">
                   <p>p3</p>
               </div>
           </div>
       </body>
      
    2. BFC包含浮動(dòng)(解決高度塌陷)(計(jì)算BFC的高度時(shí)徐紧,浮動(dòng)元素也參與計(jì)算)
      浮動(dòng)元素是會(huì)脫離文檔流的(絕對(duì)定位元素會(huì)脫離文檔流)静檬。如果一個(gè)沒有高度或者h(yuǎn)eight是auto的容器的子元素是浮動(dòng)元素,則該容器的高度是不會(huì)被撐開的并级。我們通常會(huì)利用偽元素(:after或者:before)來解決這個(gè)問題拂檩。BFC能包含浮動(dòng),也能解決容器高度不會(huì)被撐開的問題嘲碧。

    3. 使用BFC避免文字環(huán)繞(BFC的區(qū)域不會(huì)與float box重疊)

      對(duì)于浮動(dòng)元素稻励,可能會(huì)造成文字環(huán)繞的情況(Figure1),但這并不是我們想要的布局(Figure2才是想要的)愈涩。要解決這個(gè)問題望抽,我們可以用外邊距,但也可以用BFC履婉。

        .container{
           width: 800px;
           height: 700px;
           background: grey;
           float: left;
       }
       <div class="container">
      
           <div class="img-container"><img src="../images/square-02.png" alt=""></div>
           <p>        First let us understand why the text wraps. For this we have to understand how the box model
               works when an element is floated. This is the part I left earlier while discussing
               the alignment in a block formatting context. Let us understand what is happening in
               Figure 1 in the diagram below:
           </p>
       </div>
      

      造成文字環(huán)繞的原因

      在BFC上下文中煤篙,每個(gè)盒子的左外側(cè)緊貼包含塊的左側(cè)(從右到左的格式里,則為盒子右外側(cè)緊貼包含塊右側(cè))毁腿,甚至有浮動(dòng)也是如此(盡管盒子里的行盒子 Line Box 可能由于浮動(dòng)而變窄)辑奈,除非盒子創(chuàng)建了一個(gè)新的BFC(在這種情況下盒子本身可能由于浮動(dòng)而變窄)。
      因而已烤,如果p元素創(chuàng)建一個(gè)新的BFC那它就不會(huì)再緊貼包含塊的左側(cè)了鸠窗。

    4. 在多列布局中使用BFC

      如果我們創(chuàng)建一個(gè)占滿整個(gè)容器寬度的多列布局,在某些瀏覽器中最后一列有時(shí)候會(huì)掉到下一行胯究。這可能是因?yàn)闉g覽器四舍五入了列寬從而所有列的總寬度會(huì)超出容器塌鸯。但如果我們?cè)诙嗔胁季种械淖詈笠涣欣飫?chuàng)建一個(gè)新的BFC,它將總是占據(jù)其他列先占位完畢后剩下的空間唐片。

       例如:
      
       <div class="container">
           <div class="column">column 1</div>
           <div class="column">column 2</div>
           <div class="column">column 3</div>
       </div>
       對(duì)應(yīng)的CSS:
       
       .column {
           width: 31.33%;
           background-color: green;
           float: left;
           margin: 0 1%;
       }
       /*  Establishing a new block formatting 
           context in the last column */
       .column:last-child {
           float: none;
       overflow: hidden; 
       }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丙猬,一起剝皮案震驚了整個(gè)濱河市涨颜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茧球,老刑警劉巖庭瑰,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抢埋,居然都是意外死亡弹灭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門揪垄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穷吮,“玉大人,你說我怎么就攤上這事饥努〖裼悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵酷愧,是天一觀的道長(zhǎng)驾诈。 經(jīng)常有香客問我,道長(zhǎng)溶浴,這世上最難降的妖魔是什么乍迄? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮士败,結(jié)果婚禮上闯两,老公的妹妹穿的比我還像新娘。我一直安慰自己谅将,他們只是感情好漾狼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戏自,像睡著了一般邦投。 火紅的嫁衣襯著肌膚如雪伤锚。 梳的紋絲不亂的頭發(fā)上擅笔,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音屯援,去河邊找鬼猛们。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狞洋,可吹牛的內(nèi)容都是我干的弯淘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吉懊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庐橙!你這毒婦竟也來了假勿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤态鳖,失蹤者是張志新(化名)和其女友劉穎转培,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浆竭,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浸须,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邦泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片删窒。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顺囊,靈堂內(nèi)的尸體忽然破棺而出肌索,到底是詐尸還是另有隱情,我是刑警寧澤包蓝,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布驶社,位于F島的核電站,受9級(jí)特大地震影響测萎,放射性物質(zhì)發(fā)生泄漏亡电。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一硅瞧、第九天 我趴在偏房一處隱蔽的房頂上張望份乒。 院中可真熱鬧,春花似錦腕唧、人聲如沸或辖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂暇。三九已至,卻和暖如春但惶,著一層夾襖步出監(jiān)牢的瞬間耳鸯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工膀曾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县爬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓添谊,卻偏偏與公主長(zhǎng)得像财喳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • BFC耳高,你也許聽過這個(gè)詞扎瓶,但是你可能不是很有底氣地解釋清楚。寫樣式的時(shí)候泌枪,往往加了一個(gè)樣式或者改了一個(gè)屬性栗弟,就能達(dá)...
    WEB攻程獅閱讀 309評(píng)論 0 1
  • 什么是BFC、 塊級(jí)格式化上下文 Box 是 CSS 布局的對(duì)象和基本單位工闺,頁(yè)面是由若干個(gè)Box組成的乍赫。 元素的類...
    希染丶閱讀 614評(píng)論 0 0
  • 簡(jiǎn)介在使用CSS的過程中,經(jīng)常會(huì)聽到觸發(fā)BFC,但是何為BFC陆蟆。BFC(Block formatting cont...
    riverhh閱讀 568評(píng)論 0 4
  • 在CSS奇技淫巧之負(fù)邊距的應(yīng)用里提到了某些場(chǎng)景下前一個(gè)塊的margin-bottom和文檔流之后的下一個(gè)塊的mar...
    小胖子嘿嘿嘿閱讀 501評(píng)論 0 3
  • CSS規(guī)范中對(duì) BFC 的描述 塊級(jí)格式化上下文(block formating context)浮動(dòng)雷厂,絕對(duì)定位元...
    學(xué)的會(huì)的前端閱讀 572評(píng)論 2 2