html z-index置顶,CSS z-index 层级关系优先级的概念-程序员宅基地

技术标签: html z-index置顶  

CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有更高堆叠顺序的节点将显示在堆叠顺序较低的节点前面, 这是我们对 z-index 属性普遍的认识. 与此同时, 我们总是对堆叠顺序捉摸不透, 将 z-index 的值设得很大也未必能将节点显示在最前面. 本文将通过一些例子对 z-index 的使用方法进行分析, 并且为各位带入 z-index 层级树的概念.

目录

顺序规则

如果不对节点设定 position 属性, 位于文档流后面的节点会遮盖前面的节点.

复制代码代码如下:

A
B

5d955de6453863df03c7352e73ddfb7f.gif

CSS z-index 属性顺序规则的例子

定位规则

如果将 position 设为 static, 位于文档流后面的节点依然会遮盖前面的节点浮动, 所以 position:static 不会影响节点的遮盖关系.

复制代码代码如下:

A
B

5d955de6453863df03c7352e73ddfb7f.gif

CSS z-index 属性定位规则的例子, static

如果将 position 设为 relative (相对定位), absolute (绝对定位) 或者 fixed (固定定位), 这样的节点会覆盖没有设置 position 属性或者属性值为 static 的节点, 说明前者比后者的默认层级高.

复制代码代码如下:

A
B

83b86842705640add4ac409af61ea84b.gif

CSS z-index 属性定位规则的例子, relative | absolute | fixed

在没有 z-index 属性干扰的情况下, 根据这顺序规则和定位规则, 我们可以做出更加复杂的结构. 这里我们对 A 和 B 都不设定 position, 但对 A 的子节点 A-1 设定 position:relative. 根据顺序规则, B 会覆盖 A, 又根据定位规则 A' 会覆盖 B.

复制代码代码如下:

A-1
B

7760ce50171a5df504be9328916a95a2.gif

CSS z-index 属性互相覆盖的例子

上面互相覆盖在什么时候用到这样的实现? 看起来偏门, 其实很常用, 比如说, 电子商务网站侧栏的类目展示列表就可以用这个技巧来实现.

下图是某网站的类目展示区域, 二级类目的悬浮层覆盖一级类目列表外框, 而一级类目的节点覆盖二级类目的悬浮层. 如果使用 CSS 实现展示效果, 一级类目的外框相当于上面例子中的 A, 一级类目的节点相当于 A-1, 二级类目的悬浮层相当于 B.

电子商务网站侧栏的类目展示列表

06f6d2a8a55fcd9126817029c5ded103.png

参与规则

我们尝试不用 position 属性, 但为节点加上 z-index 属性. 发现 z-index 对节点没起作用.

复制代码代码如下:

A
B
C

24774dfeeeab11bef1147693818e4c47.gif

CSS z-index 属性参与规则的例子, 没有明确定位的时候

W3C 对 z-index 属性的描述中提到 在 z-index 属性仅在节点的 position 属性为 relative, absolute 或者 fixed 时生效.

The z-index property specifies the stack order of an element. Only works on positioned elements(position: absolute;, position: relative; or position: fixed;).

复制代码代码如下:

A
B
C

df17775ff10fe77a2f0812643bcc8906.gif

CSS z-index 属性参与规则的例子, 明确定位的节点才能使用 z-index 属性

默认值规则

如果所有节点都定义了 position:relative. z-index 为 0 的节点与没有定义 z-index 在同一层级内没有高低之分; 但 z-index 大于等于 1 的节点会遮盖没有定义 z-index 的节点; z-index 的值为负数的节点将被没有定义 z-index 的节点覆盖.

复制代码代码如下:

A
B
C
D

859720414b1740c1c36a2d5646fbdd1a.gif

CSS z-index 属性默认值规则的例子

通过检查我们还发现, 当 position 设为 relative, absolute 或者 fixed, 而没有设置 z-index 时, IE8 以上和 W3C 浏览器 (下文我们统称为 W3C 浏览器) 的 z-index 默认值是 auto, 但 IE6 和 IE7 是 0.

