为了避免歧义,本文尽可能避免使用一些母语为中文的程序员创造的抽象名词,更多概念请浏览MDN中的相关内容,推荐浏览英文版。
https://developer.mozilla.org/en-US/docs/Web/CSS/position
【提问】
a和b、c两个,a的z-index是100,b的z-index是90,c是b的子类,c的z-index是50,这样c是不是90+50高于100?请问css的z-index是按照当前层来控制高低的吗?还是各有各的层?
【回答】
判断谁层高,与class的继承关系无关(也就是不存在90+50的说法),只与被比较的几个元素在DOM树中的相对位置以及定位相关属性值有关。
不管是absolute、relative、fixed定位中的哪一种定位方式,执行定位操作的元素都是针对“参考点”进行位置偏移。
为方便讨论,先假设a、b、c三个元素的position值均absolute。
再假设a、b元素的祖先元素中【均没有】position值【不为】static的元素,此时可以视作a、b的定位用的“参考点”相同,默认为body元素的左上角;
那么这时候可以通过比较a、b的z-index值以及a、b在DOM树中的位置关系,判断两者谁层更高。
假设a、b的z-index值相同,则谁后挂载到DOM树中,谁层就高;假设a、b的z-index值不同,则z-index值大的层更高。
最后假设c是b的子元素(DOM树中,c是b的子节点),那么此时c相对于b元素的左上角进行偏移(注意前面还有几个前提条件),那么,只有与其它同样以b元素的左上角为参考点进行偏移的元素,才能与c比较层高。
更关键的一点,不管c的z-index值是多少,c的层永远高于其祖先元素,甚至与祖先元素的potision是否为absolute/relative/fixed无关。
类比一下编程语言的变量作用域的问题,c的z-index值与a、b的z-index的作用域不同。
从“表现上来看”,c与a的层的高低关系,完全由b“全权代理”。
扩展一下,假设a、b的“参考点”不同,就必须先找到两者参考点相同的祖先元素,再通过比较祖先元素的DOM位置以及定位相关属性,才能判断出谁的层更高。