草根站长论坛's Archiver

yess 发表于 2008-7-22 12:15

 元素层叠级别及z-index剖析

定位元素:-`TU#MS} H
position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。
A/FFl6Ty1ycK 平台:win/IE win/FF
x.P:W/|+^)V:F^#} [b]z-index[/b]rU0W8EJ[
用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序6tm5afr M
值:auto | 整数 | inherit*E1Q v&SH-Sc
默认:autosg8ZbC(c,S
适用于:定位元素3S,v"I@q^
继承性:no
u0j m6jI;C2r [b]理解stacking context[/b]nL Ig%}
每个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 并没有必然联系。
YHe,WG |d f [b]理解stack level[/b] d} YY s[b Q
在一个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并不是统一概念。(将在后文慢慢理解)"H bm0Nu4v@'m
[b]stack level规则[/b]
c&h/b-^,l? 每个stacking context中可包含块级(block)元素、内联(行内inline)元素,还有设置float属性的元素、定位元素等等他们在同一父级 stacking context中的显示顺序是怎样的?即stack level是怎样的呢?比如一个块级元素和内联元素发生层叠的话谁会在上面呢?是不是谁在后面谁就在上面呢? Q;L)v;r:gq,H2X9{ r
根据w3c关于 [color=#0000ff]stack level[/color] 的介绍可以得出以下stack level规则
}Jx"G.p/s6H'[g 每个stacking context都包括以下stack level (后来居上):)d;j8UVrH^1|#Dq!E"{A
[list=1][*]父级stacking context的背景、边界[*]z-index值为负值的定位元素(值越小越在下)[*]文本流中非定位的、block块级子元素[*]文本流中非定位的、float浮动子元素[*]仿佛能产生stacking context的inline元素
ve,d0AI7B `-~%c 否则,inline元素的stack level将在block元素之前。[*]z-index:auto/0的定位元素[*]z-index值为正的定位元素(值越大越在上)[/list][b]以上stack level在浏览器执行情况[/b]:i8Zo&[.Dr;\ g1_r
firefox3.0下测试完全吻合,firefox2.0下稍有不同即:“z-index值为负值的定位元素”在“父级stacking context的背景、边界”之前。 S| F/U-H-[ Z2zNS
ie6.0和7.0中:inline元素的stack level位于block元素之前,且“文本流中非定位的、float浮动子元素”(以下简称浮动元素)和“文本流中非定位的、block块级子元素”(以下简称block元素)处于同一级。

yess 发表于 2008-7-22 12:16

[b]FF下测试[/b][code] J F P-qY%Y4ob*q_
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+YtkGY'\[3H w <html xmlns="http://www.w3.org/1999/xhtml">
{ \H+d{v <head>no?6p-JxSt \&N[
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
1[k8_ |#H-A,hl.U <meta name="Keywords" content="z-index,IE,Firefox,stacking context,stack level" />2C#aE l `/aU2[
<meta http-equiv="Description" content="这是一个在火狐中测试层叠级别(stack level)的页面" />[!Y4VVR3E
<meta content="all" name="robots" />d*k.d8k3x!N;V+t
<meta name="author" content="rong179,rong179@yahoo.cn" />
w0Qo V0AI <meta name="copyright" content="http://rong179.blogbus.com" />A&E)RA-@P
<title>stack level 在火狐中的测试</title>
YXk1y|5Sbl{ <style type="text/css" media="all">
-f;Vr*T-y #container {position:relative;left:100px;z-index:0;background: purple;width:500px;}
!I(t0h.v~8@ o #container div {height:200px;width:200px;}0N)yt?2t-E+Y
#box-p-zn { position:relative;z-index:-1;background-color:yellow; top:-25px;left:-30px;}
;q;~3Tw/^h6kpG #box-block {background-color: aliceblue;margin-top:-30px;margin-left:150px;}
f(C/g(W l8a?P #box-float {float:left;margin:-50px 100px 0 0;background-color: red;}
uZI L?+Q #box-inline {background-color: gray;display:inline;padding:50px 0;}$g x @.pct
#box-p-za { position: absolute; top:50px;left:50px; background-color: green;}
.z F @PHJglL[ #box-p-zp { position: relative;z-index:1;background-color: greenyellow;}
Sh3c@$` QD8Z </style>_%c,e*f1U%Wa?
</head>
S&bWF-|%l'F <body> Tb2hIe?[
<div id="container">
!M5i)D'g ?8h,G    <div id="box-p-zp">这个box position:relative;z-index:1;定位元素z-index值为正 </div>m5[)f4J5{Xt#}
   <div id="box-p-za">这个box position:absolute;z-index:auto;定位元素z-index值auto</div>U.I*n z+q0i9Dl:X [7d]
   <div id="box-inline">这个box inline;<br />inline元素</div>sX$D3O]y"s
   <div id="box-float">这个box float;T9zNa(Ljc%o
                                <br /><br /><br /><br /><br /><br />未定位的浮动元素</div>S%@/s5Jq,_Q
   <div id="box-block">----这个box block;未定位的块级元素</div>
8R"xB8B b y%Y    <div id="box-p-zn">这个box z-index:-1;定位元素z-index值为负</div>;E n,]"Kiy!c
   <!-vF.H0?0@p
  调试之用.N4_(E4qx.S
   -->
WLGlPZ!H </div> s mj)Xv$[8B$d^D
</body>
J EF9}1N` vf6m </html> [/code][attach]234862[/attach]

yess 发表于 2008-7-22 12:18

[b]测试页面[/b]:
V/B9OH1[ [url=http://rong179.blogbus.com/files/12163574750.html][color=#0000ff]http://rong179.blogbus.com/files/12163574750.html[/color][/url](请分别在FF3.0和FF2.0中打开)
A*sqo3Ya K1X"l+l
.Y z5B-AzAQ nm2wv#qX [b]代码说明[/b]:AFV?%f y

\R"c;MX*C#w 由前所述,如果元素的stack level同级则后来居上;元素的stack level高,这无论代码在文档中位置如何都显示在上面,即使代码在最前面;如果元素的stack level低,无论代码位置如何都将显示在下面,即使代码在最后面。/B*U*lN wb]
我们就根据这一点,以“3.文本流中非定位的、block块级子元素”和“4.文本流中非定位的、float浮动子元素”为例,如果我把“float元素” 的代码写在“block元素”的前面,且实际显示为:“float元素”在“block元素”之上。即可证明:"float元素”的stack level级别较“block元素”高。因为如果同级,或者“block元素”的stack level高都应是“block元素”显示在上。
%]D7|'X;g ]0MAii? 根据以上,根据标准中的顺序,把stack level高的元素代码写在前面,stack level低的代码写在后面,如果显示结果是:代码在前面的元素显示在上方 ,即证明上面的stack level规则。
\q"k;p7J Bw#j$\0I [b]测试结果[/b]:
uDa4C b'] ss 在FF3.0中结果和标准顺序一致。FF2.0中“z-index值为负值的定位元素”在父级stacking context的背景下面。(注意ff2.0的这个特殊性)
!S_K){V w\;L(? [code]
*Xgq/gbiv9U{ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
c9j ~d MW-{ <html xmlns="http://www.w3.org/1999/xhtml">
;kw0v1[,DgN1B <head>#F$E6Q5iI
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
zdj[c(L"O2O <meta name="Keywords" content="z-index,IE,Firefox,stacking context,stack level" />yO+Sh `\\mL0W
<meta http-equiv="Description" content="这是一个在IE中测试层叠级别(stack level)的页面" /> It CX?._Z0P PP
<meta content="all" name="robots" />
e KR#Xc9qy1G,V~G <meta name="author" content="rong179,rong179@yahoo.cn" />.aSh'o;V [
<meta name="copyright" content="http://rong179.blogbus.com" />
C GS6P{ d}P'q <title>stack level 在IE中的测试</title>
%N7^ ~?g'M4@ Nx <style type="text/css" media="all">K"N#?)y;D%\7FJ
#container {position:relative;z-index:0;background: purple;width:400px;}aa4A3RS
#container div {height:200px;width:200px;}
\2T!K x$Mjb%G #box-p-zn { position:relative;z-index:-1;background-color:yellow; top:-95px;left:55px;}
4[ U]+P@ A #box-block {background-color: aliceblue;margin-top:-170px;margin-left:30px;}
|6P3Yh-F { #box-float {float:left;margin:-50px 0px 0 35px;background-color: red;}.X0P:H!g?$G{9};N
#box-inline {background-color: gray;display:inline;padding:50px 0;margin-left:-10px;}
g;GOF~\4i:h(x3W #box-p-za { position: absolute; top:50px;left:50px; background-color: green;}&]JVo)t:P
#box-p-zp { position: relative;background-color: greenyellow;z-index:1;}$R$d7e s U,U fg4j
</style>9K4x2]M)s m
</head>
F ?le:I;`/p8e/} <body>
%p*O,l3Z&CB8v <div id="container">
IL&i,p7\JL;l     <div id="box-p-zp">这个box position:relative;z-index:1; </div>O*d0l2i3e9E
    <div id="box-p-za">这个box position:absolute;z-index:auto;</div>   2c0@%i#Z$` p ChU&g
    <div id="box-float">这个box float</div>
.S SZw8a"c` P     <div id="box-block"><br /><br /><br /><br />这个box block</div>
$w9x0u(]_W+N     <!--请交换上面两个元素的顺序,再试试 -->$n4Ep-W-F }R
    <div id="box-inline">这个box inline;</div>4P8F!t'PO`Z%O
    <div id="box-p-zn"><br /><br /><br /><br /><br />这个box z-index:-1;</div>
d.j-O'JwbYz?    <!--6W6c DBa~ aj
   调试之用           
/yAkST:y"Mn    -->
[]?N k*t.M"j.bXc m </div>uQB1A7D3`b
</body>
"d I7I%Pce&U }`d </html>
9P i xX6~"CP*G [/code]*E6nJ6t8mI5a Qy
[b]测试页面[/b]:
zG R'G(z'U [url=http://rong179.blogbus.com/files/12163574751.html][color=#0000ff]http://rong179.blogbus.com/files/12163574751.html[/color][/url](请在IE下浏览)\ j0E%_k

JdEYC{.e _f3u [b]代码说明[/b]:-nm3E*wZ? p3[F+b
]OK7d2[
此代码也是根据上面的测试思想,但由于inline元素在ie中的特殊性,把inline的代码写在了后面,事实证明结论是正确的。对于“block元素”和“float元素”顺序大家可以交换顺序测试。g_yBX/U;Yke[
[b]测试结论[/b]:(k&MCT V X
[5N~,a$wMT!~
IE下(无论ie6.0或者ie7.0)“float元素”和“block元素”属同一stack level,而“inline元素”较其stack level低。
;h"TKNEsc [b]解释[/b]:(Q0OSz*f3r|g$RM8\

*_mD-i%iC%p “float元素”,“z-index:auto的定位元素”仿佛产生了新的stacking context,但其真正能产生新的stacking context的后代任按其父级stacking context定位。(但IE中“z-index:auto的定位元素”
$Z3\@6q&? 会拥有z-index值0,产生一个新的stacking context,并影响其子元素定位。这是IE一个BUG)'@G h/Y!Y p4D
inline元素在FF中仿佛能产生新的stacking context,而在IE中则不能。
U_0F8d/om'Y
MA8_$t&|s 至此stack level规则内容已经完毕,现在应该能理解stack level和z-index的不同。stack level来决定这一个stacking context中各元素在z轴上的显示顺序,对于同一stack level的定位元素才由z-index进一步决定显示次序。

yess 发表于 2008-7-22 12:21

:03: [code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
n,R/?5\ e <html xmlns="http://www.w3.org/1999/xhtml">
$w%bj6MaSuF t <head>
k.lH*AxAL <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />{^-{l4Ek
<meta name="Keywords" content="z-index,IE,迷惑" />
8k@1g{f z <meta http-equiv="Description" content="这是一个z-index在IE中的迷惑的演示" />
JUuZ3|C7Yw <meta content="all" name="robots" />
M o"{9kb3A <meta name="author" content="blank,怿飞" />+vJOlf'`)G
<meta name="copyright" content="http://www.planabc.net" />-Vzf/b*|
<title>z-index在IE中的迷惑</title>
F T+b\k,Nmt <style type="text/css" media="all">
3?E"K!F A0{)Z #box1 { position: absolute; top: 100px; left: 210px; width: 200px; height: 200px; background-color: yellow; z-index: -10; }
/l0z/AB2ug)Z </style>
R7Ri!fE]#?*w3t L </head>9H(`2m"o#Oq
<body>
&nD?6wX <div id="box1">为什么负值的定位元素在IE和FF下显示不一致呢?Why?</div>u _H r#S
</body>#iGgl\
</html> [/code]
x \{)|3d)zv [b]演示地址[/b]:
QY]FfM [url=http://rong179.blogbus.com/files/12163573190.html][color=#0000ff]http://rong179.blogbus.com/files/12163573190.html[/color][/url]
7Yw#b\o F)i{S
0X6W3nV9l8c1O 认为:,s8SJ ~q1V
IUl](c2o-I
[code]解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。[/code]
(U4|"c Q;\V6L;@
y+Y w#[8B5V d#Mi 真是这样吗?RRf M S
[code] L&`'T.Jb,O,R
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
d'mx2M9c'oS <html xmlns="http://www.w3.org/1999/xhtml">r;V-kh&PR,["S
<head>
pS"Tk3l? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />$Y;EP2\:g
<meta name="Keywords" content="z-index,IE,Firefox,stacking context,stack level" />1P.T A+xx:BM
<meta http-equiv="Description" content="这是一个在IE中测试层叠级别(stack level)的页面" />c2QrS4V Eo
<meta content="all" name="robots" />dd^2w5k6ZX`
<meta name="author" content="rong179,rong179@yahoo.cn" />
/T D2f F~P <meta name="copyright" content="http://rong179.blogbus.com" />Q i+K4W%|;{@
<title>body 是否默认有position属性</title>
k{)]-c G z%Gy-w5d*`w <head>
4B [wh*\2~ N <style>Q&d:?%g;x
*{
} `$si|#B*Q:`5[ margin:0; z$pN2q*M.Ou*M
}sDx |(Z#M:JBm9{.nI/oF
html{
f.wu5p3QGm? background:silver;
uu%d.M6y7B^%l5~ D-A }YJY [8vi;x
body{
Zq qz1lrw height:200px;R-x4x ZRO
width:200px;
!J M7PDwfx|e background:green;+J!E.s1?4_:R CP
text-align:right;
.D"a1e(MT)?UVU@7N /*ie中position:relative;加上这条试试*/
I;v G mw:[ V:]g /*ff中opacity:0.99;加上这条试试*/b)n*\XGBeg-c
}wflz~$FE N
div{
S|nZ#@6S,N7Z},` kl position:absolute;
vgj9_;y left:100px;
u&{sL9q`*KT4|2Bj7I top:100px;
?*Q;]9v4Qd#J width:200px;Q-Y Oh,X?wYl
height:200px;
jd1P0[akM background:yellow;
g Xehl5w z-index:-1;1Tc"G]5{
}
,p P5J)E'x7m z HB </style>
S*_"|+mP? </head>
4A4u_6V[[ w%@ <body>
2z3w ^t5?g(B4p   BODY:<br />z-Index:0q4p G,{4T5xL%A?~9\
  <div>DIV:<br />z-Index:-1</div>
k1MP E4S,b&[ \ </body>%E F;wE;R,`;DOuM
</html>a^cu3Uy
[/code]
@!X&`9h3[ [b]演示地址[/b]:
2}8e n)sh [url=http://rong179.blogbus.com/files/12163572440.html][color=#0000ff]http://rong179.blogbus.com/files/12163572440.html[/color][/url]
2C3G6GA*VmU.ZskI R k ry c }2g
[b]分析[/b]
"D$t4~E.V$d:B box1显示在body的下方,根据上面的stack level规则,IE中,如果body默认了一个位置属性,即body是其父级stacking context,box1应显示在其上方,事实却不是这样。而且当我们给body加上position:relative以后,显示效果和stack level规则一致。所以body并没有默认位置属性。
D/{mFL.j(| [b]那为什么负值的定位元素在IE和FF下显示不一致呢?[/b]
tvE;^E ie 中根据stack level规则: z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)高,显示在其上方。故box1在ie中能显示。ff3.0和标准一致,也能显示。大家可以试一下。
~}-C2bA0J ff2.0 中由于那条特殊的stack level,即 z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)低,所以显示在root stacking context下方。故不能看见。
;d@!G1f2}0w 另外,上面的代码中加上opacity那条后,在ff2.0中即可显示了。这又是什么原因呢?
m YfuJm-tD:\ [b]推测:在火狐中如果给元素设置opacity属性(1除外),即会产生新的stacking context。[/b]
`*u!w0]$t ^*OA-` 上面加上opacity属性后在ff2.0中可显示box1在body下,ff3.0box1在body上,(可以根据上面的stack level规则自己分析)符合推测。
Us:I3UC 在w3c的说明中也证明这点
:KC0P2e1m#y3`7W [code]
yA`W_;n In future levels of CSS, other properties may
y(UF.O _'y6RJqR     introduce stacking contexts, for example 'opacity'mNGA0l-Y/s
    [CSS3COLOR]. *a R|)r&CZ
[/code]
t M;}FOo*X [b]总结[/b]:oS#i6X+ay"v
在一个stacking context中元素的z-轴显示顺序,由元素所处的 [url=http://rong179.blogbus.com/logs/24966909.html#stacklevel][color=#0000ff]stack level[/color][/url] 决定。对于同一stack level的定位元素由z-index的大小进一步决定显示次序。
v(p)M3vS5lh'C [;IH:O [list][*]ie中给元素设置position属性(static除外)可产生新的stacking context[*]ff中给元素设置opacity属性(1除外)可产生新的stacking context[/list]除此之外(也许设置其他属性也会产生新的stacking context,但还不知道)只有定位元素设置了z-index(auto除外)才会产生新的stacking context,子元素将按照新的stacking context,定位。

艾静 发表于 2008-7-22 12:28

*** 作者被禁止或删除 内容自动屏蔽 ***

冯云 发表于 2008-7-22 12:28

*** 作者被禁止或删除 内容自动屏蔽 ***

页: [1]

Powered by 草根站长网 © 2007-2008