BFC:塊級格式上下文詳解

1.BFC簡要定義

BFC(Block formatting context)直譯爲"塊級格式化上下文"。它是一個獨立的渲染區域,它規定了內部如何佈局,是決定塊盒子的佈局及浮動相互影響範圍的一個區域,並且與這個區域外部毫不相干。

2.BFC創建方式

  • 根元素或其它包含它的元素;
  • 浮動 (元素的float不爲none);
  • 絕對定位元素 (元素的position爲absolute或fixed);
  • 行內塊inline-blocks(元素的 display: inline-block);
  • 表格單元格(元素的display: table-cell,HTML表格單元格默認屬性);
  • overflow的值不爲visible的元素;
  • 彈性盒 flex boxes (元素的display: flex或inline-flex)

3.BFC內部特性

  • 內部的盒會在垂直方向一個接一個排列(可以看作BFC中有一個的常規流);
  • 處於同一個BFC中的元素相互影響,可能會發生margin collapse;但不同BFC可以阻止margin collapse
  • 每個元素的margin box的左邊,與容器塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此;
  • BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素,反之亦然;
  • 計算BFC的高度時,考慮BFC所包含的所有元素,連浮動元素也參與計算;
  • 浮動盒區域不疊加到BFC上;

4.BFC應用實例

1.BFC清除浮動

將父元素設置一個能讓其變爲BFC區域的屬性,不如overflow:auto

圖片描述
圖片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #one{
            background:green;
            width: 100px;
            height: 50px;
            float: left;
        }
        #two{
            background: red;
            width: 200px;
            height: 50px;
            float: left;
        }
        #box{
            border: 2px solid salmon;
            width: 400px;
            overflow: auto;
        }
    </style>
</head>
<body>
<div id="box">
    <div id="one">one</div>
    <div id="two">two</div>
</div>

</body>
</html>

2.BFC處理margin

圖片描述圖片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        p{
            padding: 0;
            margin: 20px 0 20px 0;
            height: 20px;
            background-color: burlywood;
            color: #fff;
        }
        div{
            overflow: auto;//前後的區別取決於這句話,加上就能讓父級生成BFC區域包含它們
            width: 250px;
            background-color: #ccc;
        }
    </style>
</head>
<body>
<div>
    <p>aaaaaaaaaaaaaa</p>
    <p>bbbbbbbbbbbbbb</p>
</div>

</body>
</html>

BFC改造後
圖片描述

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