1. 程式人生 > >塊級格式化上下文(BFC)

塊級格式化上下文(BFC)

最近遇到一個專業的名詞,不是很懂,所以瞭解了一下,並總結歸納一下。首先清楚我們的問題是什麼?

BFC是什麼?怎麼建立?什麼情況下建立?有什麼特性和作用?

BFC是什麼?

BFC 就是一種屬性,這種屬性會影響著元素的定位以及與其兄弟元素之間的相互作用。

如何觸發BFC?

1,浮動元素,float 除 none 以外的值

2,絕對定位元素,position 的absolute,fixed(CSS3新增觸發條件)

3,display 為以下其中之一的值 inline-blocks,table-cells,table-captions(CSS3新增觸發條件)

但是,"display:table" 本身並不產生 BFC,而是由它產生匿名框,匿名框中包含 "display:table-cell" 的框會產 BFC。 總之,對於 "display:table" 的元素,產生 BFC 的是匿名框而不是 "display:table"。

4,overflow 除了 visible 以外的值(hidden,auto,scroll

在 CSS3 中,BFC 叫做 Flow Root。

值得注意的是,BFC 並不是元素,而是某些元素帶有的一些屬性,因此,是上面這些元素產生了 BFC ,而它們本身並不是 BFC ,這個概念需要區分清楚。

特性

1,BFC 會阻止外邊距摺疊

兩個相連的 div 在垂直上的外邊距會發生疊加;外邊距摺疊的規則:僅當兩個塊級元素相鄰並且在同一個塊級格式化上下文時,它們垂直方向之間的外邊距才會疊加;所以說,即便兩個塊級元素相鄰,但當它們不在同一個塊級格式化上下文時它們的邊距也不會摺疊。因此,阻止外邊距摺疊只需產生新的 BFC 。

例子: 三個 div 各包含一個 p 元素,三個 div 及其包含的 p 元素都有頂部和底部的外邊距。但只有第三個 div 的邊距沒有與它的子元素 p 的外邊距摺疊。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p{
            background-color: red;
            width: 500px;
            margin-top: 50px;
            margin-bottom: 50px;
        }
        div {
            background-color: yellow;
            margin-top: 50px;
            margin-bottom: 50px;
        }
    </style>
</head>
<body>
<div><p>第一段</p></div>
<div><p>第二段</p></div>
<div><p style="display: inline-block">第三段</p></div> //添加了display:inline-block屬性,具有BFC屬性
</body>
</html>

2,BFC 可以包含浮動的元素

有兩個 div ,它們各包含一個設定了浮動的 p 元素,但第一個 div 出現了“高度塌陷”,這是因為內部的浮動元素脫離了普通流,因此該 div 相當於一個空標籤,沒有高度和寬度,即高度為 0 ,上下邊框也重疊在一起。而第二個 div 使用 overflow: hidden 觸發了 BFC ,可以包含浮動元素,因此能正確表現出高度,其邊框位置也正常了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p{
            background-color: red;
            float: right;
        }
        div {
            background-color: yellow;
            margin-bottom: 50px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
<div><p>第一段</p></div>
<div style="overflow: hidden "><p >第二段</p></div>
</body>
</html>

 3,BFC 可以阻止元素被浮動元素覆蓋

藍色背景的 div 使用 overflow: hidden 觸發了 BFC ,它並不會被它的兄弟浮動元素覆蓋,而是處於它的旁邊。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p{
            background-color: blue;
            width: 300px;
        }
        div {
            border: 1px solid #ccc;
        }
        .blue {
            background-color: yellow;
            width: 200px;
            float: left;
        }
    </style>
</head>
<body>
<div><p class="blue">第一段</p><p>第一段2</p></div>
<div><p class="blue">第二段</p><p  style="overflow: hidden">第二段2</p></div>
</body>
</html>

 以後可能還會有補充。

 參考文章