CSS 中z-index全解析

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、css z index 永远顶层、css zindex、css z index 无效、css z index属性,以便于您获取更多的相关知识。

时间: 2024-12-09 12:22:24

CSS 中z-index全解析的相关文章

解析css中30个最常用的选择器

文章简介:30个最常用css选择器解析. 你也许已经掌握了id.class.后台选择器这些基本的css选择器.但这远远不是css的全部.下面向大家系统的解析css中30个最常用的选择器,包括我们最头痛的浏览器兼容性问题.掌握了它们,才能真正领略css的巨大灵活性. 1. * {    margin: 0;    padding: 0;   } 星状选择符会在页面上的每一个元素上起作用.web设计者经常用它将页面中所有元素的margin和padding设置为0. *选择符也可以在子选择器中使用.

解析css中的选择符命名

  原来命名可以这样的 前一段时间,在某一站点看到了这样的内容: "这也可以?"是我对此的第一印象.不过,稍作调查知道了,这样写确实是有效的.此外,这个?_?的符号表情,看起来是不是相当有存在感?再看看搭配的css属性,display: none !important;即定义元素一定不显示,是不是也非常符合这个表情想要表达的意思? 只要遵循css语法,就可以很好地应用这种不常见的命名. 命名字符的规定 英文单词的组合你一定很熟悉,例如.top_nav用来表示顶部导航,不仅用了合法的选择

html-本人菜鸟一枚,请教大神一个关于CSS中ID和类选择器不能用,而标签选择器能用的问题

问题描述 本人菜鸟一枚,请教大神一个关于CSS中ID和类选择器不能用,而标签选择器能用的问题 FIREFOX浏览器,代码如下: HTML代码片段: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @import url(template/default/styl

php问题-php里css中的清除浮点问题

问题描述 php里css中的清除浮点问题 #head{border:1 solid red;width:100%;height:20;}ul{float:left;}#banner{float:left;}.clear{overflow:hidden;zoom:1;} 首页 首页 首页 首页 首页 首页 我写的这个程序为什么li中的那几个字不显示在规定的div块里而是出现在它的下方呢,是不是清除浮点搞错了啊,浮点换了几次都不成功,求教各位大神指点一下 相关文章 清除require载入的文件 ph

网页设计CSS中文字大小的pt、px的区别

先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点:而pt就是point,是印刷行业常用单位,等于1/72英寸. 在网页设计css中,经常用到字体,而字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢? 先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点:而pt就是point,是印刷行业常用单位,等于1/72英寸. 这样很明白,px是一个点,它不是自然界的长度单位,谁能说出一个"点"有多长多大么?可以画的很小,也可以很大.如

详细学习CSS中的网页布局的属性

css|网页 布局(Layout)属性: 在以前的HTML里,元素的位置只能靠元素的依次排列觉得,而在CSS里你可以更精确的定位元素.Netscape曾提出过Layer标记,它对于精确布局很有好处,但是并没有被W3C承认,W3C在CSS提出了类似于Layer标记的功能. position属性: position属性用来决定元素的位置类型,详见属性: 属性名称: 'position'属性值: absolute | relative | static初始值: static适合对象: 所有元素是否继承

学习网页制作CSS中如何正确运用颜色

css|网页 网页中因为有颜色而精彩,那么我们如何利用CSS来处理颜色呢? CSS拥有1677216色供你处置,可以用名字,rgb(红绿蓝)值或者十六进制代码(hex)值来表示. 红色red相同于rgb(255,0,0)相同于rgb(100%,0%,0%)相同于#ff0000相同于#f00有16中合法的预定义颜色名字.它们是:aqua(水绿). black(黑).blue(蓝). fuchsia(紫红). gray(灰). green(绿).lime(浅绿). maroon(褐).navy(深蓝

CSS中常用的单位

css 一.长度单位 长度单位是Web页设计中最常用的一个单位.一个排列无序.杂乱无章的页面不可能给人们留下什么好的印象.于是,在设计的时候需要为元素的位置.尺寸精确地定义一些值,以使其达到预期的效果. CSS给予人们精确控制网页的能力,这一点为人们津津乐道.它允许人们定义外观.尺寸.空间及其他的样式.但是,CSS所给出的控制同时也是一个危险的东西,这不仅表现在设计者缺乏经验,更在于如何给出一个尺寸和空间值.为什么呢?因为一个设计者虽然能够决定某一个特殊的屏幕分辨率,但是不可能决定别人的

WorldWind系列五:插件加载过程全解析

不得不承认World Wind的代码真的很庞大,没有太多帮助文档的前提下,一头钻进代码里肯定令你头疼的,甚至研究代码间关联仿佛是在走迷宫.我最近一直想弄明白如何在 MenuBar中加载那些插件的,WorldWind学习系列四中研究的只是特殊的三个功能加载的,那三个没有继承Plugin类,不算是插件功能加载.所以WorldWind学习系列四加载的三个是特殊情况,不是一般的插件加载.今天下午终于柳暗花明,如果你真正关注World Wind分析,那么就好好看看下面的插件加载过程全解析. 我们先看看Pl