[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
Web开发
> 详细
CSS教程:网页布局定位及z-index解释
时间:
2015-12-30 18:52:48
阅读:
253
评论:
0
收藏:
0
[点我收藏+]
声明
定位元素:
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 (后来居上):
父级stacking context的背景、边界 z-index值为负值的定位元素(值越小越在下) 文本流中非定位的、block块级子元素 文本流中非定位的、float浮动子元素 仿佛能产生stacking context的inline元素
否则,inline元素的stack level将在block元素之前。 z-index:auto/0的定位元素 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>
[Ctrl A 全部选择 提示:你可先修改部分代码,再按运行]
测试页面
:
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规则。
测试结果
:
一些问题的解释
:
怿飞版主在《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>
[Ctrl A 全部选择 提示:你可先修改部分代码,再按运行]
演示地址
:
http://rong179.blogbus.com/files/12163573190.html
认为:
解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。
真是这样吗?
运行代码框
<!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,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>body 是否默认有position属性</title> <head> <style> *{ margin:0; } html{ background:silver; } body{ height:200px; width:200px; background:green; text-align:right; /*ie中position:relative;加上这条试试*/ /*ff中opacity:0.99;加上这条试试*/ } div{ position:absolute; left:100px; top:100px; width:200px; height:200px; background:yellow; z-index:-1; } </style> </head> <body> BODY:<br />z-Index:0 <div>DIV:<br />z-Index:-1</div> </body> </html>
[Ctrl A 全部选择 提示:你可先修改部分代码,再按运行]
演示地址
:
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,定位。
在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>
[Ctrl A 全部选择 提示:你可先修改部分代码,再按运行]
测试页面
:
http://rong179.blogbus.com/files/12163574751.html(请在IE下浏览)
代码说明
:
此代码也是根据上面的测试思想,但由于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进一步决定显示次序。
CSS教程:网页布局定位及z-index解释
原文:http://www.jb51.net/css/6794.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!