您的位置: 首页 > 生活常识 >

层叠是指什么意思( CSS 中重要的层叠概念)

100次浏览     发布时间:2024-10-03 10:31:21    

最近在项目的过程中遇到了一个问题,menu-bar希望始终显示在最上面,而在之后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么原因,因此找了一下css有关层叠方面的资料,解决了这个问题,这里记录一下~

屏幕是一个二维平面,然而HTML元素却是排列在三维坐标系中,x为水平位置,y为垂直位置,z为屏幕由内向外方向的位置,我们在看屏幕的时候是沿着z轴方向从外向内的;由此,元素在用户视角就形成了层叠的关系,某个元素可能覆盖了其他元素也可能被其他元素覆盖。


那么这里有几个重要的概念:层叠上下文 (堆叠上下文 Stacking Context)、层叠等级 (层叠水平 Stacking Level)、层叠顺序 (层叠次序、堆叠顺序 Stacking Order)、z-index

声明:

  1. 以下定位元素指的是 position:absolute|fixed|relative|sticky
  2. 以下非定位元素指的是 position:initial|static
  3. 关于层叠上下文还有一个类似的概念:块级格式化上下文(BFC, Block Formatting Context),可以参考一下 CSS 中重要的BFC,其中还介绍了一些文档流的内容
  4. 本文蛮长的,但是如果你有勇气看完,那应该对层叠有关概念就基本掌握了 (~o ̄▽ ̄)~

1. 层叠上下文 (Stacking Context)

层叠上下文 (堆叠上下文, Stacking Context),是HTML中一个三维的概念。在CSS2.1规范中,每个元素的位置是三维的,当元素发生层叠,这时它可能覆盖了其他元素或者被其他元素覆盖;排在z轴越靠上的位置,距离屏幕观察者越近。

文章关于z-index 那些你不知道的事有一个很好的比喻,这里引用一下。

可以想象一张桌子,上面有一堆物品,这张桌子就代表着一个层叠上下文。 如果在第一张桌子旁还有第二张桌子,那第二张桌子就代表着另一个层叠上下文。

现在想象在第一张桌子上有四个小方块,他们都直接放在桌子上。 在这四个小方块之上有一片玻璃,而在玻璃片上有一盘水果。 这些方块、玻璃片、水果盘,各自都代表着层叠上下文中一个不同的层叠层,而这个层叠上下文就是桌子。

每一个网页都有一个默认的层叠上下文。 这个层叠上下文(桌子)的根源就是 <html></html>。 html标签中的一切都被置于这个默认的层叠上下文的一个层叠层上(物品放在桌子上)。

当你给一个定位元素赋予了除 auto 外的 z-index 值时,你就创建了一个新的层叠上下文,其中有着独立于页面上其他层叠上下文和层叠层的层叠层, 这就相当于你把另一张桌子带到了房间里。


层叠上下文1 (Stacking Context 1)是由文档根元素形成的, 层叠上下文2和3 (Stacking Context 2, 3) 都是层叠上下文1 (Stacking Context 1) 上的层叠层。 他们各自也都形成了新的层叠上下文,其中包含着新的层叠层。

在层叠上下文中,其子元素按照上面解释的规则进行层叠。形成层叠上下文的方法有:

  • 根元素 <html></html>
  • position值为 absolute|relative,且 z-index值不为 auto
  • position 值为 fixed|sticky
  • z-index 值不为 auto 的flex元素,即:父元素 display:flex|inline-flex
  • opacity 属性值小于 1 的元素
  • transform 属性值不为 none的元素
  • mix-blend-mode 属性值不为 normal 的元素
  • filter、 perspective、 clip-path、 mask、 mask-image、 mask-border、 motion-path 值不为 none 的元素
  • perspective 值不为 none 的元素
  • isolation 属性被设置为 isolate 的元素
  • will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值
  • -webkit-overflow-scrolling 属性被设置 touch的元素

总结:

  1. 层叠上下文可以包含在其他层叠上下文中,并且一起组建了一个有层级的层叠上下文
  2. 每个层叠上下文完全独立于它的兄弟元素,当处理层叠时只考虑子元素,这里类似于BFC
  3. 每个层叠上下文是自包含的:当元素的内容发生层叠后,整个该元素将会在父级叠上下文中按顺序进行层叠

2. 层叠等级 (Stacking Level)

层叠等级 (层叠水平, Stacking Level) 决定了同一个层叠上下文中元素在z轴上的显示顺序的概念

  • 普通元素的层叠等级优先由其所在的层叠上下文决定
  • 层叠等级的比较只有在同一个层叠上下文元素中才有意义
  • 在同一个层叠上下文中,层叠等级描述定义的是该层叠上下文中的元素在Z轴上的上下顺序

注意,层叠等级并不一定由 z-index 决定,只有定位元素的层叠等级才由 z-index 决定,其他类型元素的层叠等级由层叠顺序、他们在HTML中出现的顺序、他们的父级以上元素的层叠等级一同决定,详细的规则见下面层叠顺序的介绍。

3. z-index

