淺談BFC(塊格式化上下文)

在我們的開發中常聽到BFC這個詞,當要讓我說出BFC 是什麼,卻不能很好的卻解釋,似懂非懂。反正就是沒有清晰的理解,是這兩天仔細閱讀了相關資料加深自己對BFC理解。(BFC是Web頁面中盒模型佈局的CSS渲染模式,指一個獨立的渲染區域或者說是一個隔離的獨立容器。 )

什麼是BFC

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

1 BFC是一個獨立的佈局環境,其中的元素佈局是不受外界的影響。

2.如果一個元素符合觸發 BFC 的條件,則 BFC 中的元素佈局不受外部影響。

3.浮動不會影響其它BFC中元素的佈局,而清除浮動只能清除同一BFC中在它前面的元素的浮動。

4.塊格式化上下文包含創建它的元素內部的所有內容.

5.在一個 BFC 中,塊盒與行盒(行盒由一行中所有的內聯元素所組成)都會垂直的沿着其父元素的邊框排列。

怎樣才能形成BFC

  • 浮動元素 float的值不爲none。
  • 絕對定位元素(元素的 position 爲 absolute 或 fixed)
  • overflow值不爲 visible 的塊元素
  • display值爲 flow-root的元素
  • display的值爲table-cell, table-caption, inline-block中的任何一個。
  • position的值不爲relative和static。

BFC應用

  • 防止字體環繞
  • 自適應兩(多)欄佈局
  • 清除內部浮動
  • 防止margin重疊

實際代碼中理解BFC

1.讓浮動內容和周圍的內容等高

在實際開發中我們會遇到浮動元素超出了父元素的高度。

<style>
.outer {
  border: 5px dotted rgb(214,129,137);
  width: 450px;
}
.aside {
        width: 100px;
        height: 150px;
        float: left;
        background: #f66;
    }

    .main {
        /* height: 200px; */
        background: #fcc;
    }
</style>
<body>
  <div class="outer">
    <div class="aside"></div>
    <div class="main">I am a floated element.</div>
  </div>
</body>

1575904227(1).jpg

創建一個會包含這個浮動的BFC,通常的做法是設置父元素 overflow: auto 或者設置其他的非默認的 overflow: visible 的值。

.outer {
  border: 5px dotted rgb(214,129,137);
  width: 450px;
  overflow: hidden;
}

1575904393(1).jpg

2.不和浮動元素重疊

如果一個浮動元素後面跟着一個非浮動的元素,那麼就會產生一個覆蓋的現象,很多自適應的兩欄佈局就是這麼做的。比如下圖的效果,參考例子

<style>
.outer {
  border: 5px dotted rgb(214,129,137);
  width: 450px;
  position:  relative;
}
.aside {
        width: 100px;
        height: 150px;
        float: left;
        background: #f66;
    }

    .main {
        height: 200px;
        background: #fcc;
    }
</style>
<body>
  <div class="outer">
    <div class="aside"></div>
    <div class="main">I am a floated element.</div>
  </div>
</body>

1575904599(1).png
由於兩個box都處在同一個BFC中,都是以BFC邊界爲起點,如果兩個box本身都具備BFC的話,會按順序一個一個排列布局,我們這時可以觸發main生成BFC。

    .main {
        height: 200px;
        background: #fcc;
        overflow: hidden;
    }

1575904889(1).jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章