什么是层叠上下文
层叠上下文,是HTML
中的一个三维概念,当一个元素中包含有多个元素,且这些元素都在同一个坐标位置上,这就称之为层叠上下文。
什么是层叠等级
也称层叠级别、层叠水平
指的是同一个层叠上下文中,当前层叠元素在Z轴的上下顺序,而在普通元素上,描述普通元素在Z轴上的上下顺序
这里要解释下,为什么要区别普通元素的层叠上下文中的元素,因为普通元素的层叠等级优先级由层叠上下文决定,因此,层叠登记的比较只有在当前层叠上下文元素中才有意义
::: warn
需要注意的是,需要把层叠登记和CSS
的z-index
混乱了,z-index
是可以影响层叠水平,前提是元素必须是定位元素/flex
子元素,而层叠等级是只有元素都存在的
:::
什么是层叠顺序
当元素发生层叠时,层叠顺序会遵循图中的顺序显示。
需要注意的是 inline/inline-block
元素的层叠顺序是要高于block
和float
元素的 z-index
属性是auto/0
时,它们是在同一个层级的,此时就遵循先来后到准则
inline元素比block和float元素要高是有原因的,通常inline元素(p标签,span标签这些都是inline元素)都是用来渲染文字内容的,而文字是一个页面中最重要的内容之一,当发生层叠关系时,文字当然要在前面让用户优先看到。
层叠准则
层叠领域的覆盖关系主要遵循以下两条
z-index
较大的一方覆盖小的- 层叠水平和顺序一致时,在
DOM
中处于后面的元素会覆盖前面的元素
产生层叠上下文
在产生层叠上下文的前提需要一些特定的CSS
属性创建,一般有3
种方法
HTML
元素是根层叠上下文- 普通元素需要设置非
static
值并且设定z-index
数值才能产生层叠上下文 - 使用
Css3
中的新属性也可以产生层叠上下文
例如下面这个例子,通过元素的先后顺序,产生了元素层叠上下文
html
<div>
<div class="a">a</div>
<div class="b">b</div>
</div>
<div>
<div class="c">c</div>
</div>
css
div>div{
width:100px;
height:100px;
}
.a{
background:red;
position:absolute;
left:10px;
top:10px;
}
.b{
background:pink;
position:absolute;
left:70px;
top:70px;
}
.c{
background:blue;
position:absolute;
left:130px;
top:130px;
}
preview
在修改一下,把b
元素的的zIndex
属性修改下比其他元素要高。
css
.b{
background:pink;
position:absolute;
left:70px;
top:70px;
z-index:100;
}
可以看到,zIndex
属性影响到了其他层叠上下文元素。
Css3属性对层叠上下文影响
在CSS3
中,出现了很多新属性,有一部分属性对于层叠上下文也会产生影响,例如下面这些
- 父级元素的
display
为flex
或者inline-flex
,子元素设置了z-index
时,子元素产生层叠上下文(grid
也是) - opacity属性小于1
mix-blend-mode
属性值不为normal
的元素- 不为
none
的元素transform
filter
backdrop-filter
perspective
clip-path
mask / mask-image / mask-border
isolation
属性为isolation
的元素- 设置了
will-change
属性