我感到困惑的是如何對CSS的z-index,溢出隱藏,位置固定的工作一起在Firefox 3.6中。考慮下面的例子:Firefox:溢出如何與z-index一起工作並且位置是固定的?
第一DIV.fix_z0
被固定位置與z索引0和溢出隱藏。裏面是DIV.abs_z1
絕對用z-index位置1.內被DIV.fix_z2
固定位置和z-index的2.我希望所有的.fix_z2
是可見的,即使它是.fix_z0
視區之外,因爲它是固定和有比底部DIV更高的Z指數。
在IE 8中,按預期工作,但在FF 3.6中,DIV.fix_z2
被限制爲.fix_z0
。兩個元素都是固定的,但其中一個嵌套在另一個內。 W3C規範指出應該將固定元素從文檔流中刪除,但嵌套時會發生什麼?此外,由於包含的元素.abs_z1
具有較高的z-index,這應該成立一個新的z-index背景下,一切都在.abs_z1
應高於.fix_z0
(使上.fix_z2
無關的z-index的,但我把它,看它是否製成的差異。)
的複雜因素是在z索引。如果我們取一個替代示例中,內部.fix_z0
DIV.abs_znone
一個與絕對位置和無z索引。這裏面,我們把DIV.fix_z1
固定位置和z索引1.現在DIV.fix_z1
不受.fix_z0
裁剪。在我看來,無論是應該削減或兩者都不應該削減。這是一個錯誤還是我誤解了CSS的規則?以下是重現的代碼。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Z-Index Woes</title>
<style type="text/css">
body {
background-color: black;
}
div.fix_z0 {
position: fixed;
left: 100px;
top: 100px;
bottom: 100px;
right: 100px;
background-color: #606060;
overflow: hidden;
z-index: 0;
}
div.abs_z1 {
position: absolute;
left: 50px;
top: 50px;
width: 200px;
height: 200px;
background-color: #550000;
z-index: 1;
}
div.fix_z2 {
position: fixed;
left: 50px;
top: 50px;
width: 150px;
height: 150px;
background-color: #888800;
z-index: 2;
}
div.abs_znone {
position: absolute;
right: 50px;
bottom: 50px;
width: 200px;
height: 200px;
background-color: #005500;
}
div.fix_z1 {
position: fixed;
right: 50px;
bottom: 50px;
width: 150px;
height: 150px;
background-color: #888800;
z-index: 1;
}
p {
position: absolute;
font-size: 12pt;
color: #EFEFEF;
margin: 0;
padding: 0;
}
p.center {
text-align: center;
width: 100%;
}
p.right {
right: 0;
}
p.bottom {
bottom: 0;
}
</style>
</head>
<body>
<div class="fix_z0">
<p class="center">pos: fixed, z:0, overflow: hidden</p>
<div class="abs_z1">
<p class="right">pos: abs, z:1</p>
<div class="fix_z2">
<p class="right bottom">pos: fix, z:2</p>
</div>
</div>
<div class="abs_znone">
<p>pos: abs, z: none</p>
<div class="fix_z1">
<p>pos: fix, z:1</p>
</div>
</div>
</div>
</body>
</html>
更新11/18/10: 這兩種看法似乎迄今表明,.fix_z2
和.fix_z1
應該由.fix_z0
被裁剪。這將使示例代碼中IE8 100%錯誤和FF 50%錯誤。
我認爲兩者的DIV不應被裁剪,因爲它們是固定的。 W3C建立固定定位爲絕對的子集和絕對定位的元素:
建立用於正常流動兒童和絕對新的包含塊(但不固定)定位後裔。 [W3C]
因此,我認爲既不.fix_z0
或.abs_z1
或.abs_znone
應該建立一個新的包含塊,通過該確定的內容被限幅。
W3C的Z-索引標準值是:
整數:此整數是在當前堆疊內容所生成的框的層疊級別。盒子還建立一個局部堆疊上下文,其中它的堆棧級爲「0」。
auto:當前堆棧上下文中生成的框的堆棧級別與其父級框相同。該框不會建立新的本地堆疊上下文。
http://www.w3.org/TR/CSS21/visuren。HTML#z-index的
我不明白爲什麼z-index的影響FF,但它具有以下作用:由於.abs_znone
沒有z-index的,它具有相同的堆疊內容作爲其父.fix_z0
和.fix_z1
將有一個Z指數相對於.fix_z0
的任何子女。結果是DIV.fix_z1
不被.fix_z0
截斷。相反,.abs_z1
建立了新的堆疊內容,因爲它有一個Z-index和.fix_z2
將有相關的z-index到.abs_z1
任何孩子,但出於某種原因,這導致.fix_z2
通過.fix_z0
底線被修剪:我仍在尋找一些答案。 IE或FF在這裏遵守標準嗎?什麼導致FF中的一個DIV發生削波而不是另一個?我目前的看法是,IE是正確的(對於一個變化),FF的行爲是錯誤的。
我同意你的邏輯,但如果這是真的,所以fix_z1也應該被修剪,因爲它是fix_z0的後代。相反,它不會被剪切。 – Jared 2010-11-17 21:20:31