Formatting context 是 W3C CSS2.1 規範中的一個概念。它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。最多見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。Block formatting context直譯爲"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與, 它規定了內部的Block-level Box如何佈局,而且與這個區域外部絕不相干。通俗地講,BFC是一個容器,用於管理塊級元素。git
按照BFC的定義,只有同屬於一個BFC時,兩個元素纔有可能發生垂直margin的重疊,這個包括相鄰元素或者嵌套元素,只要他們之間沒有阻擋(好比邊框、非空內容、padding等)就會發生margin重疊。github
<style>
p{
color: #fff;
background: #888;
width: 200px;
line-height: 100px;
text-align:center;
margin: 100px;
}
</style>
<body>
<p>ABC</p>
<p>abc</p>
</body>
複製代碼
<style>
p{
color: #fff;
background: #888;
width: 200px;
line-height: 100px;
text-align:center;
margin: 100px;
}
.wrap{
overflow:hidden;
}
</style>
<body>
<p>ABC</p>
<div class="wrap">
<p>abc</p>
</div>
</body>
複製代碼
<style>
.box{
width:100px;
height:100px;
background:#ccc;
}
.wrap {
background:yellow;
}
.wrap h1{
background:pink;
margin:40px;
}
</style>
<body>
<div class="box">box</div>
<div class="wrap">
<h1>h1</h1>
</div>
</body>
複製代碼
利用這個特性,咱們能夠創造自適應兩欄佈局。bash
<style>
.box1{
height: 100px;
width: 100px;
float: left;
background: lightblue;
}
.box2{width: 200px;
height: 200px;
background: #eee;
}
</style>
<body>
<div class="box1">我是一個左浮動的元素</div>
<div class="box2">喂喂喂!你們不要生氣嘛,生氣會犯嗔戒的。悟空你也太調皮了,
我跟你說過叫你不要亂扔東西,你怎麼又……你看,我還沒說完你就把棍子給扔掉了!
月光寶盒是寶物,你把它扔掉會污染環境,要是砸到小朋友怎麼辦,就算砸不到小朋友,
砸到花花草草也是不對的。</div>
</body>
複製代碼
咱們都知道浮動會脫離文檔流,接下來咱們看看下面的例子:佈局
<style>
.box1{
width:100px;
height:100px;
float:left;
border: 1px solid #000;
}
.box2{
width:100px;
height:100px;
float:left;
border: 1px solid #000;
}
.box{
background:yellow
}
</style>
<body>
<div class="box">
<div class="box1"></div>
<div class="box2"></div>
</div>
</body>
複製代碼
因爲容器內兩個div元素浮動,脫離了文檔流,父容器內容寬度爲零(即發生高度塌陷),未能將子元素包裹住。解決這個問題,只須要把把父元素變成一個BFC就好了。經常使用的辦法是給父元素設置overflow:hidden。flex