CSS2 速查表 - BFC與邊距重疊詳解

1.什么是BFC垒棋?

在解釋 BFC 是什么之前,需要先介紹 BoxFormatting Context的概念捺檬。

  • Box: CSS布局的基本單位
    BoxCSS 布局的對(duì)象和基本單位, 直觀點(diǎn)來(lái)說(shuō)贸铜,就是一個(gè)頁(yè)面是由很多個(gè)** Box** 組成的堡纬。元素的類型和 display 屬性聂受,決定了這個(gè) Box 的類型。 不同類型的 Box烤镐, 會(huì)參與不同的Formatting Context一個(gè)決定如何渲染文檔的容器)蛋济,因此Box內(nèi)的元素會(huì)以不同的方式渲染。讓我們看看有哪些盒子:
    block-level boxdisplay 屬性為 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** 中才有侣肄, 這兒先不講了旧困。

  • Formatting context
    Formatting contextW3C CSS2.1 規(guī)范中的一個(gè)概念。它是頁(yè)面中的一塊渲染區(qū)域稼锅,并且有一套渲染規(guī)則吼具,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用矩距。最常見(jiàn)的** Formatting context Block fomatting context (簡(jiǎn)稱BFC) Inline formatting context (簡(jiǎn)稱IFC)**拗盒。
    CSS2.1 中只有 BFC 和 IFC
    CSS3 中還增加了 GFC 和 FFC。

2. BFC 定義

BFC(Block formatting context)直譯為"塊級(jí)格式化上下文"锥债。它是一個(gè)獨(dú)立的渲染區(qū)域陡蝇,只有Block-level box參與, 它規(guī)定了內(nèi)部的Block-level Box如何布局赞弥,并且與這個(gè)區(qū)域外部毫不相干毅整。

3. BFC布局特性

1. 內(nèi)部的盒會(huì)在垂直方向一個(gè)接一個(gè)排列(可以看作BFC中有一個(gè)的常規(guī)流);

2. 處于同一個(gè)BFC中的元素相互影響绽左,可能會(huì)發(fā)生margin collapse悼嫉;

3. 每個(gè)元素的margin box的左邊,與容器塊border box的左邊相接觸
  (對(duì)于從左往右的格式化拼窥,否則相反)戏蔑。即使存在浮動(dòng)也是如此;

4. BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器鲁纠,容器里面的子元素不會(huì)影響到外面的元素总棵,反之亦然;

5. 計(jì)算BFC的高度時(shí)改含,考慮BFC所包含的所有元素情龄,連浮動(dòng)元素也參與計(jì)算;

6. 浮動(dòng)盒區(qū)域不疊加到BFC上

這么多性質(zhì)有點(diǎn)難以理解,但可以作如下推理來(lái)幫助理解:html的根元素就是<html>骤视,而根元素會(huì)創(chuàng)建一個(gè)BFC鞍爱,創(chuàng)建一個(gè)新的BFC時(shí)就相當(dāng)于在這個(gè)元素內(nèi)部創(chuàng)建一個(gè)新的<html>,子元素的定位就如同在一個(gè)新<html>頁(yè)面中那樣专酗,而這個(gè)新舊html頁(yè)面之間時(shí)不會(huì)相互影響的睹逃。

上述這個(gè)理解并不是最準(zhǔn)確的理解,甚至是將因果倒置了(因?yàn)閔tml是根元素祷肯,因此才會(huì)有BFC的特性沉填,而不是BFC有html的特性),但這樣的推理可以幫助理解BFC這個(gè)概念佑笋。

2.哪些元素會(huì)生成BFC翼闹?

 1. 根元素 <html>

 2. float屬性不為none

 3. position為absolute或fixed

 4. display為inline-block, table-cell, table-caption, flex, inline-flex

 5. overflow不為visible

