把這兩個放在一篇文章裡是因為這兩個東西都叫上下文,那咱就一鍋炖了_!
BFC - block formatting context
個人了解:獨立容器
形成條件
- 根元素
- display:flex、inline-block、table-cell
- position:absolute、fixed
- float 不為 none
- overflow 不為 visible
特性
先說下個人的了解吧:BFC 其實就是一個密閉的空間,不受其它元素影響,也不會影響其它元素
- BFC 内普通元素是垂直排列的,上下 margin 會發生重疊,與 BFC 的 border 相接觸
- BFC 會計算浮動元素的高度
- BFC 不會與浮動元素發生重疊
- BFC 是獨立容器,不會與外界産生反應
作用
- 如果 margin 發生了重疊,可以利用特性 4,将發生重疊的元素放到不同的 BFC 中即可避免 margin 重疊問題
- 發生了高度塌陷,将父元素變為 BFC 即可
- 利用特性 3 可以實作兩三欄布局
<!-- css -->
<style>
.left {
float: left;
width: 100px;
height: 100%;
background-color: yellow;
}
.right {
float: right;
width: 100px;
height: 100%;
background-color: red;
}
.center {
height: 100%;
background-color: green;
overflow: hidden;
}
</style>
<!-- dom結構 center在最後 -->
<div class="left"></div>
<div class="right"></div>
<div class="center"></div>
可以和三欄常見布局聖杯、雙飛翼、flex作對比,雖然我現在基本都是用 flex
SC - stacking context
個人了解:控制 z 軸上元素的顯示順序
形成條件
- 根元素
- position 不為 static,并且設定了
的元素z-index 為數值
- 一些 css3 中的新屬性
第三點包括:
- z-index 不為 auto 的 flex 項(flex 子元素)
- opacity 不為 1
- transform 不為 none
- filter 不為 none
- -webkit-overflow-scrolling 為 touch 等等
- mix-blend-mode 不為 normal
- isolation 為 isolate
- will-change
層疊等級
其實我也不知道為啥非要整出這麼多概念…決定了
同一個層疊上下文中
元素在 z 軸上的顯示順序。
常見會産生層疊上下文的情況:
- 根元素html
- position不為static, 并且設定z-index
- display為flex,子元素z-index不為auto,子元素為層疊上下文
- opatic不為1
- transform不為none
這裡的重中之中就是同一層疊上下文中比較才有意義
層疊順序

參考
- 深入了解 CSS 中的層疊上下文和層疊順序
- 徹底搞懂 CSS 層疊上下文、層疊等級、層疊順序、z-index