`

元素层叠级别(stack level)及z-index剖析 [待学习]

阅读更多
http://www.kuqin.com/webpagedesign/20080829/15536.html

声明

定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。
平台:win/IE win/FF

z-index:
用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序
值:      auto | 整数 | inherit
默认:      auto
适用于:  定位元素
继承性:  no
理解stacking context
每个box都归属于一个stacking context,它是元素在z轴方向上定位的参考。根元素形成 root stacking context,其他stacking context由定位元素设置z-index为非auto时产生。如#div1{position:relative;z-index:0;}即可使id=div1的元素产生stacking context。stacking context和 containing block 并没有必然联系。


理解stack level
在一个stacking context中的每个box,都有一个stack level(即层叠级别,以下统一用stack level),它决定着在同一stacking context中每个box在z轴上的显示顺序。同一stacking context中,stack level值大的显示在上,stack level值小的显示在下,同一stack level的遵循后来居上的原则(back-to-front )。不同stacking context中,元素显示顺序以父级的stacking context的stack level来决定显示的先后情况。于自身stack level无关。注意stack level和z-index并不是统一概念。(将在后文慢慢理解)


stack level规则
每个stacking context中可包含块级(block)元素、内联(行内inline)元素,还有设置float属性的元素、定位元素等等他们在同一父级stacking context中的显示顺序是怎样的?即stack level是怎样的呢?比如一个块级元素和内联元素发生层叠的话谁会在上面呢?是不是谁在后面谁就在上面呢?

根据w3c关于stack level的介绍可以得出以下stack level规则


每个stacking context都包括以下stack level (后来居上):
1.父级stacking context的背景、边界
2.z-index值为负值的定位元素(值越小越在下)
3.文本流中非定位的、block块级子元素
4.文本流中非定位的、float浮动子元素
5.仿佛能产生stacking context的inline元素
  否则,inline元素的stack level将在block元素之前。
6.z-index:auto/0的定位元素
7.z-index值为正的定位元素(值越大越在上)
以上stack level在浏览器执行情况:
firefox3.0下测试完全吻合,firefox2.0下稍有不同即:“z-index值为负值的定位元素”在“父级stacking context的背景、边界”之前。
ie6.0和7.0中:inline元素的stack level位于block元素之前,且“文本流中非定位的、float浮动子元素”(以下简称浮动元素)和“文本流中非定位的、block块级子元素”(以下简称block元素)处于同一级。

测试:
FF下测试:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
		<meta name="Keywords"
			content="z-index,IE,Firefox,stacking context,stack level" />
		<meta http-equiv="Description"
			content="这是一个在火狐中测试层叠级别(stack level)的页面" />
		<meta content="all" name="robots" />
		<meta name="author" content="rong179,rong179@yahoo.cn" />
		<meta name="copyright" content="http://rong179.blogbus.com" />
		<title>stack level 在火狐中的测试</title>
		<style type="text/css" media="all">
#container {
	position: relative;
	left: 100px;
	z-index: 0;
	background: purple;
	width: 500px;
}

#container div {
	height: 200px;
	width: 200px;
}

#box-p-zn {
	position: relative;
	z-index: -1;
	background-color: yellow;
	top: -25px;
	left: -30px;
}

#box-block {
	background-color: aliceblue;
	margin-top: -30px;
	margin-left: 150px;
}

#box-float {
	float: left;
	margin: -50px 100px 0 0;
	background-color: red;
}

#box-inline {
	background-color: gray;
	display: inline;
	padding: 50px 0;
}

#box-p-za {
	position: absolute;
	top: 50px;
	left: 50px;
	background-color: green;
}

#box-p-zp {
	position: relative;
	z-index: 1;
	background-color: greenyellow;
}
</style>
	</head>
	<body>
		<div id="container">
			<div id="box-p-zp">
				这个box position:relative;z-index:1;定位元素z-index值为正
			</div>
			<div id="box-p-za">
				这个box position:absolute;z-index:auto;定位元素z-index值auto
			</div>
			<div id="box-inline">
				这个box inline;
				<br />
				inline元素
			</div>
			<div id="box-float">
				这个box float;
				<br />
				<br />
				<br />
				<br />
				<br />
				<br />
				未定位的浮动元素
			</div>
			<div id="box-block">
				----这个box block;未定位的块级元素
			</div>
			<div id="box-p-zn">
				这个box z-index:-1;定位元素z-index值为负
			</div>
			<!-  调试之用   -->
		</div>
	</body>
</html>

测试页面:
http://rong179.blogbus.com/files/12163574750.html(请分别在FF3.0和FF2.0中打开)

代码说明:
由前所述,如果元素的stack level同级则后来居上;元素的stack level高,这无论代码在文档中位置如何都显示在上面,即使代码在最前面;如果元素的stack level低,无论代码位置如何都将显示在下面,即使代码在最后面。

我们就根据这一点,以“3.文本流中非定位的、block块级子元素”和“4.文本流中非定位的、float浮动子元素”为例,如果我把“float元素”的代码写在“block元素”的前面,且实际显示为:“float元素”在“block元素”之上。即可证明:"float元素”的stack level级别较“block元素”高。因为如果同级,或者“block元素”的stack level高都应是“block元素”显示在上。

根据以上,根据标准中的顺序,把stack level高的元素代码写在前面,stack level低的代码写在后面,如果显示结果是:代码在前面的元素显示在上方 ,即证明上面的stack level规则。

测试结果:
在FF3.0中结果和标准顺序一致。FF2.0中“z-index值为负值的定位元素”在父级stacking context的背景下面。(注意ff2.0的这个特殊性)

IE下测试:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
		<meta name="Keywords"
			content="z-index,IE,Firefox,stacking context,stack level" />
		<meta http-equiv="Description"
			content="这是一个在IE中测试层叠级别(stack level)的页面" />
		<meta content="all" name="robots" />
		<meta name="author" content="rong179,rong179@yahoo.cn" />
		<meta name="copyright" content="http://rong179.blogbus.com" />
		<title>stack level 在IE中的测试</title>
		<style type="text/css" media="all">
#container {
	position: relative;
	z-index: 0;
	background: purple;
	width: 400px;
}

#container div {
	height: 200px;
	width: 200px;
}

#box-p-zn {
	position: relative;
	z-index: -1;
	background-color: yellow;
	top: -95px;
	left: 55px;
}

#box-block {
	background-color: aliceblue;
	margin-top: -170px;
	margin-left: 30px;
}

#box-float {
	float: left;
	margin: -50px 0px 0 35px;
	background-color: red;
}

#box-inline {
	background-color: gray;
	display: inline;
	padding: 50px 0;
	margin-left: -10px;
}

#box-p-za {
	position: absolute;
	top: 50px;
	left: 50px;
	background-color: green;
}

#box-p-zp {
	position: relative;
	background-color: greenyellow;
	z-index: 1;
}
</style>
	</head>
	<body>
		<div id="container">
			<div id="box-p-zp">
				这个box position:relative;z-index:1;
			</div>
			<div id="box-p-za">
				这个box position:absolute;z-index:auto;
			</div>
			<div id="box-float">
				这个box float
			</div>
			<div id="box-block">
				<br />
				<br />
				<br />
				<br />
				这个box block
			</div>
			<!--请交换上面两个元素的顺序,再试试 -->
			<div id="box-inline">
				这个box inline;
			</div>
			<div id="box-p-zn">
				<br />
				<br />
				<br />
				<br />
				<br />
				这个box z-index:-1;
			</div>
			<!--    调试之用              -->
		</div>
	</body>
</html>

测试页面:
http://rong179.blogbus.com/files/12163574751.html

代码说明:
此代码也是根据上面的测试思想,但由于inline元素在ie中的特殊性,把inline的代码写在了后面,事实证明结论是正确的。对于“block元素”和“float元素”顺序大家可以交换顺序测试。

测试结论:
IE下(无论ie6.0或者ie7.0)“float元素”和“block元素”属同一stack level,而“inline元素”较其stack level低。

解释:
“float元素”,“z-index:auto的定位元素”仿佛产生了新的stacking context,但其真正能产生新的stacking context的后代任按其父级stacking context定位。(但IE中“z-index:auto的定位元素”
会拥有z-index值0,产生一个新的stacking context,并影响其子元素定位。这是IE一个BUG)
inline元素在FF中仿佛能产生新的stacking context,而在IE中则不能。

至此stack level规则内容已经完毕,现在应该能理解stack level和z-index的不同。stack level来决定这一个stacking context中各元素在z轴上的显示顺序,对于同一stack level的定位元素才由z-index进一步决定显示次序。

一些问题的解释:
怿飞在《z-index在IE中的迷惑》一文中最后提到的问题:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="Keywords" content="z-index,IE,迷惑" />
		<meta http-equiv="Description" content="这是一个z-index在IE中的迷惑的演示" />
		<meta content="all" name="robots" />
		<meta name="author" content="blank,怿飞" />
		<meta name="copyright" content="http://www.planabc.net" />
		<title>z-index在IE中的迷惑</title>
		<style type="text/css" media="all">
#box1 {
	position: absolute;
	top: 100px;
	left: 210px;
	width: 200px;
	height: 200px;
	background-color: yellow;
	z-index: -10;
}
</style>
	</head>
	<body>
		<div id="box1">
			为什么负值的定位元素在IE和FF下显示不一致呢?Why?
		</div>
	</body>
</html>

演示地址:
http://rong179.blogbus.com/files/12163573190.html

认为:

解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。

真是这样吗?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<style>
* {
	margin: 0;
}

html {
	background: silver;
}

body {
	height: 200px;
	width: 200px;
	background: #0F0;
	text-align: right; /*ie中position:relative;加上这条试试*/
	/*ff中opacity:0.99;加上这条试试*/
}

#box1 {
	position: absolute;
	left: 100px;
	top: 100px;
	width: 200px;
	height: 200px;
	background: #F00;
	z-index: -1;
}
</style>
	</head>
	<body>
		BODY:z-Index:0
		<div id=“box1”>
			DIV:z-Index:-1
		</div>
	</body>
</html>

演示地址:
http://rong179.blogbus.com/files/12163572440.html

分析:
box1显示在body的下方,根据上面的stack level规则,IE中,如果body默认了一个位置属性,即body是其父级stacking context,box1应显示在其上方,事实却不是这样。而且当我们给body加上position:relative以后,显示效果和stack level规则一致。所以body并没有默认位置属性。

那为什么负值的定位元素在IE和FF下显示不一致呢?
ie中根据stack level规则: z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)高,显示在其上方。故box1在ie中能显示。ff3.0和标准一致,也能显示。大家可以试一下。

ff2.0中由于那条特殊的stack level,即 z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)低,所以显示在root stacking context下方。故不能看见。

另外,上面的代码中加上opacity那条后,在ff2.0中即可显示了。这又是什么原因呢?

推测:在火狐中如果给元素设置opacity属性(1除外),即会产生新的stacking context。
上面加上opacity属性后在ff2.0中可显示box1在body下,ff3.0box1在body上,(可以根据上面的stack level规则自己分析)符合推测。
在w3c的说明中也证明这点


In future levels of CSS, other properties may
introduce stacking contexts, for example 'opacity'
[CSS3COLOR].


总结:
在一个stacking context中元素的z-轴显示顺序,由元素所处的stack level决定。对于同一stack level的定位元素由z-index的大小进一步决定显示次序。

ie中给元素设置position属性(static除外)可产生新的stacking context
ff中给元素设置opacity属性(1除外)可产生新的stacking context
除此之外(也许设置其他属性也会产生新的stacking context,但还不知道)只有定位元素设置了z-index(auto除外)才会产生新的stacking context,子元素将按照新的stacking context,定位。
分享到:
评论

相关推荐

    Z-Stack 3.0.2-.7z.zip_Z-STACK 3.0.2_Z-STACK-3.0.2_z-stack 3_z-st

    Z-Stack 3.0.2 是一个专为物联网(IoT)设计的网络协议栈,它由Zigbee联盟开发并广泛应用于智能家居、智能能源、工业自动化等领域。Zigbee是一种低功耗、低成本、自组织的无线通信技术,支持多跳网络,能构建大规模...

    Z-Stack-Mesh-1.0.0,是TI(德州仪器)发布的基于CC2530的ZigBee协议栈

    Z-Stack是TI(德州仪器)为ZigBee开发提供的一套完整的协议栈,它包含了从物理层(PHY)、数据链路层(MAC)到网络层(NWK)、应用支持层(APS)和应用框架(AF)的所有层次,为开发者提供了构建ZigBee网络的全面工具。...

    Z-Stack 3.0.2.zip

    Z-Stack 3.0.2是Texas Instruments(TI)发布的一个重要的无线网络协议栈,专为Zigbee通信协议设计。Zigbee是一种低功耗、短距离、自组织的无线网络技术,广泛应用于智能家居、工业自动化、智能电网等领域。Z-Stack...

    Z-Stack_Lighting_1_0_2

    Z-Stack_Lighting_1_0_2 是TI(德州仪器)推出的一个针对CC2530微控制器的ZigBee协议栈软件版本。ZigBee是一种基于IEEE 802.15.4标准的低功耗、短距离无线通信技术,广泛应用于智能家居、智能照明、传感器网络等领域...

    从零开始学习Z-Stack——zigbee学习笔记

    本文将带你从零开始学习Z-Stack,深入理解Zigbee通信的基础概念,并逐步掌握Z-Stack的使用方法。 1. **Zigbee基础** - **定义**:Zigbee是一种近距离、低复杂度、低功耗、低数据速率的无线网络技术,适用于传感器...

    redis-stack-server 7.2.0 安装包合集

    redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...

    基于Z-Stack的点对点通信_zigbeecc2530_z-stack_

    Z-Stack是TI(德州仪器)开发的一套完整的Zigbee协议栈,它为开发者提供了构建Zigbee网络的基础。本文将深入探讨基于Z-Stack的点对点通信,以及如何在CC2530微控制器上实现这一通信模式。 CC2530是TI公司设计的一款...

    CSS教程:元素层叠级别及z-index

    原文:http://rong179.blogbus.com/logs/24966909.html声明定位元素:position属性值设置除默认值static以外的元素...平台:win/IE win/FFz-index:用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序值:

    Z-Stack 3.0.2 和 2.5.1协议栈

    Z-Stack是TI公司开发的一款专门用于Zigbee网络的软件协议栈,它为开发者提供了构建无线传感器网络和物联网应用的基础。Zigbee是一种低功耗、低成本、自组织的无线通信技术,常用于智能家居、工业自动化、智能照明等...

    从零开始学习Z-Stack

    通过深入学习Z-Stack,你可以掌握构建物联网系统的关键技能,理解其背后的网络原理,从而在实际项目中灵活运用。从理解基础概念到编写应用代码,每一个步骤都至关重要。通过不断实践和探索,你将成为Z-Stack的专家,...

    Z-Stack-Sample-Applications.zip_z-stack

    TI的Z-Stack Sample Applications是针对物联网(IoT)领域中的无线通信...通过深入学习和实践Z-Stack Sample Applications,开发者可以更好地理解和掌握Z-Stack的工作原理,从而高效地开发出满足特定需求的无线通信应用。

    Z-Stack的最新版本

    Z-Stack是TI(德州仪器)推出的一种专为低功耗无线网络设计的协议栈,主要应用于Zigbee、Thread和Z-Wave等物联网通信标准。这个协议栈为设备间的通信提供了一套完整的软件框架,使得开发人员可以快速构建无线传感器...

    Z-Stack ZMain学习

    Z-Stack ZMain 学习 Z-Stack ZMain 是一种基于 ZigBee 协议的栈级实现,用于实现 ZigBee 协议的数据传输和处理。本文将对 Z-Stack ZMain 的主要组件和流程进行详细的解释。 OSAL_Init_System() 函数是 Z-Stack ...

    学习CSS网页制作:z-index在IE中的迷惑.pdf

    定位子元素在它们的局部堆叠上下文中根据`z-index`进行比较,而不同的堆叠上下文之间则是通过堆叠上下文的层次(stack level)来决定元素的前后顺序。 在相同的堆叠上下文中,如果元素的`z-index`相同,那么按照...

    Z-Stack 3.0 开发者中文手册.pdf

    Z-Stack 3.0是德州仪器(Texas Instruments,简称TI)提供的一个ZigBee协议栈,它是一个无线通讯技术,用于创建低功耗局域网。ZigBee协议栈基于IEEE 802.15.4标准,用于满足低数据速率、低功耗、短距离的无线通讯...

    CSS元素的层叠与z-index设置

    在网页设计中,CSS元素的层叠和z-index设置是一个至关重要的概念,它决定了元素在页面上的前后显示顺序。这篇文章将深入探讨这个主题,帮助开发者更好地理解和应用这些知识。 首先,我们要了解定位元素。在CSS中,...

    zigbee_Z-Stack 3_z-stack开发手册_Zigbee开发者_ZigBee3.0_zigbee3.0CSDN_z

    10. **实例分析**:通过实际应用案例,演示如何应用Z-Stack 3.0进行设备开发和网络部署。 这份《Zigbee Z-Stack 3.0 开发手册》对于任何想要深入研究Zigbee技术,尤其是Zigbee 3.0规范的开发者来说,都是不可或缺的...

    协议栈-Z-Stack协议栈基础和数据传输实验.doc

    Z-Stack 协议栈基础和数据传输实验 协议栈是 Zigbee 通信协议中的一个关键组件,它提供了一个小型的操作系统,将许多通信、组网之类的代码封装起来了。我们可以通过调用函数来实现我们的目的。 协议栈的工作流程图...

    Z-STACK api

    Z-STACK API是TI(Texas Instruments)公司为无线通信协议栈Z-Stack设计的一套应用程序接口,用于简化开发者对Zigbee网络的操作和管理。Z-Stack是一个完整的、经过优化的无线网络协议栈,主要用于物联网(IoT)设备,...

Global site tag (gtag.js) - Google Analytics