position为fixed时设置z-index失效

作为一个假的前端,在调试一个页面时出现了如下bug:
左侧的菜单固定为fixed时,二级菜单无法设置有效的z-index,导致菜单隐藏在页面元素之下,明明页面元素的z-index是1,但是无论把菜单的z-index设置为多大,都不管用。

查阅了资料,原来谷歌浏览器在设置position:fixed;后会触发元素创建一个新的层叠上下文,并且当成一个整体在父层叠上下文中进行比较。如上面的dom结构,当给b设置了position:fixed;属性后,会触发创建一个新的层叠上下文,它的父层叠上下文变成了a,所以b只能在a的内部进行层叠比较。这也就是大家熟听的“从父原则”。

所以本来所有元素都在root内比较,改为fixed之后只能在父级元素内比较,而父级元素没有设置z-index,所以无法比较。

所以解决方案是给父级元素设置z-index,一般设置为0就可以了。
摘抄两点:

  1. z-index只有在设置了position为relative,absolute,fixed时才会有效。
  2. z-index的“从父原则”。当你发现把z-index设的多大都没用时,看看其父元素是否设置了有效的z-index,当然别忘了先看看自身是否设置了position。

css 定位(fixed > absolute > relative)与层级zIndex 的权限认知

原则1: fixed > absolute > relative
原则2: zIndex 越高越牛逼,不管你是谁无视身份。
原则3: 青出于蓝而胜于蓝,儿子永远比父亲强
原则4: 平台很重要。 就算你是权限最高的fixed或者你的阶段非常高,但如果你依附在relative的怀抱里,你也不能比position盖掉。因为你的平台已经输给了position了。但如果relative的zindex比position高。根据原则3,你就会成为最强王者。

竹杖芒鞋轻胜马,也无风雨也无晴。

添加评论

发表评论 | 暂无评论

该文章已经关闭评论

  • 一起走过的日子 - 刘德华
  • 情书 - 张学友
  • 后会无期 - G.E.M.邓紫棋
  • 清白之年 (Live) - 朴树
  • My Love (Radio Edit) - Westlife