在 CSS 2.1 中,所有的盒模型元素都处于三维坐标系中。 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着"z 轴"层叠摆放, 当他们相互覆盖时, z 轴顺序就变得十分重要。—— CSS 2.1 Section 9.9.1 - Layered presentation

z-index 只适用于定位的元素,对非定位元素无效,它可以被设置为正整数、负整数、0、auto,如果一个定位元素没有设置 z-index,那么默认为auto。

元素的 z-index 值只在同一个层叠上下文中有意义。如果父级层叠上下文的层叠等级低于另一个层叠上下文的,那么它 z-index 设的再高也没用。所以如果你遇到 z-index 值设了很大,但是不起作用的话,就去看看它的父级层叠上下文是否被其他层叠上下文盖住了。

4. 层叠顺序 (Stacking Order)

层叠顺序 (层叠次序, 堆叠顺序, Stacking Order) 描述的是元素在同一个层叠上下文中的顺序规则,从层叠的底部开始,共有七种层叠顺序:

  1. 背景和边框:形成层叠上下文的元素的背景和边框。
  2. 负z-index值:层叠上下文内有着负z-index值的定位子元素,负的越大层叠等级越低;
  3. 块级盒:文档流中块级、非定位子元素;
  4. 浮动盒:非定位浮动元素;
  5. 行内盒:文档流中行内、非定位子元素;
  6. z-index: 0:z-index为0或auto的定位元素, 这些元素形成了新的层叠上下文;
  7. 正z-index值:z-index 为正的定位元素,正的越大层叠等级越高;

同一个层叠顺序的元素按照在HTML里出现的顺序层叠;第7级顺序的元素会显示在之前顺序元素的上方,也就是看起来覆盖了更低级的元素:


5. 实战

5.1 普通情况

三个 relative定位的 div块中各有 absolute的不同颜色的 span.red、 span.green、 span.blue,它们都设置了 position:absolute,参见Codepen - 普通情况。

那么当没有元素包含z-index属性时,这个例子中的元素按照如下顺序层叠(从底到顶顺序):

  1. 根元素的背景和边界
  2. 块级非定位元素按HTML中的出现顺序层叠
  3. 行内非定位元素按HTML中的出现顺序层叠
  4. 定位元素按HTML中的出现顺序层叠

红绿蓝都属于 z-index 为auto的定位元素,因此按照7层层叠顺序规则来说同属于层叠顺序第6级,所以按HTML中的出现顺序层叠: 红->绿->蓝。

5.2 在相同层叠上下文的父元素内的情况

红绿位于一个 div.first-box下,蓝位于 div.second-box下,红绿蓝都设置了 position:absolute, first-box与 second-box都设置了 position:relative,参见Codepen - 父元素不同但都位于根元素下。

这个例子中,红蓝绿元素的父元素 first-box与 second-box都没有生成新的层叠上下文,都属于根层叠上下文中的元素,且都是层叠顺序第6级,所以按HTML中的出现顺序层叠: 红->绿->蓝。

5.3 给子元素增加 z-index

红绿位于一个 div.first-box下,蓝黄位于 div.second-box下,红绿蓝都设置了 position:absolute,如果这时给绿加一个属性 z-index:1,那么此时 .green位于最上面。

如果再在 .second-box下 .green后加一个绝对定位的 span.gold,设置 z-index:-1,那么它将位于红绿蓝的下面,参见Codepen - 设置了z-index。

这个例子中,红蓝绿黄元素的父元素中都没有生成新的层叠上下文,都属于根层叠上下文中的元素:

  1. 红蓝都没有设置 z-index,同属于层叠顺序中的第6级,按HTML中的出现顺序层叠。
  2. 绿设置了正的 z-index,属于第7级。
  3. 黄设置了负的 z-index,属于第2级。

所以这个例子中的从底到高显示的顺序就是: 黄->红->蓝->绿。

5.4 在不同层叠上下文的父元素内的情况

红绿位于一个 div.first-box下,蓝位于 div.second-box下,红绿蓝都设置了 position:absolute,如果 first-box的z-index设置的比 second-box的大,那么此时无论蓝的 z-index 设置的多大 z-index:999,蓝都位于红绿的下面;如果我们只更改红绿的z-index值,由于这两个元素都在父元素 first-box产生的层叠上下文中,此时谁的z-index值大,谁在上面,参见Codepen - 不同层叠上下文的父元素。

这个例子中,红绿蓝都属于设置了z-index的定位元素,不过他们的父元素创建了新的层叠上下文:

  1. 红绿的父元素 first-box是设置了正z-index的定位元素,因此创建了一个层叠上下文,属于层叠顺序中的第7级。
  2. 蓝的父元素 second-box也同样创建了一个层叠上下文,属于层叠顺序中的第6级。
  3. 按照层叠顺序, first-box中所有元素都排在 second-box上。
  4. 红绿都属于层叠上下文 first-box中且设置了不同的正 z-index,都属于层叠顺序中第7级。
  5. 蓝属于层叠上下文 second-box,且设置了一个很大的正 z-index,属于层叠元素中第7级。
  6. 虽然蓝的 z-index 很大,但是因为 second-box的层叠等级比 first-box小,因此位于红绿之下。

