资讯专栏INFORMATION COLUMN

层叠上下文与z-index

suxier / 1921人阅读

摘要:但是呢,是在的环境上下文中,因为的层级要比要高,所以的哪怕再大,实际上也依然会被给挡住的。无论其值有多小。

z-index是咱们之前相对比较常用的一个语法了,看起来比较简单的样子,实际上还真不难,因为这东西跟之前讲的vertical-align不一样,这个比较符合咱们的认知。

好了,不废话,开始咱们的正式话题。

首先呢?咱们先要了解一下层叠上下文(stack context)是什么呢,其实通俗来讲,就是你看电脑的这个方向的一个显示顺序,比如说,桌子上有一大堆纸,你对着它看的话,每一张纸,实际上你就可以理解为一个层叠上下文中的一个层叠顺序(stack level),你能看到的,往往是最靠前的那几张纸,后面的都被遮挡住了。

那么,首先最简单的一点。如果有有一摞的完全重合的值,你能看到的,往往都是最靠上的那张纸,也就是离你眼睛最近的那一张。然而对于咱们的z-index来说呢,值越大,也就相当于离你眼睛越近。在纸张里的位置越靠上。 所以说,下面的代码,你应该一看就能知道,哪个元素在哪个元素的前面。

.paper1 {
  position: absolute;
  background-color: orange;
  z-index: 2;
  width: 100px;
  height: 100px;
}
.paper2 {
  position: absolute;
  background-color: gray;
  z-index: 5;
  width: 50px;
  height: 50px;
}

下面是结果图,我想聪明如你,一定都猜到了。

那么一个问题又来了,z-index大的,一定会遮盖住z-index小的吗?不废话,直接看下面的代码。

.paper1 {
  position: absolute;
  width: 100px;
  height: 100px;
  background: orange;
  z-index: 3;
}
.paper2 {
  position: absolute;
  width: 200px;
  height: 200px;
  background-color: aqua;
  z-index: 2;
}
.paper3 {
  position: absolute;
  top: 80px;
  width: 50px;
  height: 50px;
  background-color: red;
  z-index: 4;
}

你觉得哪个的层级最高呢?来看一下最终运行的结果把。

竟然不是.paper3在最上面,他似乎被.paper1给挡住了,按理来说,不是z-index越大的,层级越高吗?出现这种情况到底是为什么呢?

实际上,当z-index不为auto的时候,会自动创建一个它自己的层级上下文,也就是说,paper1和paper2是同级的,他们都在根环境上下文上。但是paper3呢,是在paper2的环境上下文中,因为paper1的层级要比paper2要高,所以paper3的z-index哪怕再大,实际上也依然会被paper1给挡住的。

