CSS之深入淺出理解BFC

一、BFC是什么?

官方定義

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

詳見MDN

看不明白?那就對了!
官方解釋若不搞得抽象難懂些,怎能顯出高大上??。ㄊ謩踊?/em>

個人理解

1、BFC是一個獨立的布局環(huán)境,BFC內(nèi)部的元素布局與外部互不影響;
2、可以通過一些條件觸發(fā)BFC,從而實現(xiàn)布局上的需求或解決一些問題;
3、可以將BFC想象成一個工具,無需探究其定義,只要著重理解其功能(特性)即可。


二、BFC有什么用?

BFC的觸發(fā)條件

1、根元素(<html>)
2、float值非none
3、overflow值非visible
4、display值為inline-block、table-cell、table-caption、flex、inline-flex
5、position值為absolute、fixed

BFC的特性

1、屬于同一個BFC的兩個相鄰容器的上下margin會重疊(重點)
2、計算BFC高度時浮動元素也參于計算(重點)
3、BFC的區(qū)域不會與浮動容器發(fā)生重疊(重點)
4、BFC內(nèi)的容器在垂直方向依次排列
5、元素的margin-left與其包含塊的border-left相接觸
6、BFC是獨立容器,容器內(nèi)部元素不會影響容器外部元素

注:其中1、2、3需重點理解,其特性和功能下面將用代碼逐個演示;
??????????????4、5、6為基本現(xiàn)象,按字面意思理解即可,不做重點說明。


特性1:屬于同一個BFC的兩個相鄰容器的上下margin會重疊

功能:可解釋為何相鄰兩容器上下外邊距會發(fā)生重疊

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .top{
                width: 200px;
                height: 200px;
                background: red;
                margin-bottom: 40px;
            }
            .bottom{
                width: 200px;
                height: 200px;
                background: blue;
                margin-top: 60px;
            }
        </style>
</head>
<body>
        <div class="top"></div>
        <div class="bottom"></div>
</body>
</html>

代碼渲染效果如下:

圖1:紅色塊下外邊距
圖2:藍(lán)色塊上外邊距

現(xiàn)象:
當(dāng)給紅色塊下外邊距margin-bottom,給藍(lán)色塊上外邊距margin-top時,上下外邊距會發(fā)生重疊,兩個色塊的間距解析為兩者中的較大值(60px)。

原因:
此時紅色塊和藍(lán)色塊屬于同一個BFC,即根元素(<html>)。BFC的特性1規(guī)定 “屬于同一個BFC的兩個相鄰容器的上下margin會重疊”,故兩者上下邊距發(fā)生重疊。

通過BFC特性解決上下margin的重疊問題:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .top{
                width: 200px;
                height: 200px;
                background: red;
                margin-bottom: 60px;
            }
            .bottom{
                width: 200px;
                height: 200px;
                background: blue;
                margin-top: 60px;
            }
            .box{
                overflow: hidden;
            }
        </style>
</head>
<body>
        <div class="top"></div>
        <div class="box">
            <div class="bottom"></div>
        </div>
</body>
</html>

代碼渲染效果如下:

image

現(xiàn)象:
給藍(lán)色塊添加父元素.box并添加聲明overflow: hidden;可以解決紅色塊和藍(lán)色塊的上下margin重疊問題。

原因:
通過給藍(lán)色塊添加父元素.box并添加聲明overflow: hidden;,使得父元素.box觸發(fā)了BFC(見BFC觸發(fā)條件3),此時紅色塊和藍(lán)色塊屬于不同的BFC,紅色塊的BFC仍然是根元素(<html>),藍(lán)色塊的BFC是父元素.box。即不滿足BFC特性1中的規(guī)定“屬于同一個BFC······”,從而解決了兩者的上下margin重疊問題。

注:overflow: hidden;只是觸發(fā)BFC眾多條件中的一個,使用其他條件也能解決此問題,注意觸發(fā)條件可能造成的其他影響即可,如浮動會造成的脫離文檔流等。


特性2:計算BFC高度時浮動元素也參于計算

功能:可解釋為何overflow: hidden;能解決父元素高度塌陷

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .outside{
                border: 10px solid blue;
            }
            .inside{
                width: 200px;
                height: 200px;
                background: yellowgreen;
                float: left;
            }
        </style>
