元素積層レベル(stack level)及びz-inndex分析[勉強したい]
http://www.kuqin.com/webpagedesign/20080829/15536.html
宣言
位置決め要素:position属性値は、デフォルト値static以外の要素を設定し、relative、absolute、fixedを含む.
プラットフォーム:win/IE win/FF
z-indx:
ディスプレイの方向(以下、Z軸という)に垂直な位置合わせ要素の積層順を決定します.
値: aut𞓜整数|inheit
デフォルト: aut
適用先: 元素の位置付け
継承性: no
stacking contextを理解する
各boxは一つのstacking contextに属しています.これは元素がz軸方向に位置するための参考です.ルート要素はroot stacking contextを形成し、その他のstacking contextは位置決め要素によってz-inndexを設定する時に発生します.例えば、癜div 1{position:relative;z-indx:0}はid=div 1の要素にstacking contextを発生させることができます.stacking contextとcontaining blockは必然的に連絡していません.
理解stack level
一つのstacking contextの中の各ボックスには、同じstacking contextの中で、各ボックスのz軸における表示順序が決定されています.同じstacking contextの中で、stack level値が大きいのは上に表示されて、stack level値が小さいのは下に表示されて、同じstack levelのは後から上に来る原則に従います.異なるstacking contextでは、要素表示順序は父親レベルのstacking contextのstack levelで表示の前後を決定します.自分のスタンクレベルには関係ありません.stack levelとz-indxは統一概念ではないので注意してください.(後の文でゆっくりと理解します)
stack levelルール
各stacking contextにはブロックレベル、インライン要素、float属性を設定する要素、ポジショニング要素などが含まれますが、彼らは同じ父親レベルのstacking contextにおける表示順序はどうなりますか?つまり、スタックレベルはどうなりますか?例えば、ブロックレベルの元素とインライン要素が重なったら、誰が上にいますか?誰が後ろにいますか?誰が上にいますか?
w 3 cのstack levelについての紹介により、以下のstack levelルールが得られます.
各stacking contextは以下のstack levelを含む:
1.父親レベルのstacking contextの背景、境界
2.z-inndex値がマイナスの位置付け要素(値が小さいほど下)
3.テキストフローにおける非局在、ブロックレベルのサブ要素
4.テキストフローにおける非局在、floatフロートのサブ要素
5.stacking contextのinline要素が生まれるようです.
さもなくば、inline要素のstack levelはblock要素の前にあります.
6.z-inndex:aut/0の位置決め要素
7.z-inndex値が正の位置決め要素(値が大きいほど上)
以上のstack levelはブラウザで実行されます.
firefox 3.0でのテストは完全に一致しています.firefox 2.0ではちょっと違っています.つまり、「z-indx値がマイナスの位置付け要素」は「親レベルstacking contextの背景、境界」の前にあります.
i 6.0と7.0において、inline要素のstack levelはblock要素の前に位置し、かつ「テキストフローにおける非局在化、floatフロートサブ要素」(以下、フロート要素という)と「テキストフローにおける非局在化、ブロックレベルサブ要素」(以下、ブロック要素という)は同じレベルにある.
テスト:
FF下テスト:
http://rong179.blogbus.com/files/12163574750.html(それぞれFF 3.0とFF 2.0で開けてください.)
コードの説明:
前に述べたように、要素のstack levelが同じであれば上に立つ.このコードはドキュメント内の位置に関係なく上に表示されます.コードが一番前にあっても.要素のレベルが低い場合、コードの位置に関係なく、下に表示されます.コードが一番後ろにあっても.
私たちはこの点に基づいて、「3.テキストフローの非局在化、ブロックレベルのサブ要素」と「4.テキストフローの非局在化、floatフロートのサブ要素」を例にとって、「float要素」のコードを「block要素」の前に書いたら、実際に「float要素」が「block要素」の上にあると表示されます.「float元素」のstack levelレベルが「block元素」より高いことを証明できます.同級の場合、または「block元素」のstack level高さはいずれも「block元素」で表示されます.
以上より、標準中の手順に従って、スタックレベルの高い要素コードを前に書いて、スタックレベルの低いコードを後ろに書いてください.もし表示結果が表示されたら、コードは前の要素で上に表示されます.つまり、上のstack levelルールを証明します.
テスト結果:
FF 3.0では結果と標準順序が一致しています.FF 2.0では「Z-indx値がマイナスの位置付け要素」は親レベルstacking contextの背景の下にあります.
IEでのテスト:
http://rong179.blogbus.com/files/12163574751.html
コードの説明:
このコードも上のテスト思想に基づいていますが、inline要素のie中の特殊性から、inlineのコードを後に書いて、事実が結論を証明するのは正しいです.「block元素」と「float元素」の順番については交換してテストできます.
テストの結論:
IE下(ie 6.0またはie 7.0にかかわらず)「float要素」と「block要素」は同じstack levelに属し、「inline要素」はそのstack levelより低い.
説明:
float元素、i-inndex:autの位置付け要素は新しいstacking contextが発生したようですが、本当に新しいstacking contextを生むことができます.親レベルstacking contextで位置を決めます.
z-inndex値0を持ち、新しいstacking contextを生み出し、そのサブ要素の位置付けに影響を与える.これはIEのBUGである.
inlineの要素はFFの中で新しいstacking contextを生むことができますが、IEの中ではできません.
これでstack levelルールの内容はもう終わりました.stack levelとz-inndexの違いは理解できるはずです.stack levelはこのstacking contextの中の各元素のz軸における表示順序を決定します.同じstack levelの位置付け要素についてはz-indxによってさらに表示順序を決定します.
いくつかの問題の解釈:
怿飛が『z-index IEにおける迷い』の中で最後に言及した問題:
http://rong179.blogbus.com/files/12163573190.html
考える:
解惑:IEブラウザは、body要素に相対位置属性をデフォルトにしたようです.
本当ですか
http://rong179.blogbus.com/files/12163572440.html
分析:
body 1はbodyの下に表示されています.上のstack levelルールにより、IEで位置属性をデフォルトにした場合、bodyは父レベルstacking contextで、body 1はその上に表示すべきですが、事実はそうではありません.また、bodyにposition:relativeを加えた後、表示効果はstack velルールと一致します.だから、body 1はデフォルトの属性がありません.
なぜ負の値の位置付け要素はIEとFFで一致しないと表示されますか?
ieでは、stack levelの規則により、z-indxは負の位置決め要素のstack levelは、父レベルのstacking contextより高く、その上に表示されます.だから、box 1はieに表示されます.
F 2.0では、その特殊なstack level、つまりz-indxが負の位置付け要素であるstack levelは、父レベルstacking contextより低いので、root stacking contextの下に表示されます.したがって、見ることができません.
また、上のコードにopacityを加えると、F 2.0に表示されます.これはどういう理由ですか?
火狐にopacity属性(1を除く)を設定すると新しいstacking contextが発生します.
上にopacity属性を追加したら、F 2.0にbody 1がbodyの下で表示されます.ff3.0 box 1はbodyの上にあります.
w 3 cの説明でもこれを証明しています.
In future levels of CSS,other properties may
introdce stacking contexts,for example'opacity'
[CSS 3 COLOR]
まとめ:
一つのstacking contextにおける要素のz軸表示順序は、要素が位置するstack levelによって決定され、同じstack levelの位置付け要素についてはz-indxの大きさによってさらに表示順序が決定される.
ieで要素にposition属性を設定します.(staticを除く)新しいstacking contextを生成できます.
ffで要素にopacity属性を設定する(1を除く)ことで、新たなstacking contextが生成されます.
その他の属性を設定すると新しいstacking contextが発生するかもしれませんが、まだ分かりません.位置付け要素のみがZ-inndex(autを除く)を設置しているため、新しいstacking contextが発生します.サブ要素は新しいstacking contextによって、位置付けされます.
宣言
位置決め要素:position属性値は、デフォルト値static以外の要素を設定し、relative、absolute、fixedを含む.
プラットフォーム:win/IE win/FF
z-indx:
ディスプレイの方向(以下、Z軸という)に垂直な位置合わせ要素の積層順を決定します.
値: aut𞓜整数|inheit
デフォルト: aut
適用先: 元素の位置付け
継承性: no
stacking contextを理解する
各boxは一つのstacking contextに属しています.これは元素がz軸方向に位置するための参考です.ルート要素はroot stacking contextを形成し、その他のstacking contextは位置決め要素によってz-inndexを設定する時に発生します.例えば、癜div 1{position:relative;z-indx:0}はid=div 1の要素にstacking contextを発生させることができます.stacking contextとcontaining blockは必然的に連絡していません.
理解stack level
一つのstacking contextの中の各ボックスには、同じstacking contextの中で、各ボックスのz軸における表示順序が決定されています.同じstacking contextの中で、stack level値が大きいのは上に表示されて、stack level値が小さいのは下に表示されて、同じstack levelのは後から上に来る原則に従います.異なるstacking contextでは、要素表示順序は父親レベルのstacking contextのstack levelで表示の前後を決定します.自分のスタンクレベルには関係ありません.stack levelとz-indxは統一概念ではないので注意してください.(後の文でゆっくりと理解します)
stack levelルール
各stacking contextにはブロックレベル、インライン要素、float属性を設定する要素、ポジショニング要素などが含まれますが、彼らは同じ父親レベルのstacking contextにおける表示順序はどうなりますか?つまり、スタックレベルはどうなりますか?例えば、ブロックレベルの元素とインライン要素が重なったら、誰が上にいますか?誰が後ろにいますか?誰が上にいますか?
w 3 cのstack levelについての紹介により、以下のstack levelルールが得られます.
各stacking contextは以下のstack levelを含む:
1.父親レベルのstacking contextの背景、境界
2.z-inndex値がマイナスの位置付け要素(値が小さいほど下)
3.テキストフローにおける非局在、ブロックレベルのサブ要素
4.テキストフローにおける非局在、floatフロートのサブ要素
5.stacking contextのinline要素が生まれるようです.
さもなくば、inline要素のstack levelはblock要素の前にあります.
6.z-inndex:aut/0の位置決め要素
7.z-inndex値が正の位置決め要素(値が大きいほど上)
以上のstack levelはブラウザで実行されます.
firefox 3.0でのテストは完全に一致しています.firefox 2.0ではちょっと違っています.つまり、「z-indx値がマイナスの位置付け要素」は「親レベルstacking contextの背景、境界」の前にあります.
i 6.0と7.0において、inline要素のstack levelはblock要素の前に位置し、かつ「テキストフローにおける非局在化、floatフロートサブ要素」(以下、フロート要素という)と「テキストフローにおける非局在化、ブロックレベルサブ要素」(以下、ブロック要素という)は同じレベルにある.
テスト:
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,[email protected]" />
<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(それぞれFF 3.0とFF 2.0で開けてください.)
コードの説明:
前に述べたように、要素のstack levelが同じであれば上に立つ.このコードはドキュメント内の位置に関係なく上に表示されます.コードが一番前にあっても.要素のレベルが低い場合、コードの位置に関係なく、下に表示されます.コードが一番後ろにあっても.
私たちはこの点に基づいて、「3.テキストフローの非局在化、ブロックレベルのサブ要素」と「4.テキストフローの非局在化、floatフロートのサブ要素」を例にとって、「float要素」のコードを「block要素」の前に書いたら、実際に「float要素」が「block要素」の上にあると表示されます.「float元素」のstack levelレベルが「block元素」より高いことを証明できます.同級の場合、または「block元素」のstack level高さはいずれも「block元素」で表示されます.
以上より、標準中の手順に従って、スタックレベルの高い要素コードを前に書いて、スタックレベルの低いコードを後ろに書いてください.もし表示結果が表示されたら、コードは前の要素で上に表示されます.つまり、上のstack levelルールを証明します.
テスト結果:
FF 3.0では結果と標準順序が一致しています.FF 2.0では「Z-indx値がマイナスの位置付け要素」は親レベルstacking contextの背景の下にあります.
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,[email protected]" />
<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下(ie 6.0またはie 7.0にかかわらず)「float要素」と「block要素」は同じstack levelに属し、「inline要素」はそのstack levelより低い.
説明:
float元素、i-inndex:autの位置付け要素は新しいstacking contextが発生したようですが、本当に新しいstacking contextを生むことができます.親レベルstacking contextで位置を決めます.
z-inndex値0を持ち、新しいstacking contextを生み出し、そのサブ要素の位置付けに影響を与える.これはIEのBUGである.
inlineの要素はFFの中で新しいstacking contextを生むことができますが、IEの中ではできません.
これでstack levelルールの内容はもう終わりました.stack levelとz-inndexの違いは理解できるはずです.stack levelはこのstacking contextの中の各元素のz軸における表示順序を決定します.同じstack levelの位置付け要素についてはz-indxによってさらに表示順序を決定します.
いくつかの問題の解釈:
怿飛が『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要素に相対位置属性をデフォルトにしたようです.
本当ですか
<!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
分析:
body 1はbodyの下に表示されています.上のstack levelルールにより、IEで位置属性をデフォルトにした場合、bodyは父レベルstacking contextで、body 1はその上に表示すべきですが、事実はそうではありません.また、bodyにposition:relativeを加えた後、表示効果はstack velルールと一致します.だから、body 1はデフォルトの属性がありません.
なぜ負の値の位置付け要素はIEとFFで一致しないと表示されますか?
ieでは、stack levelの規則により、z-indxは負の位置決め要素のstack levelは、父レベルのstacking contextより高く、その上に表示されます.だから、box 1はieに表示されます.
F 2.0では、その特殊なstack level、つまりz-indxが負の位置付け要素であるstack levelは、父レベルstacking contextより低いので、root stacking contextの下に表示されます.したがって、見ることができません.
また、上のコードにopacityを加えると、F 2.0に表示されます.これはどういう理由ですか?
火狐にopacity属性(1を除く)を設定すると新しいstacking contextが発生します.
上にopacity属性を追加したら、F 2.0にbody 1がbodyの下で表示されます.ff3.0 box 1はbodyの上にあります.
w 3 cの説明でもこれを証明しています.
In future levels of CSS,other properties may
introdce stacking contexts,for example'opacity'
[CSS 3 COLOR]
まとめ:
一つのstacking contextにおける要素のz軸表示順序は、要素が位置するstack levelによって決定され、同じstack levelの位置付け要素についてはz-indxの大きさによってさらに表示順序が決定される.
ieで要素にposition属性を設定します.(staticを除く)新しいstacking contextを生成できます.
ffで要素にopacity属性を設定する(1を除く)ことで、新たなstacking contextが生成されます.
その他の属性を設定すると新しいstacking contextが発生するかもしれませんが、まだ分かりません.位置付け要素のみがZ-inndex(autを除く)を設置しているため、新しいstacking contextが発生します.サブ要素は新しいstacking contextによって、位置付けされます.