那么,问题又来了,只有z-index不为auto时才会创建环境上下文吗?答案肯定是否定的,实际上,咱们平时用到的不少css属性,也会自动创建环境上下文,下面咱们就看下mdn对这一块所列出来的一些属性(本文更新自2019.3.25,如果看到此文时已经过了好几个月,甚至是一两年,推荐看英mdn页面:https://developer.mozilla.org...)。

层级上下文创建条件:

文档根元素.

position值为absolute或者是relative,并且z-index值不为auto.

position的值为fixed或者是sticky(适用于所有的移动端浏览器,但是老旧的电脑端浏览器并不支持)

flex容器的子元素,其z-index值不为auto;

opacity的值小于1

mix-blend-mode的属性值不为normal

下面属性的值不为none时:

        transform

        filter

         perspective、

        clip-path

         mask / mask-image / mask-border

isolation的值为isolate

-webkit-overflow-scrolling的值为touch时

will-change

contain的值为layout, paint或者是一个包含他们中任意一个的组合值(比如contain: strict, contain:
content)

看了上面的列表,应该会明白为什么我用z-index的时候,都会加position: absolute了吧。

那么,如果z-index值相同时,会怎么显示呢?实际上,他会按照先后顺序,后面的会覆盖前面的。如下面的例子:

.paper1 {
  position: absolute;
  width: 100px;
  height: 100px;
  background: orange;
  z-index: 2;
}
.paper2 {
  position: absolute;
  width: 200px;
  height: 200px;
  background-color: aqua;
  z-index: 2;
}

结果图如下:

那么如果此时吧两个div调换一下位置呢?那么就会如下图所示这样。

黄色的小块已经完全被蓝色的给挡住了。不过如果是下面的代码形式呢?

.paper1 {
  display: inline-block;
  width: 100px;
  height: 100px;
  background: orange;
}
.paper2 {
  position: absolute;
  width: 200px;
  height: 200px;
  background-color: aqua;
  top: 0;
}

此时的话,小黄块将会被遮挡住,无论paper1在paper2的前面和后面,最后的结果都依然是一样的。如下图所示

但是呢,假如给.paper1加入一个transform:scale(1)的话,他就会显示出来,依然会按照先后顺序,后面的先展示。

那么,为什么会这样呢?

首先呢?在一个层叠上下文中,实际上里面不同的元素是有不同的层叠顺序的,实际上下图已经很好的说明了这一点,其从下往上依次为

background/border->负z-index->block块状水平盒子->float浮动元素->inline水平盒子->z-index:auto或者是z-index: 0->正z-index。

这个和咱们平时开发的表现是一致的。但是请注意z-index:auto和z-index: 0;的层级。他实际上是在inline水平元素的上面,因为定位元素,以及上面所列出来的css3的标签,很多都是默认的z-index: auto; 所以上上个例子中,绝对定位的元素,始终会覆盖其inline-block元素。但是呢,其inline-block元素由于新加了transform: scale(1)以后呢,实际上会默认一个z-index: auto; 所以他们俩实际上层级就一致了,因此他们也就是遵循后来居上的一个规则。谁在后面,谁就在靠上的位置。

同理,如果两个元素分别为z-index: 0和z-index: auto; 的话,他们俩也遵循后来居上的规则,他们俩唯一的区别,就是z-index: 0会新建一个层叠上下文,而z-index: auto;则不会;

另外,许多css3属性中,比如说虽然transform默认是z-index: auto,但是其实际上也会新建层叠上下文,所以,这块的话,你自己理解为有上面列出来的css3属性时,默认附带了一个z-index: 0就可以了。

当然了,我再写一个关于负z-index的例子,作为大家的一个小练习。不过我相信有了上面的铺垫后,这个对于大家来说,应该就没有很大的问题了

.paper1 {
  display: inline-block;
  width: 100px;
  height: 100px;
  background: orange;
}
.paper2 {
  position: absolute;
  width: 50px;
  height: 50px;
  background-color: aqua;
  top: 0;
  z-index: -1;
}

此时结果如下图

此时的话呢,由于paper2的z-index为-1,由于paper1和paper2都在一个层叠上下文内(root),因此呢,paper2就自然的在paper1下面。也就如上图所示。

但是如果给.paper1增加了一个tranform: scale(1)呢,情况就会变得不太一样,如下图所示:

实际上就是因为增加了transform: scale(1)以后,实际上在paper1里面新建了一个层叠上下文,所以由于paper2是在paper1的层叠上下文里,所以它自然就显示出来了。无论其z-index值有多小。

好了,上面讲的也差不多了,不过依然是为了方便大家的理解,在最后,我简单的说一下其原理吧。

首先呢,其渲染树是一个深度优先的树结构,然后呢,先渲染的实际上会比后渲染的层级要更高一些,这个就跟咱们用不同的涂料刷墙一样,后刷的颜色总是会覆盖先刷的那些颜色,实际上网站渲染也是类似的。同时呢,在同级的时候,后面的要比前面的层级更高,实际上也是由于其遍历方式决定的,这个我就不多说了。

好了,完事了,谢谢大家观看,有什么问题想探讨的,或者我有什么错误遗漏的地方,都欢迎留言给我,谢谢大家

觉得不错的话,可以关注微信公众号:干活技术,每周都有一篇前端相关原创干货小文章分享

推荐阅读:

https://developers.google.com...

https://www.w3.org/TR/css-pos...

张鑫旭《CSS世界》中z-index一章

本文转载自:http://www.lht.ren/article/21/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/116035.html

相关文章

  • z-index

    摘要:层叠上下文是中的一个三维的概念如果一个元素含有层叠上下文我们就可以理解为这个元素在轴上就高人一等轴表示用户与屏幕之间并不存在的的垂直线通俗点讲就是人眼看屏幕的视线这条垂直于屏幕的线拥有层叠上下文的元素包括页面根元素天生具有层叠上下文称之为根 stacking context 层叠上下文(stacking context)是HTML中的一个三维的概念.如果一个元素含有层叠上下文,我们就可...

    vincent_xyb 评论0 收藏0
  • z-index层叠下文

    摘要:层叠上下文元素的特性层叠上下文的层叠水平要比普通元素高层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的层叠上下文。层叠上下文特性里最后一条规则,每个层叠上下文都是独立的。 z-index基础介绍:三维坐标空间里,x轴通常用来表示水平位置,y轴来表示垂直位置,还有z轴来表示在纸面内外方向上的位置,像下面的图片一样: showImg(https://segmentfault....

    Fundebug 评论0 收藏0
  • 层叠下文【stacking context】层叠顺序【stacking order】

    摘要:层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的层叠上下文。例当按以下设置,则出现红色在绿色之上的效果。如何触发触发一个元素形成层叠上下文有以下方法,摘自根元素值不为的绝对相对定位一个值不为的项目,即父元素。 层叠上下文【stacking context】 对于stacking context,在MDN中的描述是 Stacking context is the three...

    Developer 评论0 收藏0
  • 深入剖析z-index属性

    摘要:声明,部分浏览器需要数字配合指定的属性值为上面任意一个的作用增强页面渲染性能,即准备图形处理器让浏览器加速渲染的什么是图形处理器是与处理和绘制图形相关的硬件。而则是真正的行为触发之前告诉浏览器,提前预约从容不迫突然造访手忙脚乱。一、z-index七阶层叠顺序表 1.层叠顺序的大小比较: background/border < 负z-index < block块状水平盒子 < float浮动盒...

    scq000 评论0 收藏0
  • 你需要了解的z-index世界

    摘要:深入浅出某区域内有个浮层提示或者下拉菜单,于是可能需要遮住该区域之下的区域。很明显,这是完全吻合标准对此的定义。需要注意的是,此时就算元素变成了定位元素,也不能改变其会创建新局部层叠上下文的命运,因为他设置了。 z-index的重要性 在我看来,z-index 给了我们日常工作中以极大的帮助,我们用它来定义元素的层叠级别(stack level)。受益于它,你能做Popup, Dro...

    GT 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<