</head>
<body>
        <div class="outside">
            <div class="inside"></div>
        </div>
</body>
</html>

代碼渲染效果如下:

image

現(xiàn)象:
當(dāng)父元素.outside沒有設(shè)置高度且子元素.inside都浮動時,父元素.outside會出現(xiàn)高度塌陷。

原因:
子元素.inside設(shè)置浮動后脫離文檔流,而父元素.outside又沒有設(shè)置高度,故父元素.outside會出現(xiàn)高度塌陷。

通過BFC特性解決高度塌陷問題:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .outside{
                border: 10px solid blue;
                overflow: hidden;
            }
            .inside{
                width: 200px;
                height: 200px;
                background: yellowgreen;
                float: left;
            }
        </style>
</head>
<body>
        <div class="outside">
            <div class="inside"></div>
        </div>
</body>
</html>

代碼渲染效果如下:

image

現(xiàn)象:
給父元素.outside添加聲明overflow: hidden;,父元素高度塌陷消失。

原因:
給父元素.outside添加聲明overflow: hidden;,使得父元素.outside觸發(fā)了BFC(見BFC觸發(fā)條件3),而BFC特性規(guī)定“計算BFC高度時浮動元素也參于計算”,此時子元素.inside雖然設(shè)置了浮動,但其高度仍計算至父元素內(nèi),從而解決了高度塌陷問題。


特性3:BFC的區(qū)域不會與浮動容器發(fā)生重疊

功能:在布局上實現(xiàn)自適應(yīng)兩欄(三欄)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .left{
                width: 100px;
                height: 200px;
                background: yellowgreen;
                float: left;
            }
            .right{
                height: 300px;
                background: blue;
            }
        </style>
</head>
<body>
        <div class="left"></div>
        <div class="right"></div>
</body>
</html>

代碼渲染效果如下:

image

現(xiàn)象:
正常情況下,左側(cè)元素.left浮動時,會與右側(cè)元素.right發(fā)生重疊,不能實現(xiàn)自適應(yīng)兩欄效果。

原因:
左側(cè)元素浮動,脫離文檔流。

通過BFC特性解決重疊問題:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
        <style type="text/css">
            .left{
                width: 100px;
                height: 200px;
                background: yellowgreen;
                float: left;
            }
            .right{
                height: 300px;
                background: blue;
                overflow: hidden;
            }
        </style>
</head>
<body>
        <div class="left"></div>
        <div class="right"></div>
</body>
</html>

代碼渲染效果如下:

image

現(xiàn)象:
給右側(cè)元素.right添加聲明overflow: hidden;,左右側(cè)元素重疊消失,實現(xiàn)自適應(yīng)兩欄效果。

原因:
給右側(cè)元素.right添加聲明overflow: hidden;,使得右側(cè)元素觸發(fā)了BFC(見BFC觸發(fā)條件3),而BFC特性規(guī)定“BFC的區(qū)域不會與浮動容器發(fā)生重疊”,從而解決了重疊問題,實現(xiàn)自適應(yīng)兩欄效果。


特性4:BFC內(nèi)的容器在垂直方向依次排列

類似正常情況下塊元素在垂直方向上依次排列,較易理解。

image


特性5:元素的margin-left與其包含塊的border-left相接觸

基本現(xiàn)象,較易理解。

在這里插入圖片描述


特性6:BFC是獨立容器,容器內(nèi)部元素不會影響容器外部元素

較易理解。


BFC功能總結(jié)

1、可以利用BFC解決兩個相鄰元素的上下margin重疊問題;
2、可以利用BFC解決高度塌陷問題;
3、可以利用BFC實現(xiàn)多欄布局(兩欄、三欄、圣杯、雙飛翼等)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一,浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 997評論 0 4
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進(jìn)行定位...
    zx9426閱讀 1,070評論 0 2
  • BFC(Block Formatting Context)塊級格式化上下文 注意:BFC首先是塊,其次需要具備下面...
    只跟自己比閱讀 483評論 0 2
  • 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 何謂浮動元素?有什么特征?所謂浮動...
    草鞋弟閱讀 921評論 0 1
  • 一、常用css定位流描述 1、文檔流定位 position: static(默認(rèn)方式) 頁面元素的默認(rèn)定位方式 塊...
    EdmundChen閱讀 1,964評論 0 8

友情鏈接更多精彩內(nèi)容