我的z-index怎么“失效”了?

大家有没有遇到这样的问题,给一个元素加上transform或者opacity等效果后,它的子元素的z-index就“失效了”?

这里普及一个概念:stacking context,中文翻译叫做“堆叠上下文”,这里我们简称做“层”。

实际上,真正决定页面上堆叠顺序的并不是z-index,而是层。一个层就是页面上Z轴的一个单位,并且页面的Z轴并不是一维的,而是多维的,每一个层内部还可以包含多个层。
每层用各自的z-index值来比较排序(正值>0>auto(已定位)>auto(未定位)>负值)。 (已定位指position不为static,position为static的元素无法给z-index赋值)

我们来看下面这张图:

这里写图片描述

图中DIV1有A和B两个子元素,DIV2有C和D两个子元素。
最终呈现在页面上的效果如图,堆叠顺序从上到下依次是A,B,C,D。A会显示在最上面。

这就像是栋房子,2楼的小矮子会位于1楼的大高个上面。

什么?你不相信这个结果?那我们就来实验一下。
我们先看例一:

<style> 
    div{position:abosolute; width:100px; height:100px;} 
</style>

<div id="A">
    <div id="B" style="background:green"></div>
</div>
<div id="C" style="background:pink; left:20px; top:50px"></div>

这里写图片描述

A和C的z-index都等于auto(默认值),它们就像是都在楼房的1楼,那应该怎么确定堆叠顺序呢?它们会按照文档的排列顺序来决定堆叠顺序,C在A的文档下面,所以会覆盖A,也会覆盖B。

如果我们给绿色box加上z-index:2 , 结果如例二:

<style> 
    div{position:abosolute; width:100px; height:100px;} 
</style>

<div id="A">
    <div id="B" style="background:green; z-index:2"></div>
</div>
<div id="C" style="background:pink; left:20px; top:50px"></div>

这里写图片描述

B的z-index=2后会在A内部产生新的堆叠上下文,就不能再按照文档顺序来排列了。B会覆盖C。(注意,A内其他z-index=auto的元素依然会被C覆盖)

如果我们给A加上z-index=-1,会如何呢?来看例三:

<style> 
    div{position:abosolute; width:100px; height:100px;} 
</style>

<div id="A" style="z-index:-1">
    <div id="B" style="background:green; z-index:2"></div>
</div>
<div id="C" style="background:pink; left:20px; top:50px"></div>

这里写图片描述

由于z-index=-1,此时的A就像是在负1楼,即使B的z-index=2也会被C覆盖。

说到这里,大家应该明白了怎么判断堆叠顺序了。
有人会问,这些和一开始说的transform和opacity没关系啊?

实际上,transform和opacity等特性,会和z-index一样产生新的堆叠上下文。

MDN上说明了哪些情况会产生新的堆叠上下文:

the root element (HTML),
positioned (absolutely or relatively) with a z-index value other than “auto”,
a flex item with a z-index value other than “auto”,
elements with an opacity value less than 1,
elements with a transform value other than “none”,
elements with a mix-blend-mode value other than “normal”,
elements with isolation set to “isolate”, on mobile WebKit and Chrome 22+, position: fixed always creates a new stacking context, even when z-index is “auto”,
specifing any attribute above in will-change even you don’t write themselves directly

当设置了父级元素的z-index属性后,子元素的z-index是相对于父级元素的index。因此,父级元素的z-index优先于子元素的z-index。这意味着如果父级元素设置了z-index,子元素的z-index设置可能会失效。这种情况通常发生在父元素和子元素都具有定位属性(position: relative或position: absolute)时。在这种情况下,可以尝试将子元素的z-index值设置为负值,以解决z-index失效的问题。 综上所述,当父元素具有定位属性并设置了z-index时,子元素的z-index可能会失效。此时可以尝试将子元素的z-index设置为负值来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [css z-index无效](https://blog.csdn.net/weixin_43478592/article/details/115394398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ie7下z-index失效问题解决方法(详细分析)](https://download.csdn.net/download/weixin_38519082/13982881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值