从父规则

如果 A, B 节点都定义了 position:relative, A 节点的 z-index 比 B 节点大, 那么 A 的子节点必定覆盖在 B 的子节点前面.

复制代码代码如下:

A-1
B-1

96e1bf851151afd7139e7339de058dce.gif

CSS z-index 属性从父规则的例子, 子节点不设定层级

如果所有节点都定义了 position:relative, A 节点的 z-index 和 B 节点一样大, 但因为顺序规则, B 节点覆盖在 A 节点前面. 就算 A 的子节点 z-index 值比 B 的子节点大, B 的子节点还是会覆盖在 A 的子节点前面.

复制代码代码如下:

A-1
B-1

eb831fb7e6e2d8c9cccf6508107cc657.gif

CSS z-index 属性从父规则的例子, 不可逾越的层级

很多人将 z-index 设得很大, 9999 什么的都出来了, 如果不考虑父节点的影响, 设得再大也没用, 那是无法逾越的层级.

层级树规则

可能你会觉得在 DOM 结构中的兄弟节点会拎出来进行比较并确定层级, 其实不然.

复制代码代码如下:

A-1
B-1

96e1bf851151afd7139e7339de058dce.gif

CSS z-index 属性层级树规则的例子

我们认为同时将 position 设为 relative, absolute 或者 fixed, 并且 z-index 经过整数赋值的节点, 会被放置到一个与 DOM 不一样的层级树里面, 并且在层级树中通过对比 z-index 决定显示的层级. 上面的例子如果用层级树来表示的话, 应该如下图所示.

803c3cf0af78b014affb2f8c2ffa8dce.gif

CSS z-index 的层级树

图中虽然 A-1 (z-index:0) 的值比 B-1 (z-index:1) 小, 但因为在层级树里 A (z-index:2) 和 B-1 在一个层级, 而 A 的值比 B-1 大, 根据从父规则, A-1 显示在 B-1 前面.

参与规则 2

前面提到的参与规则认为只要节点的 position 属性为 relative, absolute 或者 fixed, 即可参与层级比较, 其实不准确. 如果所有节点都定义了 position:relative, 并且将 z-index 设为整数值, 根据从父规则, 父节点的层级决定了子节点所在层级.

复制代码代码如下:

A-1
B-1-1
C-1-1-1

例子中 A, B-1, C-1-1 作为父节点, z-index 的值相同, 根据顺序规则, C-1-1 在 B-1 之前, B-1 在 A 之前; 又根据从父规则, 无论子节点的 z-index 值是什么, C-1-1-1 在 B-1-1 之前, B-1-1 在 A-1 之前.

cc470a44ee686d9a1dadd13b031ce1d1.gif

CSS z-index 属性参与规则 2 的例子, 所有节点参与层级比较

如果我们将所有父节点的 z-index 属性去除, 诡异的事情发生了. IE6 和 IE7 浏览器显示效果不变, 而 W3C 浏览器的子节点不再从父, 而是根据自身的 z-index 确定层级.

复制代码代码如下:

A-1
B-1-1
C-1-1-1

根据默认值规则, IE6 / IE7 和 W3C 浏览器上的元素存在 z-index 默认值的区别. 我们相信, 仅当 position 设为 relative, absolute 或者 fixed, 并且 z-index 赋整数值时, 节点被放置到层级树; 而 z-index 为默认值时, 只在 document 兄弟节点间比较层级. 在 W3C 浏览器中, A, B-1 和 C-1-1 的 z-index 均为 auto, 不参与层级比较.

84b92daaccd631a71ad731bb4000bf32.gif

CSS z-index 属性参与规则 2 的例子, z-index 为 auto 的节点不参与层级比较

而在 IE6 和 IE7 中, 因为 z-index 的默认值是 0, 所以也参与了层级比较.

6251ef2fd8640af391d46ea2955f6dc1.gif

CSS z-index 属性参与规则 2 的例子, IE6 和 IE7 中 z-index 默认为 0

