- 浏览: 268226 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (251)
- 面试基础 (9)
- java基础 (40)
- 调试配置 (10)
- 转载文章 (4)
- 心灵鸡汤 (8)
- java工具 (6)
- CSS学习 (7)
- css案例 (2)
- 经济 (1)
- 小节惹的祸 (1)
- 实例心得 (21)
- 数据库 (7)
- 有用的代码 (17)
- Struts (3)
- Hibernate (5)
- Spring (3)
- java xml (7)
- Java Reflection API (1)
- 网络配置 (4)
- SSH (8)
- java开源框架 (13)
- ajax (4)
- swing (1)
- 设计模式 (1)
- 未主流组件 (7)
- WebService (6)
- 20111019 (1)
- xiao清讲课笔笔~~~UML (0)
- 笔记 (2)
- SOAP (9)
- 第一天遇到的问题 (1)
- Java Card (3)
- 面试 (18)
- Java (17)
- JNLP 集群 (0)
- java 面试 (3)
最新评论
-
ap0406708:
138XXXXXXXX
webserivce spring-ws 安全 -
yezhuzhe:
...
[code]SSH上传下载 ------温故知新 -
thinking_ou:
怎么需要解压密码
webserivce spring-ws 安全 -
ap0406708:
uuu999ggg 写道连return都写错了
try catch finally 块 与 函数的return -
wst0350:
...
java正则表达式,js正则表达式
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下测试:
测试页面:
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下测试:
测试页面:
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中的迷惑》一文中最后提到的问题:
演示地址:
http://rong179.blogbus.com/files/12163573190.html
认为:
解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。
真是这样吗?
演示地址:
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,定位。
声明
定位元素: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,定位。
发表评论
-
CSS的bug,hack (持续更新)
2009-07-06 11:45 640网页在ie和firefox的显示,好难可以一模一样.因为fir ... -
CSS中的display:none和visibility:hidden的区别
2009-06-23 00:31 1976display:none 隐藏对象。隐藏对象其物理空间 vi ... -
zoom属性(其它)和z-index属性(定位)
2009-06-11 02:29 2837一.zoom属性 可设值1.0;100%;(小数,整数,百 ... -
css效果 float属性
2009-06-07 01:47 1124html代码: <!DOCTYPE html PUB ... -
css效果 position属性
2009-06-06 23:17 7191.让内部元素跑到包含元素外面,只有改变内部元素的定位环境. ... -
CSS的视觉效果:width,padding,margin
2009-05-19 23:52 18531.包含元素的整体大小: [width] + padding ...
相关推荐
最近发布的Zstack 3.0.2 SDK 和说明文档
TI Z-Stack 3.0.2官方原版,zigbee TI 开发官方BSP,支持TI CC2530,CC2538等多款器件!
这个软件名称是 Z-Stack_Lighting_1_0_2,是TI(德州仪器)发布的基于CC2530的ZigBee协议栈,主要用于CC2530应用开发。
z-stack代码分析--osalInitTasks函数1
原文:http://rong179.blogbus.com/logs/24966909.html声明定位元素:position属性值设置除默认值static以外的元素...平台:win/IE win/FFz-index:用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序值:
从零开始学习Z-Stack从零开始学习Z-Stack从零开始学习Z-Stack从零开始学习Z-Stack
这个软件名称是Z-Stack-Mesh-1.0.0,是TI(德州仪器)发布的基于CC2530的ZigBee协议栈,主要用于CC2530应用开发。
CC2530 Z-stack
协议栈-Z-Stack协议栈基础和数据传输实验.doc
Z-Stack的最新版本(2014年9月)Z-Stack_Home_1_2_1( Z-Stack Core 2.6.2),附带较早的Z-Stack-CC2530-2.5.1a版本。
Z-Stack 3.0.2和 2.5.1 协议栈. TI公司在推出CC2530同时, 发布的Zigbee协议栈.
Z-Stack ZMain学习
Z-Stack电源管理Z-Stack电源管理Z-Stack电源管理Z-Stack电源管理
Z-Stack 3.0.2协议栈官方例程,用于zigbee硬件调用。内部包含z-StackAPI解释,官方工程(需要IAR-8051支持)
Z-Stack学习参考\深入浅出,对于Z-Stack可以深入的学习理解!!
节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802. 15. 4/ZigBee的CC2430片上系统解决方案。Z-Stack还支持丰富的新特性,如无线下载,可通过ZigBee网状...
Z-Stack Home 1.2.0 Z-Stack Home 1.2.0 Z-Stack Home 1.2.0 Z-Stack Home 1.2.0
对z-stack协议的各层及其自带的操作系统接口函数做一简单的分析,可帮助初学者快速了解z-stack协议。
3.0.2版本于2018年8月发布,适用于CC2530/CC2531/CC2538,zstack部分源码不开放,以静态库的形式发布,所以必须配合下列指定的开发环境使用: EWARM 8.22.1 for CC2538 Wireless MCU EW8051 10.20.1 for CC2530 and ...