3. margin collapse(邊距坍塌&邊距重疊)

  • 在理解bfc的原理之前先讓我們理解一下什么是margin collapse(邊距坍塌&邊距重疊)

實(shí)例:

.box2{
    background: lightblue;
    width:100px;
}
  <div class="box2">
  </div>
  當(dāng)box2中沒(méi)有任何填充內(nèi)容,文字或圖片等允青。且沒(méi)有指定垂直邊框boder-top橄碾、boder-bottom
  那么上面的代碼在頁(yè)面上不會(huì)顯示任何效果卵沉。
  當(dāng)我們?yōu)閎ox2里填充一些文字
  <div class="box2">
       這是box2填充內(nèi)容
  </div>
  或者指定垂直邊框 boder-top颠锉、boder-bottom
  .box2{
        background: lightblue;
        width:100px;
        border-top:1px solid transparent ;
  }      

一個(gè)DIV和它的子DIV特別重視垂直邊框填充,也就好像是史汗,一口鍋琼掠,里面放個(gè)盆,能不能扣住里面的盆停撞,主要看鍋蓋了瓷蛙,垂直邊框或填充就是這個(gè)“鍋蓋”。于是解決的方式至少有以下三種:

  1. 邊框戈毒,當(dāng)然可以設(shè)置邊框?yàn)橥该?
  2. 為父容器添加padding艰猬,或者至少添加padding-top;
  3. 將父容器BFC化;
  <style type="text/css">
        .box {
            background: lightblue;
            width: 300px;
            height: 250px;
            margin: 20px;
         /* 1.設(shè)置垂直邊框
             border-top:1px solid transparent ;
             border-bottom: 1px solid transparent;
          */
         /* 2.為父DIV添加padding,或者至少添加padding-top
             padding: 1px 0;
           */
         /* 3.各種可BFC化得條件
             overflow: hidden;
           */
        }
        
        .children {
            width: 200px;
            background: lightcoral;
            height: 200px;
            margin: 10px;
        }
    </style>
 <body>
        <div class="box">
    </div>  
    <div class="box" style="height: auto;">
        <div class="children" >
        </div>
    </div>
  </body>
以上三種方式最終效果都一樣

4.代碼實(shí)例與BFC原理分析

  • 實(shí)例1

特性1埋市,特性2冠桃,特性4

<style type="text/css">
.bfc {
        background-color: lightblue;
        overflow: hidden;
        width: 500px;
}
        
p {
        background-color: lightcoral;
        height: 50px;
        line-height: 50px;
        margin: 10px ;
}
.new-bfc{
        overflow: hidden;
}
</style>
<body>
    <div class="bfc">
        <p>children 1</p>
        <p>children 2</p>
        <p>children 3</p>
        <div class="new-bfc"> 
            <p>children 4</p>
        </div>
    </div>
</body>
  • 實(shí)例2

    特性3 特性6

     <style type="text/css">
         body {
             margin: 0;
             padding:200px;
         }
         #box {
             background: lightblue;
             width: 600px;
         }
         .right {
             background: lightcoral;
             opacity: 0.5;
             border: 3px solid saddlebrown;
             width: 300px;
             min-height: 100px;
         }
         .left {
             background: lightseagreen;
             border: 3px solid saddlebrown;
             width: 200px;
             height: 200px;
         }
     </style>
     <body>
       <div id="box">
           <div class="left">
           </div>
           <div class="right">
           </div>
       </div>
     </body>
    
 當(dāng)給.left 加上左浮動(dòng)
  .left {
        background: lightseagreen;
        border: 3px solid saddlebrown;
        width: 200px;
        height: 200px;
        float: left;
  }
  • 實(shí)例3

特性5

   現(xiàn)在通過(guò) 給 #box 設(shè)置 overflow:hidden 來(lái)創(chuàng)建BFC,再看看效果如何道宅。      
    #box {
          background: lightblue;
          width: 600px;
          overflow: hidden;
    }
  • 實(shí)例4