设置了 position 而没有 z-index 的节点虽然不参与层级树的比较, 但还会在 DOM 中与兄弟节点进行层级比较.

复制代码代码如下:

A-1
B-1-1
C-1-1-1

我们对上个例子改造一下, 将 B-1 的 position 属性删除后, W3C 浏览器显示如下图. 根据定位规则, A 和 C-1-1 会显示在 B-1 的前面; 而根据顺序规则, C-1-1 又显示在 A 前面.

0b9020d228c073f98a122f27dfc8e1e4.gif

CSS z-index 属性参与规则 2 的例子, position 为 auto 的节点不参与层级树比较, 但仍参与 DOM 兄弟节点间的层级比较, W3C 浏览器

在 IE6 和 IE7 中, 因为 A 和 C-1-1 设置了 position:relative, 而且 z-index 的默认值为 0, 所以也参与层级树比较, 所以有如下效果.

7d7a67d4f19b3323dd7510f14c3fbf74.gif

CSS z-index 属性参与规则 2 的例子, position 为 auto 的节点不参与层级树比较, 但仍参与 DOM 兄弟节点间的层级比较, IE6 和 IE7

总结

浏览器节点显示层级是一个费力的活, 今天你觉得 A 区块会永远置顶, 但明天因为需求变动, 突然出现 B 元素需要置顶. 一层一层往上堆砌, 某天回头一看, 发现很多区块交错在一起, 而且他们的值一个比一个大, 根本搞不清头绪. 我觉得在操刀干活之前, 最好先将 position, z-index 和层级的关系搞搞清楚, 以免后患无穷.

另外, 非情非得已, 切勿用 JavaScript 计算 z-index, 并将某个节点的 z-index 设置成所有节点中层级最高.

因为篇幅太长, 本文仅从节点属性角度进行讨论, 没有涉及 select 和 iframe 等特殊页面节点考虑, 如果有机会下次再为大家分享.

以上就是CSS z-index 层级关系优先级的概念全部内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35453718/article/details/117797111

智能推荐

【22】数据可视化:基于 Echarts + Python 动态实时大屏范例- MySQL数据源_python mysql echarts 源代码-程序员宅基地

文章浏览阅读3.8k次,点赞7次,收藏77次。写在前面,最近收到了很多小伙伴们的建议,大屏的数据源是否可以展示更丰富的种类,比如Excel,数据库等,那就更加贴近小伙伴们的实际工作场景,可以很快在工作中应用,所以应小伙伴需求,就诞生了这篇【基于 Echarts + Python 动态实时大屏范例(DataBase数据源)- 可视大屏案例】。另外,很多实际展示场景下需要自动播放效果,本案例也展示了Events和DispatchAction触发的饼图和地图高亮效果,非常实用。之前小伙伴们建.._python mysql echarts 源代码

递归算法(图文详解)-程序员宅基地

文章浏览阅读10w+次,点赞229次,收藏1.1k次。递归算法说简单点即就是自身程序的调用,若你掌握递归相应逻辑,递归之时你便可以起飞!!!_递归算法

一觉醒来2T硬盘数据化为乌有,背后或是两名黑客在竞争式入侵-程序员宅基地

文章浏览阅读1.3w次,点赞153次,收藏125次。博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI一觉醒来,几个T的硬盘数据化为乌有。不说暗无天日吧,也至少是惨绝人寰了。毫不夸张的说,上周四的6月24日,西部数据硬盘的My Boo...

html中页面超出浏览器滚动条,html页面内容超出后显示水平滚动条的问题_html/css_WEB-ITnose...-程序员宅基地

文章浏览阅读1.5k次。这个问题已经遇到好几次,解决起来也熟练了很多。出现这种问题一般都是html或页面中的某一内部元素宽度超了。下面总结我遇到的几种情况:1、某一内部元素width设为100%,然而它还有border的宽度,border的宽度不包含在width中,所以结果超了。2、span行内元素,由于它是行内元素,不设display:block之类,宽度设定对它没用,当初弄的时候没有意识到这个问题,结果在谷歌浏览器没..._html页面設置超出100%出現滾動條

