z-index全解析

Z-index属性决定了一个HTML元素的层叠级别。
元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言。
一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶部。这个层叠顺序沿着垂直的线轴被呈现。

在一个HTML页面中,自然的层叠顺序(也就是元素在Z轴上的顺序)是由很多因素决定的:

  • 具有负值的stacking contexts(层叠环境)元素,按照出现的先后顺序排列(越靠后层级越靠上);
  • 没有被定位,没有浮动的块级元素,按照出现的先后顺序排列;
  • 没有被定位,浮动的元素,按照出现的先后顺序排列;
  • 内联元素,按照出现的先后顺序排列排列;
  • 被定位的元素,按照出现的先后顺序排列;
  • Z-index 属性,当被正确使用的时候,会改变自然的层叠顺序。

01.顺序规则

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

<div id="a">A</div>
<div id="b">B</div>

02.定位规则

A:如果将 position 设为 static(positon默认值), 位于文档流后面的节点依然会遮盖前面的节点浮动,
不会影响节点的遮盖关系.

<div id="a" style="position:static;">A<<div>
<div id="b">B</div>

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

<div id="a" style="position:relative;">A</div>
<div id="b">B</div>

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

<div id="a">
<div id="a-1" style="position:relative;">A-1</div>
</div>
<div id="b">B</div>

03.参与规则

在不用 position 属性的情况下, 为节点加上 z-index 属性是不起作用的.

<div id="a" style="z-index:2;">A</div>
<div id="b" style="z-index:1;">B</div>
<div id="c" style="z-index:0;">C</div>

04.默认值规则

*注: 当 position 设为 relative, absolute 或者 fixed, 而没有设置 z-index 时, IE8 以上和 W3C 浏览器的 z-index 默认值是 auto, 但 IE6 和 IE7 是 0.

如果所有节点都定义了 position:relative. z-index 为 0 的节点与没有定义 z-index 在同一层级内没有高低之分;

z-index 大于等于 1 的节点会遮盖没有定义 z-index 的节点;
z-index 的值为负数的节点将被没有定义 z-index
的节点覆盖.

<div id="a" style="position:relative;z-index:1;">A</div>
<div id="b" style="position:relative;z-index:0;">B</div>
<div id="c" style="position:relative;">C</div>
<div id="d" style="position:relative;z-index:0;">D</div>

05.从父规则

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

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

<div id="a" style="position:relative;z-index:1;">
<div id="a-1">A-1</div>
</div>
<div id="b" style="position:relative;z-index:0;">
<div id="b-1">B-1</div>
</div>

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

<div id="a" style="position:relative;z-index:0;">
<div id="a-1" style="position:relative;z-index:2;">A-1</div>
</div>
<div id="b" style="position:relative;z-index:0;">
<div id="b-1" style="position:relative;z-index:1;">B-1</div>
</div>

06.层级树规则

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

<div id="a" style="position:relative;z-index:2;">
<div id="a-1" style="position:relative;z-index:0;">A-1</div>
</div>
<div id="b">
<div id="b-1" style="position:relative;z-index:1;">B-1</div>
</div>

我们认为同时将 position 设为 relative, absolute 或者 fixed, 并且 z-index 经过整数赋值的节点,
会被放置到一个与 DOM 不一样的层级树里面, 并且在层级树中通过对比 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 前面.

07.参与规则二

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

<div id="a" style="position:relative;z-index:0;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div> <div id="b">
<div id="b-1" style="position:relative;z-index:0;">
<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>
</div>
</div> <div id="c" style="position:relative;z-index:0;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>
</div>
</div>
</div>

例子中 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 之前.

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

<div id="a" style="position:relative;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div> <div id="b">
<div id="b-1" style="position:relative;">
<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>
</div>
</div> <div id="c" style="position:relative;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>
</div>
</div>
</div>

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

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

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

<div id="a" style="position:relative;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div> <div id="b">
<div id="b-1">
<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>
</div>
</div> <div id="c" style="position:relative;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1<div>
</div>
</div>
</div>

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

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

总结:在运用z-index之前,最好先将各个模块的 position, z-index 和层级的关系梳理清楚, 以免后患无穷.z-index运用的好可以解决很多遮罩效果;

