z-index不生效怎么回事,如何排除问题和解决
Admin 2022-09-16 群英技术资讯 262 次浏览
表面看起来,z-index
似乎是一个很简单的属性,你给它设置哪个值,元素就会位于 z
轴的哪个位置。但它实际上并没有我们想象的这么简单,这个属性背后是一系列决定元素所在层级的规则。
在进行今天的介绍前,我们先列出三个问题,如果你能一眼看出它们的解决方案,那么恭喜你掌握了z-index
,也就不需要阅读本文了;如果不行,那么耐心看完本文,相信能找到答案。
z-index
数值更大,但 Content
没有在 Box 2
之上?<div id="box1"> Box 1 </div> <div id="content"> Content <br/> z-index: 2; </div> <div id="box2"> Box 2 <br/> z-index: 1; </div>
div { padding: 25px; font-size: larger; } #box1 { background-color: chocolate; width: 200px; height: 100px; margin-bottom: -50px; } #content { background-color: gold; width: 300px; height: 200px; z-index: 2; } #box2 { background-color: cyan; width: 200px; height: 100px; margin-top: -50px; z-index: 1; }
z-index
数值更小,为什么 Content
这次反而在Box 2
之上了?<div id="box1"> Box 1 </div> <div id="content"> Content <br/> transform: rotate(90deg); <br/> z-index: 1; </div> <div id="box2"> <br/> Box 2 <br/> z-index: 2; </div>
div { padding: 25px; font-size: larger; } #box1 { background-color: chocolate; width: 200px; height: 100px; margin-bottom: -10px; } #content { background-color: gold; width: 250px; height: 200px; z-index: 1; transform: rotate(90deg); } #box2 { background-color: cyan; width: 200px; height: 100px; margin-top: -10px; z-index: 2; }
z-index
是最大的,但Box 2-3
在 Content
之下?<div id="box1"> Box 1 </div> <div id="content"> Content <br/> z-index: 2; <br/> position: relative; </div> <div id="box2"> <br/><br/> Box 2 <br/> z-index: 1; <br/> position: relative; <div id="box2-3"> Box 2-3 <br/> z-index: 5; <br/> position: absolute; </div> </div>
div { padding: 25px; font-size: larger; } #box1 { background-color: chocolate; width: 200px; height: 100px; margin-bottom: -50px; } #content { background-color: gold; width: 200px; height: 100px; margin-left: 50px; z-index: 2; position: relative; } #box2 { background-color: cyan; width: 200px; height: 100px; margin-top: -50px; z-index: 1; position: relative; } #box2-3 { background-color: green; width: 200px; height: 100px; padding-left: 150px; left: 180px; top: -50px; z-index: 5; position: absolute; }
没有使用 z-index
的时候,元素的层叠关系由2个因素决定:
position
是否是static
,如果是static
,那么这个元素就称为 non-positioned
;反之,如果 position
值是 relative
, absolute
, fixed
, 或 sticky
则称 positioned
。positioned
元素享受特权,会覆盖 non-positioned
元素。而 non-positioned
元素中,有 float
样式的元素覆盖没有 float
的。z-index
属性设定了一个定位元素及其后代元素或 flex
项目的 z-order
。当元素之间重叠的时候,z-index
较大的元素会覆盖较小的元素在上层进行显示。
所谓 z-index
,只有在以下场景适用。分别为:
z-index
这个属性并不是在所有的元素上都有效果。它仅仅只在 positioned
元素上有效果。z轴
上的堆叠顺序,并不仅仅是直接比较两个元素的 z-index 值的大小,同时,这个堆叠顺序还由元素的层叠上下文和层叠等级共同决定。z-index
存在的一个背景是 Stacking Context
,中文常译作层叠上下文(其实数据结构中的栈的单词也是 stack,所以层叠上下文中已经蕴含了后来者居上的意思)。
层叠上下文,是HTML中一个三维的概念。在 CSS2.1
规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴
,Y轴
以及表示层叠的Z轴
。
一般情况下,元素在页面上沿 X轴
和 Y轴
平铺,我们是察觉不到它们在Z轴
上的层叠关系。而一旦元素发生堆叠,这时就能发现某个元素可能覆盖了另一个元素或者被另一个元素覆盖。
如果一个元素含有层叠上下文,(也就是说它是层叠上下文元素),我们可以理解为这个元素在Z轴上就“高人一等”,最终表现就是它离屏幕观察者更近。
构建层叠上下文和盖楼比较类似:
首先, <html>
元素是地平线或地基 —— 所有楼都是从地基开始盖的
接下来,每产生一个层叠上下文,相当于盖一座楼, z-index 的值相当于楼的高度
以下几种元素可以产生层叠上下文:
position
值为 absolute
或 relative
, 且 z-index
值不为 auto
(默认值).position
值为 fixed
或 sticky
flexbox
容器的子元素, 且 z-index
值不为 auto
(默认值)grid
容器的子元素, 且 z-index
值不为 auto
(默认值)opacity
值且值小于 1.none
:
transform
filter
perspective
clip-path
mask / mask-image / mask-border
isolation
值且值为 isolate
.mix-blend-mode
值且值不为 normal
.-webkit-overflow-scrolling
值且值为 touch
.第三,层叠上下文是可以嵌套的 —— 这是最容易让人误解的一块。
嵌套,顾名思义就是在一个 层叠上下文
中能创建 另一个层叠上下文
。
假如在地基上盖一座50米高的楼(即 z-index: 50
), 是否可以在楼里再盖一栋 100米高的楼中楼呢?
当然不可能!但是你可以在这座楼里建一座 100
级阶梯高的大堂。
换句话说,在嵌套的层叠上下文中,子层叠上下文被限制在了父层叠上下文中,它们的 z-index
“单位”已经不一样了(z-index
没有单位,这边只是用于理解),无论子层叠上下文的 z-index
值有多大都无法突破父层叠上下文的高度。
层叠上下文小结:
需要注意:层叠上下文嵌套
与 元素嵌套
不是一一对应的关系,一个元素所处的父层叠上下文是由内向外找到的第一个能产生层叠上下文的元素所产生的层叠上下文。
看个例子便于理解:
<div id="div1" style="position: relative; z-index: 1"> <div id="div2" style="position: relative; z-index: 1"> 所处的父层叠上下文是 div1 产生的层叠上下文 </div> <div id="div3"> <div id="div4" style="position: relative; z-index: 2"> 所处的父层叠上下文也是 div1 产生的层叠上下文 </div> </div> </div>
虽然 div4
外面还有层 div3
,但是由于 div3
不能产生层叠上下文,所以 div4
所处的父层叠上下文也是 div1
(产生的层叠上下文) —— 虽然在html
元素层级中 div4
比 div2
更深了一级,但是 div4
与 div2
在层叠上下文层面上是同级的,因此它们可以相互比较 z-index
值来决定谁在上面。
学习完上面的 z-index
相关知识点,我们来回答开头提出的三个问题。
第一个问题中 z-index
不生效的原因在于这三个元素都不能产生层叠上下文,因此z-index
值对它们不生效 —— 根据出场顺序决定了 Content
处在 Box 2
之下。
第二个问题的 Box 2
不能产生层叠上下文,因此z-index
同样是无效的;Content
因为使用了 transform
属性,产生了层叠上下文,相当于盖了一座 1 米高的楼( z-index: 1
)
Box 2
与 Content
在同一级层叠上下文中,且Box 2
的 z-index
比较小, 因此 Box 2
在 Content
之下;且 Box 2-3
在 Box 2
的层叠上下文下新建了个子层叠上下文,因此Box 2-3
的高度被限制在了 Box 2
之内,因此 Box 2-3
的 z-index
再高也没用
关于“z-index不生效怎么回事,如何排除问题和解决”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,群英网络小编每天都会为大家更新不同的知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了纯CSS表头固定的实现代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
css3的focus-within选择器怎样使用?在css中 :focus-within 是一个伪类,但是现在已经被列入到css选择器中,而focus-within选择器其实非常的好用,能非常方便处理获取焦点状态。接下来我们就详细的了解一下focus-within选择器。
这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本文主要介绍的是关于盒模型大小的内容,下文有详细的介绍与盒模型大小相关的值以及盒模型大小的计算,对新手学习盒模型的内容有一定的帮,需要的朋友可以了解看看,接下来我们就一起来学习一下吧。
当我们要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,那么就需要使用到css选择器。而css组合选择器就是组合去使用基础选择器。css组合选择器对很多新手来说都是比较难懂的,这篇文章就给大家介绍一下css组合选择器怎么用,希望对大家学习有帮助。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008