【EXCEL绘制地图】获取地图图标信息时遇到问题。请确保处于联机状态,然后重试_获取地图图表信息时遇到问题,请确保处于联机状态-程序员宅基地

文章浏览阅读3.3k次。【EXCEL绘制地图】获取地图图标信息时遇到问题。请确保处于联机状态,然后重试问题说明:如题,在绘制全球数据地图时报错,但是中国地图不会报错。解决方案:将excel上的office账户退出即可参考网站:为什么我的3D地图无法使用..._获取地图图表信息时遇到问题,请确保处于联机状态

hdu5391威尔逊定理-程序员宅基地

文章浏览阅读1.5k次。威尔逊定理在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件。即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大。hdu5391用到了这一数论定理。Zball in Tina TownTime Limit: 3000/1500 MS (Java/Others) Me_hdu5391

随便推点

开发常用网站_网页开发常用的一些图片网站-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏20次。图床 - 引用ur图片api - 调用接口和生产借口文档说明MDN - 学习前端chrome插件Octotree - github展示树Allow-Control-Allow-Origin - 跨域_网页开发常用的一些图片网站

飞桨深度学习笔记(二)-程序员宅基地

文章浏览阅读668次。文章目录第一章零基础入门深度学习(下)加载库数据处理模型设计训练配置训练过程保存模型测试模型完整代码今天是学习这门课程的第二天,学习内容是利用飞桨的深度学习平台来进行波士顿房价的预测,至于为什么要用飞桨这个平台,以下是官方回答,我也是刚接触,之前用的都是pytorch,现在一起学习呗,再次附上脑图链接:打卡学习笔记第一章零基础入门深度学习(下)加载库#加载飞桨、Numpy和相关类库import paddleimport paddle.fluid as fluidimport paddle.f

vc6 运行库的bug---C++程序稳定运行一段时间后异常中止__heap_alloc_dbg-程序员宅基地

文章浏览阅读1.5k次。转自:http://blog.csdn.net/Miracle08/article/details/1457060 最近发现Visual C++ 6.0有一个有趣的,能让programmer发疯的bug。Debug版本编译出来的程序可能最终会异常中止,也许是报告程序停在断点xxxxxxx。更确切地说是用debug 版本的运行时库编译的程序。 由于项目需要写了一个求最短路径的引__heap_alloc_dbg

Python 玩出花儿了!一文教你用 Python 制作吃豆人游戏! | 附代码-程序员宅基地

文章浏览阅读7.1k次,点赞19次,收藏70次。作者 | 李秋键责编 | Carol封图 | CSDN 下载自视觉中国近几年来Python语言得到了快速发展,而Pygame作为Python开发应用和游戏必备的库更是展现了Python的..._python吃豆人实验原理

tgp英雄联盟无法连接服务器未响应,lol点开始游戏没反应怎么办 完整解决办法一览...-程序员宅基地

文章浏览阅读2.6k次。相信不少玩家都在游戏中会碰到登陆游戏了之后不能点PLAY,不能点商城,不能点个人资料,反正什么都点不了的问题,今天小编就给大家来解答下要怎么解决吧。LOL点了PLAY没反映要怎么解决?很多人都有出现这个问题,在进游戏之前,应该就是在输入账号密码那里吧,要不就是选择服务器哪里,有一个选项,把QT勾选上,就可以了。以上就是特玩小编为大家带来的关于lol点了play反映的解决办法了,希望对你有帮助。相信..._tgp不能用

HDFS体系结构(各种进程状态)_hdfs中包含哪些守护进程-程序员宅基地

文章浏览阅读851次。HDFS体系结构(各种进程状态)NameNode【名称节点】开启方式(关闭方式):hdfs namenode(关闭Terminal)hadoop-daemon.sh start namenode(hadoop-daemon.sh stop namenode或杀死进程)start-dfs.sh(stop-dfs.sh或杀死进程)namenode默认大小..._hdfs中包含哪些守护进程

推荐文章

热门文章

相关标签