深入理解z-index
要解决的问题
在页面编写的过程中,经常需要处理元素的重叠。重叠的顺序不当则容易造成元素被错误地遮盖等现象。一般地,有很多人认为只需要指定元素的z-index即可调整重叠的顺序,但是实际上并不是这样的。
重新理解页面维度
当我们打开一个网页,我们会看到一个二维的世界。在这个二维的世界里,页面里的box(盒子)各有自己的x坐标和y坐标。比如,在下图所示的页面结构里面,有四个div元素。它们分别具有自己的宽和高,而每个box左上角的x和y坐标就分别是这个box在页面中的x和y坐标。因而,在我们直观的感知里,页面是二维的。
然而,页面实际上还有第三个维度。垂直于x轴与y轴的方向,存在一个c轴。c轴的正方向指向用户。对于一个页面上的box,它一定有一个c坐标。注意,此处的c坐标并不是z-index。下图中的坐标名有误,z应该是c。
两个重叠的box最能证明这第三个维度的存在,如果页面上有两个元素是重叠的,那么浏览器的渲染引擎必须决定哪一个box的重叠部分要被放在前面。决定的方法很简单,就是直接比较这两个元素的c坐标。c坐标大的那一个,就被渲染在前面;反之,则被压在下面。
你不能把c坐标的大小理解成离用户的远近,因为如果那样理解,那么应该有“近大远小”现象。然而事实上,c坐标大的box并不会变小,只是被浏览器渲染在c坐标小的box前面而已。就好像在现实生活中,我们把两张卡片叠在一起,它们会有上下之分,但是看起来两张卡片的大小并不会有所改变(因为它们足够薄且小)。会产生近大远小现象的应该是z坐标,学过一点空间几何的人都应该熟悉。这也是我称这个维度为c坐标而非z坐标的原因。
下面我们一起来探究一下页面box之间是如何重叠的,换句话说,浏览器是怎么决定一个box的c坐标的。
默认重叠
对于重叠的元素,浏览器默认会按下面的顺序重叠。编号越大的box类型,所拥有的c坐标就越大,因此排在前面。
正常流当中的block level的box
浮动的元素
正常流当中inline level或者inline-block level的box
position值不是static(非正常流中)的box
这里并不是完整的列表,因为我略去了一些后面才会提到的内容。下面是一个示例:
可以看到,上述四种不同类型的box中,具有最大c坐标的是第4种,它能够覆盖其他所有三种元素。
你需要注意的一点是,不要用DOM树的结构来理解重叠。DOM树中下一级的box完全可以重叠在上一级box之上。这都和Stacking Context有关,我们接下来就详细解释一下。
Stacking-Context
上述四种box类型的重叠规律,当且仅当这些box在同一个Stacking Context的时候生效。不同Stacking Context中的box之间的重叠在下面会提到。
什么是Stacking Context?假设你正在玩贴纸,将很多贴纸贴到同一张纸上,并且贴纸之间可能产生重叠。Stacking Context就像是这张纸。浏览器首先按照默认的重叠规律,将同一个Stacking Context下的所有元素排好顺序,然后按照这个顺序渲染到Stacking Context上。例如,在下面的DOM结构中,有5个box,其中node1是一个Stacking Context,其他的都不是。
在渲染的时候,浏览器将node1当做画板,其他box都是贴纸。在决定贴纸顺序的时候,浏览器是不会考虑它们DOM结构上的父子关系的。也就是说,node3-1完全可以被渲染在node2-1的后面,只要在前面所说的默认重叠顺序中,node3-1具有的c坐标比node2-1来得低即可。
整个“贴纸”的过程如下图。可以看到,浏览器在当前Stacking Context中,无视了“贴纸”们的DOM结构之间的关系,而是通过我们前面提到的默认重叠顺序决定“贴纸”的先后关系。决定之后,浏览器将所有“贴纸”贴到Stacking Context上,这个过程称作Composite(组合)。
什么样的元素是一个Stacking-Context
符合下面要求的页面box,都是一个Stacking Context。
根元素(html元素)
position是absolute或者relative,并且z-index不是auto的元素
是flex item,并且z-index不是auto的元素
opacity值小于1的元素
在mobile webkit以及Chrome 22+中,position: fixed的元素
多个Stacking-Context之间的重叠
由上面产生Stacking Context的条件,我们可以知道,一个页面上一般有多个Stacking Context。那么多个Stacking Context之间如何决定重叠顺序呢?浏览器一般按下面的规则来决定其顺序,这实际上就是之前我们提到的默认重叠顺序的完整版。
Stacking Context的背景和边框
具有负的z-index的,且position值不是static(非正常流中)的子box的Stacking Context,且z-index数值越小,其c坐标越小
正常流当中的block level的box
浮动的元素
正常流当中inline level或者inline-block level的box
position值不是static(非正常流中)的box,且z-index为0或者auto
具有正的z-index的,且position值不是static(非正常流中)的子box的Stacking Context,且z-index数值越小,其c坐标越小
你需要注意到的是,z-index只能作用在position值不是static的box上方能起效。下面的例子可以说明多个Stacking Context之间的重叠规律。
在这里,.wrapper、#b1和#b2分别都是一个Stacking Context。#b1和#b2是.wrapper的子Stacking Context,浏览器会首先组合#b1以及组合#b2,之后再将#b1和#b2组合到.wrapper上。由于#b1具有正的z-index,而#b2具有负的z-index,所以#b1被组合到了#b2的上面。
你可以试着把#b1的z-index改成-2,那么它就变成了第二类的box(和#b2一样),又因为它的z-index比#b2来得小,所以它会被组合到#b2之后。
总结
z-index只在同一个Stacking Context的组合过程中,参与各个子box的重叠顺序的决定。但是页面box的重叠关系并非仅仅和z-index有关。清楚地认识z-index的工作原理,有助于你写出更有效率的样式表。
原文发布时间为:2018-10-11
原文作者:桃翁
本文来自云栖社区合作伙伴“前端桃园”,了解相关信息可以关注“前端桃园”。
深入理解z-index相关推荐
- 圈层效应:理解Z世代的消费逻辑,打造新的消费热点
近两年,做推广和运营的朋友,可能已经明显的感受到了互联网流量的枯竭,做增长不再像以前那么高效了,无论是传统的品牌营销方法,还是新型的效果广告,所带来的流量都是日益减少,投资回报率也越来越低.在移动互联 ...
- [每日一题] OCP1z0-047 :2013-08-14 如何理解USING INDEX?...................................41
正确答案:B 一.USING INDEX的实验: 1.USING INDEX可以让你在创建主键.唯一性约束的时候使用指定的索引或创建索引.或修改索引的存储结构. OK,我先不用USING INDEX, ...
- 【自动控制原理】【计算机控制技术】通俗易懂地理解Z变换
目录 〇.相关知识铺垫 0.1 拉氏变换 0.2 部分分式展开法 0.3 长除法 0.4 常用的一些级数求和 0.5 留数 0.6 叠分的概念 一.Z变换概念 二.Z变换方法 2.1 级数求和法 2. ...
- HTML中z index属性是用来,css中z-index 属性与用法详解
Z-index属性决定了一个HTML元素的层叠级别.元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言.一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶部.这个层叠顺序沿着垂 ...
- js怎么设置z index.html,HTML5 Canvas set z-index
j0kEli Stone提出了一个问题:HTML5 Canvas set z-index,或许与您遇到的问题类似. 回答者markE给出了该问题的处理方式: Yes..kind of yes. You ...
- html设置z index.html,CSS中z-index属性的使用方法和示例介绍
怎么使用CSS z-index属性?下面本篇文章就来给大家浅谈一下CSS z-index属性的使用方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. z-index属性介绍只有设置 ...
- [转]深入理解CSS中的层叠上下文和层叠顺序
http://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/ 零.世间的道理都是 ...
- MySQL 优化之 index merge(索引合并)
深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...
- 深入理解CSS中的层叠上下文和层叠顺序
转载一篇张鑫旭大神的文章(对于理解GPU硬件加速和网页分层还是有一点帮助的),原文地址:深入理解CSS中的层叠上下文和层叠顺序 零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论 ...
- mysql 执行计划extra_MySQL执行计划extra中的using index 和 using where using index 的区别...
www.linuxidc.com/Linux/2017-- mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using in ...
最新文章
- R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值、R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线、并进行对比
- python3 自动化交互模块 pexpect 简介
- 网络边缘(接入网和物理介质)
- 使用Python监控SNMP Trap并获取OSPF邻居状态
- 蚌埠计算机学校招生,蚌埠高级技工学校招生政策
- 对Java语言的byte类型变量进行无符号提升
- springboot整合PageHelper实现分页效果
- 一文详解什么是空洞卷积?
- Matlab入门变量篇
- Java Lambda 归约 reduce
- k3 Bos开发百问百答
- android文件恢复功能,终于找到了安卓手机删除的文件的恢复方法值得一看
- Goland常用快捷键
- 使用 Docker 搭建 mysql 数据库
- html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
- [ZZ]通过修改键盘映射替代损坏按键
- matlab求二阶微分方程的通解,二阶常微分方程matlab的数值解和解析解分析总报告.ppt...
- Unreal Engine蓝图编程学习(四)
- 前端与u3d的联调 -前端初学者使用vue与u3d联调的摸索和踩的坑,学习记录
- 仿QQ浏览器mac版官网主页 html+css3特效
热门文章
- unity获取电磁笔压感_1024级压感 原道W8S电磁笔的秘密
- 脑电分析系列[MNE-Python-16]| 脑电数据的Epoching处理
- “纹身贴皮电路“:未来在皮肤上画个电路就能监测身体健康状况
- 给PS4装上Linux,然后用Xbox手柄打任天堂游戏?网友:这场面我没见过
- 关于MEET大会直播抽奖后续红包发放的说明
- 现在,用音频也能指挥GAN生成图像了
- 高校老师暑假狂补AI课背后:AI人才培养竞赛开跑
- 你还弄不懂的傅里叶变换,神经网络只用了30多行代码就学会了
- 怎样的财报让百度市值一夜暴涨400亿?净利逆势大涨219%;李彦宏:将在中国经济的复苏中受益...
- 第8章 基本UDP套接口编程