问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

聊聊css的z-index层级失效问题

发布网友 发布时间:2024-09-29 11:10

我来回答

1个回答

热心网友 时间:2024-10-25 23:49

背景

作为一名初级前端、资深bug制造师、入门级bug修复师,今天又在公司的项目里发现了一个bug,打算解决了再记录下来的。

可这不巧了,刚好解决了。

css世界真奇妙啊。

先说说业务场景;

是用uni-app开发的一个app兼容H5,我新进公司,正在学习公司项目。

刚好看到一个bug,下拉刷新是自开发,没用uniapp的,项目中有一个引导界面。

但是在用鼠标滚动的时候,会出现引导层的z-index失效,怎么调整都没用。

于是开是探寻之路。

找到原因

当时在看到这个bug的时候,我用力的观察着,想找到问题出现的时机。

终于,在多次尝试之后,确认问题是在滚动回顶部的时候出现的。

那么肯定是监听了滚动时间,并且在滚动回顶部的时候,做了什么操作,才导致的问题出现。

于是,顺着代码,找到了下拉刷新的组件,终于理清了问题的来龙去脉。

还原场景<body><divclass="wrap"><divclass="guide"></div></div><divclass="mask"></div></body><style>body{margin:0;padding:0;}.wrap{position:absolute;left:0;right:0;top:0;bottom:0;background-color:#fff;}.guide{position:absolute;left:0;right:0;top:0;bottom:0;margin:auto;width:100px;height:100px;background-color:red;z-index:99;}.mask{position:absolute;left:0;right:0;top:0;bottom:0;margin:auto;background-color:rgba(33,33,33,.3);}</style>

这里是预期的场景;

这里是还原的,当滚动回顶部导致z-index失效之后的样式。

那么这里到底发生了什么了?

经过一顿搜索之后,代码修改如下:

.wrap{position:absolute;left:0;right:0;top:0;bottom:0;background-color:#fff;transform:translateY(0px);/*新增样式*/}

这里添加的transform。是下拉刷新的功能,要还原到顶部,否则下次下拉会直接偏移到上一次下拉的部分。

下拉刷新部分如下图红框。松开之后需要通过transform:translateY(0px);来还原

问题分析

在css中,z-index是同级比较,通常我们会通过position的非static(默认值),之后设置z-index来调整层级。

而在设置transform之后,会触发元素的StackingContext(堆叠上下文,css的三维概念)。继而重新渲染的元素的层级;

现在,已经定位了问题了,开始解决问题。

解决方法技术性的解决方法

这种解决方法解决不了我的代码问题,但是也是一种思路。所以另写一套代码;

在共通父级设置transform-style:preserve-3d;,之后子元素都将按照三维的概念来渲染。

<body><!--添加一个非body的共通父级--><divclass="father"><divclass="wrap"></div><divclass="guide">guide</div><divclass="mask">遮罩</div></div></body><style>.father{position:absolute;left:0;right:0;top:0;bottom:0;transform-style:preserve-3d;}.guide{transform:translateZ(11px);}.mask{transform:translateZ(10px);}</style>以暴制暴

在我的代码中,guide是wrap是子级,而mask是公用元素,所以需要分开,而wrap设置了transform之后,导致的整个wrap层级都低了下去。所以用这种方式无法解决,于是我做了一个很暴力,很歪门邪路的解法。

首先是uni-app的项目,所以.wrap这一块我是用v-if来渲染的。

<divclass="wrap"v-if="showGuide"id="guideWrap"><divclass="guide"></div></div>

而这时候我就通过判断guideWrap元素是否存在,如果存在的话,就将wrap的transform属性设置为空,取消掉这个属性,让他不触发StackingContext。

总结

css世界太美妙,这里每天都会有各种各样的故事。希望今天的文章能帮到大家吧。

作者:林深鹿

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
vivox9和x9i有什么区别 ...设置原则跟构造要求。构造柱的设置原则跟构造要求是什么_百度... ...的U型钢筋锚环要几道?在哪里可以找到依据啊 ...月末不含税库存金额1065000元,请计算门店库存天数 公蟹吃什么 公蟹吃什么东西 爬行健身操功能和原理 锻炼爬行的好处有哪些呢 爬行健身法有什么优缺点 檀木如何粘合 成田剑先生还为哪些日本动漫配音,有名一点滴。谢谢了,大神帮忙啊 博学谷CSS教程33.CSS第二天导读 荔波机场对当地经济发展有何推动作用? 任泽平:新基建就是未来中国新经济的“种子” 涂指甲油的技巧有什么? 补涂指甲油时应该注意哪些细节? 在五笔打字里面,怎样才叫做拆字?举一些例子来? 郎酒哪个系列好喝?郎酒系列酒推荐 10年红花郎2011年是否更换了新包装?原外包上的山水画图案没有了,是一... 沙井中心客运站到深圳大小梅沙的公交路线 我明天想去深圳的大梅沙玩2天.请问我从珠海拱北要怎样去是最方便的? 深圳大梅沙小梅沙游玩攻略,广深旅游攻略 荔枝公园到大梅沙怎么走 棉麻衣服会缩水吗 棉麻布料会不会缩水衣服 大梅沙距离沙头角有多远 ...文字也行,但是描述得详细,用曾经的地名讲,最好有现在地名的辅助_百 ... 平时说的日本“关东”的“关”是指的哪一个关口还是另有它意? 从泰州到芜湖方特怎么走?开车大约要多长时间? 方耳垂的人心理怎么样 南昌学院路轻工业学校宿舍小区周边配套怎么样? 南昌学院路教育学校小区周边配套怎么样? CSS中background新特性 保险里的法定受益人指的是谁 大学生该不该学习? 在现如今的社会,大学生到底该不该自食其力? 大学生在校是不是应该以学习为主啊?不该谈恋爱吗?那样是否会分散精力... 不建议2岁以下儿童看各种屏幕 小孩长时间玩手机会带来什么危害呢 百子 山药 排骨能在一起煲汤吗? 手臂上有一个烟嘴大小的烟疤能进富士康么? 用什么能用韩语在QQ来聊天 流行韩语口语热门话题244个目录 我想问一下韩语的 聊聊?怎么说?是对长辈说的希望用中文把音发出来谢谢... 指甲保养怎么做 百利沙拉酱不是香甜型的吗?怎么会有种刺鼻的酸醋味,闻的我都恶心,以前... 用什么炖排骨好吃?(专家回答)求知道! ...游离FT4 17.84 参考值12-22 促甲状腺素TSH 6.29 参考值0.27-4.2 抗... ...沙拉我想知道是怎么做的!!!饭店里有一种水果沙拉有一点淡黄色... 如何判断沙拉酱坏了 玉米排骨汤的正宗做法【180句精选】 东城区社保中心地址怎么坐车 北京东城社保中心i址