特性4
現(xiàn)在通過(guò) 給 .right 中放入一些灰色小塊食听,再看看效果如何。
.item{
background: lightslategrey;
width: 50px;
height: 50px;
margin: 10px;
float: left;
}

  接下來(lái)污茵,在.item 的父元素.right 上我們也添加一個(gè)左浮動(dòng)樱报,再看看效果。 
  .right {
            background: lightcoral;
            opacity: 0.5;
            border: 3px solid saddlebrown;
            width: 300px;
            min-height: 100px;
            float: left;
    }

以上就是BFC的分析泞当,BFC的概念比較抽象迹蛤,但通過(guò)實(shí)例分析應(yīng)該能夠更好地理解BFC。在實(shí)際中,利用BFC可以閉合浮動(dòng)(實(shí)例3)盗飒,防止與浮動(dòng)元素重疊(實(shí)例4)穷缤。同時(shí),由于BFC的隔離作用箩兽,可以利用BFC包含一個(gè)元素津肛,防止這個(gè)元素與BFC外的元素發(fā)生margin collapse。

文中實(shí)例

邊距重疊
實(shí)例1
實(shí)例2-4

參考

http://www.wtoutiao.com/p/AfdISl.html
http://blog.chinaunix.net/uid-22414998-id-3138656.html
http://www.reibang.com/p/fc1d61dace7b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汗贫,一起剝皮案震驚了整個(gè)濱河市身坐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌落包,老刑警劉巖部蛇,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咐蝇,居然都是意外死亡涯鲁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門有序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抹腿,“玉大人,你說(shuō)我怎么就攤上這事旭寿【ǎ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵盅称,是天一觀的道長(zhǎng)肩祥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缩膝,這世上最難降的妖魔是什么混狠? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮疾层,結(jié)果婚禮上将饺,老公的妹妹穿的比我還像新娘。我一直安慰自己云芦,他們只是感情好俯逾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舅逸,像睡著了一般桌肴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琉历,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天坠七,我揣著相機(jī)與錄音水醋,去河邊找鬼。 笑死彪置,一個(gè)胖子當(dāng)著我的面吹牛拄踪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳魁,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惶桐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了潘懊?” 一聲冷哼從身側(cè)響起姚糊,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎授舟,沒(méi)想到半個(gè)月后救恨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡释树,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年肠槽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢啥。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秸仙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扫尺,到底是詐尸還是另有隱情筋栋,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布正驻,位于F島的核電站,受9級(jí)特大地震影響抢腐,放射性物質(zhì)發(fā)生泄漏姑曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一迈倍、第九天 我趴在偏房一處隱蔽的房頂上張望伤靠。 院中可真熱鬧,春花似錦啼染、人聲如沸宴合。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卦洽。三九已至,卻和暖如春斜棚,著一層夾襖步出監(jiān)牢的瞬間阀蒂,已是汗流浹背该窗。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤霞,地道東北人酗失。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昧绣,于是被迫代替她去往敵國(guó)和親规肴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案夜畴? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,761評(píng)論 1 92
  • 先前在學(xué)習(xí)CSS float時(shí)奏纪,有同學(xué)提到了BFC這個(gè)詞,作為求知好問(wèn)的好學(xué)生斩启,哪里不懂查哪里序调,那么今天就來(lái)研究一...
    這名字真不對(duì)閱讀 6,566評(píng)論 3 19
  • 什么是BFC BFC全稱是Block Formatting Context,即塊格式化上下文兔簇。它是CSS2.1規(guī)范...
    陌客百里閱讀 534評(píng)論 3 4
  • relative:生成相對(duì)定位的元素发绢,通過(guò)top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 947評(píng)論 0 2
  • BFC全稱是Block Formatting Context,即塊格式化上下文垄琐。它是CSS2.1規(guī)范定義的边酒,關(guān)于C...
    xf0128閱讀 340評(píng)論 0 0