当前位置: 首页 > Web前端 > CSS

z-index和stackingcontext

时间:2023-03-30 22:19:23 CSS

z-index和stackingcontext动机最近在一个项目中同时使用z-index和opacity遇到了一些问题。z-index值设置的很大,但是不起作用。找了一些资料,重新整理了一下z-index的重叠规则。z-indexMDN中对z-index的描述是:用于指定定位元素在文本中的堆叠顺序(即position:relative/absolute/fixed)。根据他们的价值观放置它们,较高的放在最上面。当z-index不是auto时,将生成一个堆叠上下文。让我们通过几个例子来谈谈什么是堆栈上下文。当常规堆叠顺序不使用z-index时,默认z-index:auto,此时>不会生成堆叠上下文(stackingcontext),所有元素都在同一层,与父元素同级.该框不建立新的局部堆叠上下文。当前堆叠上下文中生成框的堆叠级别与其父框相同。此时的堆叠顺序如下(从下到上):根元素(HTML元素)正常流中非定位后代元素的背景和边框(这些元素的顺序以出现顺序为准)在HTML文档中,后一个会覆盖前一个)浮动元素正常流动中定位的后代元素(这些元素的顺序是按照HTML文档中出现的顺序,后一个会覆盖前一个)这是一个例子:#absdiv1{position:absolute;宽度:150px;高度:200px;顶部:10px;右:140px;边框:1px虚线#990000;背景色:#ffdddd;}#normdiv{高度:100px;边框:1px虚线#999966;背景色:#ffffcc;边距:0px10px0px10px;文本对齐:左;}#flodiv1{边距:0px10px0px20px;高度:200px;边框:1px虚线#009900;背景色:#ccffcc;}#flodiv2{边距:0px20px0px10px;浮动:对;宽度:150px;高度:200px;边框:1px虚线#009900;背景色:#ccffcc;}为了说明效果,div以反向堆叠顺序放置
DIV#1
position:绝对;


DIV#2
浮动:左;

DIV#3
浮动:右;


DIV#4
没有定位
没有z-index,html顺序为#1->#2->#3->#4->#5,渲染顺序为#4(正常流中的非定位后代元素)->#2(浮动元素)->#3(浮动元素)->#1(positioneddescendentelementinnormalflow)->#5(positioneddescendentelementinnormalflow)以上是没有z-index时的默认情况,渲染层是第0层。z-index生成层叠上下文改变层叠顺序z-index有几个关键点:只适用于已经定位的元素(即position:relative/absolute/fixed)渲染顺序遵循z-indexsize,从low到high的z-index生效时,会生成一个stackingcontext。可以看到,由于#1、#3、#5设置位置,z-index生效,而#2、#4不生效,z-index:0。以上div都在同一层级.我们来看看在子元素中设置z-index的情况。在#3中添加子元素#6#7,并在#4中设置子元素#8。#3中#6#7的子元素虽然设置了z-index:10,z-index:11,但还是低于#1。这是因为#3的z-index生效,生成了一个stackingcontext,而stackingcontext中元素的z-index只在当前父元素下有效,子stackingcontext被视为parentstackingcontext一个独立的模块,相邻的stackingcontext完全没问题。让我们再来看看#4中的子元素#8。由于#4的position没有设置,所以z-index是无效的,依然是z-index:0,没有生成stackingcontext。而子元素#8z-index生效,它将与#5、#3、#1处于同一级别,在#3之后和#4之前。总结:如果设置了position,z-index不为auto,则会生成一个堆叠上下文,堆叠规则与常规堆叠不同。堆叠上下文中元素的z-index仅在当前父元素下有效。子层叠上下文被视为父层叠上下文中的一个独立模块,相邻的层叠上下文完全无关。这意味着如果一个元素位于最低层,那么无论你的z-index设置多大,它都不会出现在其他层元素之上。我们可以根据以下规则来理解上下文堆叠的级别:#2、#4z-index无效(不生成堆叠上下文),父元素(html)的设置是默认auto,即0、#1、#3、#5z-index生效(生成堆叠上下文),分别为4、3、1。#6和#7的父元素#3为3,所以#6为3.10(z-index生效,生成stackingcontext),#7为3.0(z-index不生效,不生成stackingcontext))#8父元素#2为0,#8z-index生效(生成stackingcontext),为3。生成stackingcontext除了z-index+position的几种情况,[MDN-stacking_context]列出了几种情况生成堆叠上下文。当元素位置是(绝对或相对)且具有z-index值(非自动)时的HTML根文档当元素位置固定或粘性时当元素是flexbox的子元素且具有z-index值(不是auto)当一个元素设置为不透明度(小于1)时,transforms,filters,perspective,clip-path,css-regions,pagedmedia,mask/mask-image/mask-border,mix-blend-mode(不正常)、isolation(取值为isolate)、-webkit-overflow-scrolling(取值为touch)、will-change等属性。以不透明度为例,我们将不透明度:0.5添加到#4。此时#4生成一个堆栈上下文,其子元素#8最终为0.3。在#1、#3、#5之下。参考资料https://developer.mozilla.org...https://developer.mozilla.org...http://www.myexception.cn/HTM...http://blog.csdn.net/u0143463...http://www.w3cplus.com/css/wh...https://www.w3.org/TR/CSS2/zi...