IE中列表中的z-index相对/绝对定位错误

13

我有以下导航,其中 .topNav 为相对定位,子导航 subnav 为绝对定位。由于 z-index 问题,我无法使子列表出现在主列表上方。这似乎是一个已知的问题。

<ul>
<li class="topNav">About Us
<ul class="subNav"><li> Subsection A</li><li>Subsection B</li></ul>
</li>
</ul>

有人知道解决方法吗?


更新:http://brh.numbera.com/experiments/ie7_tests/zindex.html 显示了我遇到的确切问题。我的原始帖子是在列表的上下文中,但我已将问题简化为,当一个具有position:absolute的元素在一个具有position:relative的父元素内时,z-index似乎不起作用。



我已经剥离了样式中除定位之外的所有内容,因为我已经证明这是问题所在。 - AJM
如果您有CSS代码,或者它已经上传到我们可以查看的地方,我们可能能够提供帮助。但现在我们不知道您对标记所做的任何更改,因此它可能是任何东西... - jonsidnell
我尝试复制这个问题,但由于你想要做什么不同,所有浏览器中的效果也不同。你的意图是什么,这些元素是否总是显示? - Quintin Robinson
http://brh.numbera.com/experiments/ie7_tests/zindex.html 显示了我遇到的问题。我的原始帖子是在列表的上下文中,但我已经将问题简化为当一个具有position:absolute属性的元素位于具有position:relative属性的父元素内时,z-index似乎无法正常工作。 - AJM
AJM,实际上,当您有两个兄弟元素,它们都具有position:relative和相同的z-index值时,问题就会出现。此外,第一个元素包含一个具有position:absolute的子元素;如果您可以发布更多代码,我可以尝试修复它,除非存在上述情况。 - Ionuț G. Stan
显示剩余2条评论
8个回答

17

这是一篇非常好的文章,解释了machineghost提到的堆叠问题。

http://css-discuss.incutio.com/wiki/Overlapping_And_ZIndex

根据你需要在多个元素上进行定位的原因,你可能想考虑添加悬停选择器到 .base(对于IE6使用JavaScript),并添加一个类来实现相对定位。

.base:hover{position:relative;}

这意味着第二个 .base 没有 position: relative 属性。


很棒的文章,我之前以为我懂得 z-index 等等,但现在我真正理解了,并且已经解决了问题。 - AJM
2
我知道这是一篇旧帖子 - 但AJM你介意分享你的解决方案吗?因为我似乎找不到适当的修复方法来解决Ben网站上的.base css测试,同时保持两个.base div作为position:relative。 - TeckniX
太棒了,精彩的文章!谢谢分享。 - Dogoku
不错的技巧,在:hover上应用相对定位,解决了我的IE7问题!谢谢 :) - Adam

1

添加

background: url(blank.gif); 

对于绝对定位的元素,这个方法解决了我的问题。也许它能帮到你 :)

祝好


1

好的,我认为你的问题可能源于对z-index如何工作的理解不足。z-index属性仅适用于DOM层次结构中相同级别的元素。换句话说,如果你有:

<ul id="a">
  <li id="b">b</li>
  <li id="c">c</li>
</ul>
<div id="d"></div> 

如果 "b" 和 "c" 重叠,z-index 将决定哪一个在顶部。但是,如果 "c" 和 "d" 重叠,无论 c 的 z-index 是什么,"d" 总是在顶部,因为靠近根 DOM 节点的元素总是出现在嵌套更深的元素上方。

因此,只要 "subnNav" 是 "topNav" 的子级,我认为没有办法使它覆盖其父级内容。换句话说,据我所知,除了使 "subNav" 不成为 "topNav" 的子级之外,没有解决此问题的方法。

(注意:尽管 CSS 并不简单,但仍然可能有一些我不知道的方法可以实现您想要的效果。我只能说,基于我的 z-index 理解和相当不错的 CSS 知识,我不知道任何方法。)


2
我已经从事Web开发15年了,我从未听说过z-index仅适用于DOM层次结构中相同级别的元素。您能引用一份说明此事的来源或规范吗?我非常好奇。 - Jake Wilson
我不能...或者更准确地说,我在谷歌上花了一分钟,变懒了,放弃了 :-) 然而,我可以举一个“证明”这个的例子。在下面的代码中,如果你删除z-index属性,你会看到一个绿色的框在左上角,因为a/b/c都有相同的z-index(而c是绿色的,最后出现)。然而,加上z-index后,你会看到...一个绿色的框...即使b(黄色)比c具有更高的z-index;c仍然“胜过”b,因为它在DOM树中更高。 - machineghost
<style> #a, #b, #c {position:absolute; left:0;top:0; width:100px; height:100px;} #a {background-color: red; z-index:1} #b {background-color: yellow; z-index:3} #c {background-color: green; z-index:2} </style> <div id="a"><div id="b"></div></div> <div id="c"></div> - machineghost

1

我曾经遇到过同样的问题,并且在IE6和7中成功解决了它。通过结合http://code.google.com/p/ie7-js/和以下CSS,问题得以解决。我的问题是列表中有一些项向左浮动,并且当用户悬停在li上时会弹出工具提示。为了解决这个问题,我添加了以下代码:

.ul li:hover {position:relative;z-index:4;} .ul li:hover + li {position:relative;z-index:3;}

它的工作原理是每当用户悬停在第一个LI上时,它将第二个LI浮动到它旁边并设置为较低的z-index值。当然,您可以根据自己的需要更改z-index值。


1

0
与@Orhaan的答案类似,将背景属性设置为绝对元素是我唯一的解决方案...
background-color: rgba(0,0,0,0);

谢谢Alex Leonoard


0
解决方案:按照递减顺序分配 z-index。
<div class="base" style="z-index:2">
<div class="inside">
    This has some more text in it. This also has a background. This should obscure the second block of text since it has a higher z-index.
</div>
This has some text in it. This has some text in it. This has some text in it. This has some text in it. This has some text in it.
</div>

<div class="base" style="z-index:1">
This is the second div. You should not be seeing this in front of the grey box. This has some text in it. This has some text in it. This has some text in it. This has some text in it. This has some text in it. This second box should be obscured by the grey box.
</div>

这适用于div,但op正在询问如何为列表设置样式。我目前也遇到了同样的问题。 - PeerBr
以上解决方案在IE7中不起作用,即使使用与http://brh.numbera.com/experiments/ie7_tests/zindex.html上相同的CSS样式表。 - TeckniX

0

CSSplay的Stu Nicholls拥有一个带有6级下拉菜单的基于CSS的导航(如果需要可以扩展到更多级别)。这在Internet Explorer IE5.5、IE6、IE7、Firefox、Opera以及现在的Safari、Netscape 8和Mozilla中都可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接