1.BFC 定義 BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block level box(塊級元素)參與, 它規定了內部的Block level Box如何佈局,並且與這個區域外部毫不相干. 通俗地來說:創建了 BFC的元素就 ...
1.BFC 定義
BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box(塊級元素)參與, 它規定了內部的Block-level Box如何佈局,並且與這個區域外部毫不相干.
通俗地來說:創建了 BFC的元素就是一個獨立的盒子,裡面的子元素不會在佈局上
影響外面的元素(裡面怎麼佈局都不會影響外部),BFC任然屬於文檔中的普通流
2.BFC的生成:
知道了BFC怎麼觸發BFC
滿足以下條件之一都可以觸發BFC,變身為BFC
- 根元素
- float屬性不為none
- position不為static和relative
- overflow不為visible
- display為inline-block, table-cell, table-caption, flex, inline-flex
你會發現BFC無處不在,只是自己用的時候不知道而已
3.BFC佈局規則:
變身為BFC後有什麼特性呢,以下:
- 內部的Box會在垂直方向,一個接一個地放置。
- Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊
- 每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
- BFC的區域不會與float box重疊。
- BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。反之也如此。
- 計算BFC的高度時,浮動元素也參與計算
4.BFC作用:
用起來come boby
1.防止外邊距重疊
bfc導致的屬於同一個bfc中的子元素的margin重疊(Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊)
問題:由圖可以看到,String1和String2 之間只有20px的margin,按理來說應該是40px,但這是在bfc中導致了他們的margin重疊
代碼:
<style>
.container1{
/* 通過overflow:hidden可以創建bfc */
overflow: hidden;
background-color: red;
width: 300px;
}
.sub1{
margin: 20px 0px;
background-color: #dea;
}
</style>
<div class="container1">
<div class="sub1">String1</div>
<div class="sub1">String2</div>
</div>
解決方法:我們可以在div外麵包裹一層容器,並觸發該容器生成一個BFC。那麼兩個div便不屬於同一個BFC,就不會發生margin重疊了。
代碼:
<style>
.newbfc{
overflow: hidden;
}
</style>
<div class="container1">
<div class="sub1">String1</div>
<div class="newbfc"><div class="sub1">String2</div></div>
</div>
2.清除浮動:
問題:當元素的子元素都浮動後,會出現高度坍塌的現象,即父容器的高度不會被撐開
代碼:
<style>
.pre2{
width: 200px;
border: 2px solid red;
}
.float1,.float2{
width: 100px;
height: 100px;
float: left;
}
.float1{
background-color: #dee;
}
.float2{
background-color: #dcc;
}
</style>
<div class="pre2">
<div class="float1"></div>
<div class="float2"></div>
</div>
解決方法:
bfc的規則:計算BFC的高度時,浮動元素也參與計算所以只要將父容器設置為bfc就可以把子元素包含進去:
這個容器將包含浮動的子元素,它的高度將擴展到可以包含它的子元素,在這個BFC,這些元素將會回到頁面的常規文檔流。
.pre2{
width: 200px;
border: 2px solid red;
/* 設置overflow*/
overflow:hidden;
}
3.解決佈局:防止文字環繞
代碼:
<style>
.container2{
overflow: hidden;
width: 200px;
}
.box{
float: left;
width: 100px;
height: 30px;
background-color: #daa;
}
</style>
<div class="container2">
<div class="box"></div>
<p style="background-color: #eea">sdfadsfdff fffffffds fsfffff sfd fsdsdfsdf fffffff</p>
</div>
這個p元素並沒有移動,但是它卻出現在浮動元素的下方。p元素的line boxes(指的是文本行)進行了移位。此處line boxes的水平收縮為浮動元素提供了空間。
bfc的規則:每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
解決這個問題只要將p元素添加overflow:hidden使其成為一個新的bfc就可以了
本篇是個人筆記,可經常看看。向前走,也別忘記要多回顧
你執著的等待,卻不曾離開
Ry(元)