CSS 中z-index全解析(摘自阿里西西)的更多相关文章

  1. css中的一些属性解析

    1.inline-block 存在问题:inline-block的相互间距,元素之间会有一个左右2px的margin一样产生            请看中间的空隙. 为什么会产生这个空隙呢?? 怎么解 ...

  2. CSS中包含块原理解析

    CSS包含块原理解析 确定CSS中的包含块也确定就是元素的父元素.关键是:看元素是如何定位的.确定包含块很重要,比如设置百分比.另外也可以进行样式的继承等等. 分两个情况: 相对定位和静态定位 静态定 ...

  3. NCF WebApi中 Controller的全解析

    简介 上一篇我们说了如何实现一个WebApi,并运行起来 这次我们来说说WebApi的内在,我们到底做了哪些事情 仓库地址:https://github.com/NeuCharFramework/NC ...

  4. CSS Grid 网格布局全解析

    介绍 CSS Grid(网格) 布局使我们能够比以往任何时候都可以更灵活构建和控制自定义网格. Grid(网格) 布局使我们能够将网页分成具有简单属性的行和列.它还能使我们在不改变任何HTML的情况下 ...

  5. IDEA中配置maven 全解析教程(Day_08)

    每一个你讨厌的现在,都有一个不够努力的曾经. 一.选择一个maven的版本下载 本文中 maven 下载链接:(apache-maven-3.5.2.rar) https://files-cdn.cn ...

  6. css中display的属性解析

    display 属性规定元素应该生成的框的类型. 他有很多属性值,见如下表格: none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会 ...

  7. Android: 在native中访问assets全解析

    本文总结在Android Native C++开发中访问APK中的assets资源的方法 在CMake中添加相关NDK LIB的 依赖 因为我们接下来用到的一些函数实现在NDK库libandroid. ...

  8. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

    Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了 ...

  9. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

随机推荐

  1. MySQL的索引(中)

    连着发了几天文章,从我收到的反映来说,大家觉着还不错,可以很清晰的看到知识的脉络,但是这个还不错是针对传统的文章的无聊.不明确.完全不考虑考虑用户体验的角度上对比出来的.掌握一门知识还是不容易的,有的 ...

  2. vue 深入响应式原理

    vue最显著的特性就是不太引人注意的响应式系统(reactivity system),模型层(model)只是普通的javascript对象,修改它则更新视图view.这会让状态管理变得非常简单且直观 ...

  3. iOS开发UITableViewCell的选中时的颜色设置(转)

    iOS开发UITableViewCell的选中时的颜色设置   1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyle ...

  4. iOS图片加水印效果的实现并保存至相冊

    图片加水印效果的实现并保存至相冊 实现效果如图: project下载:githubproject下载链接 代码: - (void)viewDidLoad { [super viewDidLoad]; ...

  5. 日志系统之扩展Flume-LineDeserializer

    本人博客文章如未特别注明皆为原创.如有转载请注明出处:http://blog.csdn.net/yanghua_kobe/article/details/46595401 继续闲聊日志系统,在之前的博 ...

  6. 【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本

    上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化. 上一篇地址:<[Mac + Appium学习(一)]之安装Appium环境> 这一篇参考:<Ma ...

  7. 记录下push推送优化改进点

    一)自主研发的push服务的特点及优势: 1) 消息回执确认(ack); 2) 有效期推送(设置消息的有效期); 3) 精准推送(设置设备组别推送); 4) 下发任务分解(拆分任务,多进程); 5) ...

  8. Discuz二次开发手册

    Discuz文件说明,有助于discuz爱好者,进行自己的开发,在这里提供方便 admincp.php——后台系统设置主程序文件,一般只处理菜单的显示的访问权限,不处理管理控制. ajax.php—— ...

  9. 学习百度、腾讯及lofter的前端兼容及布局

  10. poj 2942(点双连通+判奇圈)

    题目链接:http://poj.org/problem?id=2942 思路:我们对于那些相互不憎恨的骑士连边,将每次参加会议的所有人(不一定是整个骑士团,只需人数>=3且为奇数)看做一个点双联 ...