所以这个例子中从低到到显示的顺序: 蓝->红->绿(我遇到的的情况就属于这个例子类似情形)。

5.5 给子元素设置 opacity

红绿位于 div.first-box下,蓝位于 div.second-box下,红绿蓝都设置了 position:absolute,绿设置了 z-index:1,那么此时绿位于红蓝的最上面。

如果此时给 first-box设置 opacity:.99,这时无论红绿的 z-index 设置的多大 z-index:999,蓝都位于红绿的上面。

如果再在 .second-box下 .green后加一个 span.gold,设置 z-index:-1,那么它将位于红绿蓝的下面,参见Codepen - opacity的影响。

之前已经介绍了,设置 opacity也可以形成层叠上下文,因此:

  1. first-box设置了 opacity, first-box成为了一个新的层叠上下文。
  2. second-box没有形成新的层叠上下文,因此其中的元素都属于根层叠上下文。
  3. 黄属于层叠顺序中第2级,红绿属于第7级, first-box属于第6级,蓝属于层叠顺序中第6级且按HTML出现顺序位于 first-box之上。

所以这个例子中从低到到显示的顺序: 黄->红->绿->蓝。

网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~

相关文章

胜率飙升至55%!S32赛季的全新打法,“万血流”法师彻底起飞!

今天,我则打算根据最新的数据榜和实战体验,来聊聊中路的出装变化,好让大家冲分更加顺利一些。在此之前,先解答大多数玩家最关心的问题。“破茧之衣到底是不是神装?”(S32赛季的破茧之衣迎来了重做,被动改为了提升Ap和法穿)直接说结论吧,破茧之衣的局限性有点大,并不是适合大部分英雄,截止于7月3日,也仅仅
2024-11-24 12:00:17

热血江湖手游,一个气功流弓手的号,全区第一

热血江湖手游;要论游戏内哪个职业伤害最高那必是医师无疑了;医生受益于长功气功是游戏内伤害最高的职业;之后就是枪客了,但是在三转的时候弓手的伤害可能是最高的,因为弓手的气功对于平A都是有加成的;这个是打了全气功的弓手,两万6的战力;唯一不足的可能就是没有打上气二的金刚石;而这个弓手的攻击力也是高达一千
2024-11-24 11:45:20

王者版本答案肉装云缨

之前的话我都是出纯输出装、我个人感觉出纯输出的缺点。 1容错率低 2容易猝死。肉装的话我出这套血手做出来的话,在团战中不容易猝死,丝血反杀都是常有的事。碰到猴子和兰陵王这样的刺客用二层枪意,直接站撸都没有问题。肉装的云缨可以随便进场开团,吃技能,骗技能。切脆皮更是不在话下。像墨子的大招,云缨的一技能
2024-11-24 11:30:20

起跑要趁早 御龙在天手游如何快速升级?

御龙在天手游开测一周啦,但是为什么排行榜上的那些人升级这么快呢?在御龙在天手游里,如果想要在前期变得比别人更强的话,我们就需要快速升级,那么御龙在天手游如何快速升级?人家都70级了,而我才60多呢?下面就由小白来为大家详细的分析下怎么快速升级吧,大家可别错过了。1.活用传送道具在做任务的时候,很有可
2024-11-24 11:15:14

御龙在天手游10至20级快速升级技巧分享

御龙在天手游10至20级快速升级技巧分享。御龙在天手游传承经典情怀满满,五国阵营四大职业,再现万人国战,争霸三国之巅。御龙在天怎么升级最快?怎样令角色快速变强?是时候看看御龙在天手游10至20级快速升级技巧分享了。玩家跟着左侧的提示做主线任务,在十级后就走到了卧龙城。这时候细心的玩家会在页面右上角看
2024-11-24 11:00:20

《萌江湖》怎么快速获得银两和转生丹 实力至上

很多新手都问过萌江湖中银两和转生丹都怎么获得,怎么赚才快。今天小编为此收集了一些资料带给大家,下面我们就看看是怎么获取吧。萌江湖 1、银两的获得:银两的获得方式有四种分别有商城、比武、江湖和竞技场中获得。在商城中可以使用元宝购买银票就可以直接获得大量的银两。和其他玩家进行比武获胜得到银两,失败则损失
2024-11-24 10:45:17

热门文章

药品监督管理法——法规重点知识

社保卡可以当银行卡用吗?要注意以下几点

收购公司应该注意哪些事项?

电脑突然间没有声音了怎么办?一文教你找出故障

最新文章

韩国烤肉的腌制方法是什么(韩国烤肉的简单做法)

大鲅鱼怎么做好吃家常(五种鲅鱼做法大全)

李白的作品大全(李白10首经典之作)

视频片头制作教程(视频片头,教你制作视频片头)

待摊费用账务处理方法(年终结账科目及账务处理)

重庆江津在哪里(重庆-江津 风景区)

网站内容来自网络,如有侵权请联系我们,立即删除!
Copyright © 蜜柚百科 琼ICP备2023010365号-5