css层叠
层叠上下文
层叠上下文(stacking context),是HTML中一个三维的概念。每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及表示层叠的Z轴。通常在元素发生堆叠时,就能看到某个元素可能覆盖了另一个元素或者被另一个元素覆盖。
层叠上下文可以理解成,在发生堆叠的时候,当前元素和其子元素变成了一个整体,按照当前元素的层级堆叠。
层叠顺序
是指排列规则,如下:
border < z-index负值 < block < float < inline < z-index为0或者auto < z-index正值
即: 层叠上下文元素在子级元素下面, 自己元素根据不同属性来排列,相同属性则是后面的优于前面的。
例子:
<style>
.item{
300px;
padding-top: 10px;
}
.father{
position: relative;
background: rgb(255,255,0);
}
.block{
background: rgb(255, 0, 0);
100px;
height: 120px;
}
.float{
float: left;
background: rgb(0,255,255);
100px;
height: 100px;
margin-left: 50px;
}
.inline{
margin-left: -100px;
background: rgb(0,255,0);
}
.zIndex-1{
position: absolute;
300px;
height: 200px;
background: rgb(255,0,0);
left: 0;
top: 0px;
z-index: -1;
}
.zIndex0{
position: absolute;
200px;
height: 100px;
background: rgb(0,255,0);
left: 0;
top: 100px;
z-index: 0;
}
.zIndexAuto{
position: absolute;
150px;
height: 150px;
background: rgb(255,0,255);
left: 0;
top: 50px;
z-index: auto;
}
.zIndex1{
position: absolute;
100px;
height: 50px;
background: rgb(0,255,255);
left: 0;
top: 150px;
z-index: 1;
}
</style>
<div class="item">
验证: inline > float > block > border
<div class="father">
<span class="inline">inline元素</span>
<div class="float">float元素float元素float</div>
<div class="block">块级元素</div>
</div>
</div>
<div class="item">
验证: 正 > 0 = auto > 负值 (但是 0 和 auto 会有所区别 0会新建层叠上下文)
<div class="father">
<div class="zIndex1">正z-index</div>
<div class="zIndexAuto">z-index:auto</div>
<div class="zIndex0">z-index:0</div>
<div class="zIndex-1">负的z-index</div>
</div>
</div>
展示规则
- 当某一元素是变成层叠上下文之后,其子级元素只会内部相互比较,
- 当某一元素是变成层叠上下文之后,该元素将被作为整体在父级层叠上下文中按顺序进行层叠。
- 层叠上下文可以包含在其他层叠上下文中。
生成层叠上下文条件
- 文档根元素();
- position 值为 absolute(绝对定位)或 relative(相对定位)且 z-index 值不为 auto 的元素;
- position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
- flex (flexbox) 容器的子元素,且 z-index 值不为 auto;
- grid (grid) 容器的子元素,且 z-index 值不为 auto;
- opacity 属性值小于 1 的元素(参见 the specification for opacity);
- mix-blend-mode 属性值不为 normal 的元素;
- 以下任意属性值不为 none 的元素:
- transform
- filter
- perspective
- clip-path
- mask / mask-image / mask-border
- isolation 属性值为 isolate 的元素;
- -webkit-overflow-scrolling 属性值为 touch 的元素;
- will-change 值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素(参考这篇文章);
- contain 属性值为 layout、paint 或包含它们其中之一的合成值(比如 contain: strict、contain: content)的元素。