CSS中z-index用来做什么,怎么应用呢
Admin 2022-11-19 群英技术资讯 330 次浏览
首先,我们得知道z-index主要用来控制层叠级别的,是针对网页显示中的一个特殊属性。
z-index语法和应用
z-index 接受的属性值为:关键字auto和整数,整数可以是负值(Firefox2.0及之前不支持负值)。
需要注意的是 z-index 虽然很给力,却只能应用于定位元素(即设置了 position 属性为非 static 值),其它情况下,z-index 将被忽略。
对于定位元素而言,z-index 意味着:
确定该元素在当前层叠上下文中的层叠级别。
确定该元素是否创建了一个新的局部层叠上下文。
创建层叠上下文
在规范中说明:当某个元素的 z-index 未显式定义或者被指定为 auto 时,该元素不会产生新的局部层叠上下文。也就是说它可以和兄弟,祖先,后辈元素处在同一个堆叠上下文中,它们被放在一起比较层叠级别,儿子可以盖住祖先,父亲也可以盖住儿子,儿子甚至可以越过祖先,盖住祖先的兄弟,在层叠上下文中,它们是并级的关系。来看这样一个例子 DEMO1: z-index与创建层叠上下文
值得高兴的是,大部分浏览器都实现了这个特性;不过在IE6/7下,不论 z-index 值是否被显式定义,都将产生新的局部层叠上下文,也就是说子元素不可以越过是定位元素的父亲,子元素都处在新创建的局部层叠上下文中,只能在内部进行层叠级别的比较。
深入浅出
某区域内有个浮层提示或者下拉菜单,于是可能需要遮住该区域之下的区域。
HTML
CSS
如上HTML/CSS代码,很显然,浮层 tips 将可以覆盖在其父级元素 a 的兄弟元素 b 之上。
于是你的意图得到实现,效果如下图:
不过很显然,你依然无法准确的判断出在各浏览器下,tips 能盖住 b 是因为其父级的定位还是本身的定位。
但是我们可以做这样一个测试,我们让 b 也拥有定位,Code如下:
CSS
这段代码run完之后,就比较纠结了,你能得到的效果将会如下:
首先,我们来解读一下这个例子:因为 a 和 b 都是 relative 且没有定义 z-index (等同于z-index:auto),根据后来居上的原则,此时 b 的层叠级别是要高于 a 的,意思就是说 a 是无法遮住 b 的。不过从 DEMO3 中,我们看到 a 的子元素 tips 遮住了 b,这就表示 tips 能越过它,所以可以判断出 a 没有创建新的局部层叠上下文。很明显,这是完全吻合标准对此的定义。
不过这是在非IE6/7之下结果。在IE6/7下,我们看到 tips 并没能遮住 b,也就是说 tips 无法越过父级,因为 a 创建了新的局部层叠上下文,而 a 的层叠级别又比 b 低,所以 tips 无法遮住 b,这也就是在IE6/7下常出现覆盖Bug的根源。
能得出以下结论:
当定位元素没有显式定义z-index值时,不会创建新的局部层叠上下文
子元素有可能和祖先的兄弟或者祖先兄弟的子元素处在同一个层叠上下文中
在实际工作中,有些情况可能是你没注意或者已然存在的。比如你事先可能并不知道 b 也是定位元素,或者由于某些原因,你需要将其设置为定位元素,于是可能出现各种兼容问题。如果你不了解 z-index 是如何创建局部层叠上下文,且又没注意到IE6/7的实现错误,那么处理起这样的问题将会让你深陷泥潭。
所以在实际的场景中,如果是为了相互覆盖而设置为定位,那么显式的定义 z-index 值,将可避免出现创建新局部层叠上下文差异。
如果需要越过祖先和其它区块内部元素进行相互层叠,那么考虑IE6/7的情况,也应该尽量避免给父级元素进定位。
opacity与层叠上下文
我们知道 opacity 属性是用来设置元素不透明度的。但可能知道 opacity 和层叠上下文有关的不多,不过没关系,这里我们简单聊聊这个话题,有两点必须注意:
当opacity值小于1时,该元素会创建新的局部层叠上下文,也就是说它可以和定位元素进行层叠层别比较
当opacity值小于1时,该元素拥有层叠级别且相当于z-index:0或auto,但不能定义 z-index ,除非本身是定位元素
简单来说,当一个普通的元素定义了 opacity 的值小于1时(比如 opacity:.5),那么该元素的层叠级别将会高于普通元素,其效果类同于定位元素没有显式定义 z-index 的情况,唯一的区别是没有显式定义 z-index 的定位元素不会产生局部层叠上下文,而定义了 opacity 值小于1的元素会产生新的局部层叠上下文。
opacity猜想
假定我们有 a, b, c 三个元素,它们相互层层覆盖在一起,如果这时将 a 元素定义为 opacity:.8,你知道结果会怎样吗?
HTML
CSS
如果你看明白了我对于 opacity 与层叠上下文的描述,相信你可以猜到结果,是的,a 元素将会覆盖 b 和 c 元素,虽然它在HTML文档中出现在 b 和 c 之前,且不是定位元素。
必须看看具体的示例不是么?DEMO4: opacity与局部层叠上下文猜想。
如果我们将 b 和 c 设置为定位元素,又将会如何呢?
CSS
不急,我们可以接着看示例 DEMO5: opacity与局部层叠上下文猜想2。
当一个普通元素定义了 opacity 为小于1的值时,该元素将像定位元素一样拥有层叠级别,可以覆盖普通元素,并且其层叠级别与未显式定义 z-index 的定位元素一样。
opacity创建局部层叠上下文
与未显式定义 z-index 的定位元素唯一不同的是 opacity 值小于1的元素会创建局部层叠上下文。
创建局部层叠上下文意味着什么,前文我们已经详述过。所以不再赘述,这里只给一个示例用以验证该特性。先奉上代码:
HTML
CSS
你会发现虽然 a 的子元素 d 将 z-index 定义为99,但 d 仍然无法遮住 b 和 c 元素,这是因为 a 创建了新的局部层叠上下文,d 元素无法超越父级。
需要注意的是,此时就算 a 元素变成了定位元素,也不能改变其会创建新局部层叠上下文的命运,因为他设置了 opacity:.8。
按照我们前文所说,如果 a 没有定义 opacity:.8 ,但却像 b 和 c 元素一样设置了 relative,那么其子元素 d 将可以覆盖 b 和 c,至于这个例子就不再奉上了,大家随便写个测试一下即可。
到此,关于“CSS中z-index用来做什么,怎么应用呢”的学习就结束了,希望能够解决大家的疑惑,另外大家动手实践也很重要,对大家加深理解和学习很有帮助。如果想要学习更多的相关知识,欢迎关注群英网络,小编每天都会给大家分享实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在css中,可以利用border-image属性和linear-gradient()函数来将图片边框的颜色设置为渐变色。border-image属性用于设置图片边框 linear-gradient()函数用于实现线性渐变实
这篇文章主要介绍了HTML5自定义属性的问题分析,需要的朋友可以参考下
css同一行字体改变不同颜色的方法1、新建一个html文件,命名为test.html,用于讲解如何用css将div中的一行字设置成两种颜色。使用div标签创建一行文字,并设置其class为test,主要
flex-shrink指的是当flex容器空间不足时候,单个元素的收缩比例。不支持负值,默认值是1,也就是默认所有的flex子项都会收缩。如果设置为0,则表示不收缩,保持原始的宽度。
这篇文章主要介绍了CSS 清除浮动、BFC的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008