问题 如何计算HTML元素的有效z-index


我想从代码中确定html页面上元素的z-index。我正在使用jQuery。

jQuery允许我使用$(element).css(“z-index”)检查应用的z-index。如果直接在该元素上没有设置z-index,则Firefox返回“auto”,IE返回“0”。然后,该节点的有效z-index取决于其容器的z-index。

我想我可以通过查看节点及其父节点来计算有效的z-index,直到找到z-index值。问题是,至少在IE上,我不能从一个继承其父级的z-index的元素中消除z索引为0的元素,就像在两种情况下一样.css(“z-index”)返回0关于如何计算元素的实际z-index的任何想法?

如果您想进行试验,可以使用此代码。在IE上它将输出“0”,“0”,“0”,“300”。在Firefox上,它将输出“auto”,“auto”,“0”,“300”。

<html>
<head>
    <script src="http://code.jquery.com/jquery-latest.js"></script>

</head>

<body>

<script type="text/javascript">
    alert($("<div></div>").css("z-index"));
    alert($("<div style='position:relative'></div>").css("z-index"));
    alert($("<div style='z-index:0'></div>").css("z-index"));
    alert($("<div style='z-index:100'></div>").css("z-index"));
</script>

</body>
</html>

8188
2018-01-07 22:22


起源

这在某些页面上会很棘手,因为您可以拥有多个堆叠索引。您是否想要弄明白这一点,以便您可以在其他东西之上堆叠一些东西? - scunliffe
类似的东西(隐藏堆积超出某些z-index限制的东西) - Frank Schwieterman


答案:


在IE上,我不能从一个将继承其父级的z-index的元素中消除z-index为0的元素的歧义

你正在寻找具有的元素 有效 z-index的。 z-index仅对带有a的元素有效 position 除了 static。因此,你应该查找父母,直到你找到一个 定位的 元素 z-index 非auto

(这将为您提供最里面的z-index。堆叠上下文可以嵌套,因此您可能希望通过查看要定位的最远祖先来查看最外层的z-index。)

在IE6-7上,没有a的元素 z-index 错误地接收自动 z-index 的 0。所以这确实会给你一个 0 当你看到没有a的定位元素时读取 z-index 在IE6-7中...这可能是错误的,但它反映了IE已经错误的渲染,无论如何你必须避免或解决。

(在IE8中,这最终得到修复,你确实会得到 auto 对于第一个警报,假设一个合适的doctype / EmulateIE设置将其发送到IE8本机模式。)


8
2018-01-07 22:44



很好的一点是,z-index应仅考虑定位元素(并且任何遍历以确定元素z-index应跳过非定位元素)。 - Frank Schwieterman
在继承z-index的情况下,IE将返回0的z索引。然而,IE将正确应用继承的z-index,因此IE6-IE7场景仍然是个问题。 - Frank Schwieterman
错误是IE6-7 不能 '继承'定位元素上的堆叠上下文。当你拿到时 0 如 z-index 在一个定位元素上,你可以确定0是IE实际上用于渲染元素的z-index - 即使它不应该符合CSS规范。 - bobince
嗯这对我来说是新闻。与我过去看过的事情相矛盾,我将不得不进行实验,以确保我遵循你所说的话。谢谢你的澄清。 - Frank Schwieterman
关于该问题的无休止报道的Google IE z-index错误。通常,如果要嵌套定位元素,最安全的做法是确保将z-index放在每个定位元素上。否则IE6-7很可能会出错。 - bobince


我看到了问题,但我不确定它真的很重要...因为零是页面的根z-index为0.在下面的代码中:

alert($("<div id='root' style='z-index:10'><div id='blah'></div><div>").get(0).style.zIndex);
alert($("<div id='root' style='z-index:10'><div id='blah'></div><div>").children('#blah').get(0).style.zIndex);

FF报告10和(不是'自动')。 IE报告10和0.对于IE,如果看到0,则向上移动一个级别。对于FF,如果看到空白,则向上移动一个级别。然后在任何一种情况下,如果你到达根,并且值是'auto'(在FF的条件下)那么我(猜测)你可以假设它是0.(也许这不是一个很好的假设!)


1
2018-01-07 22:46



“对于IE,如果你看到0,那么就提升一个级别。”此语句假定元素的z-index未显式设置为0。我想这不太可能,但出于这个原因,我之前已经将这种方法排除在外。也许它可能因为我正在看的内容是广告内容,一些广告提供商可能会做一些奇怪的事情,如果他们可以获得更多的可见性。 - Frank Schwieterman
是的,我明白了......但是我会质疑...... IE本身是否有区别?也就是说,它是否使用0作为标记来表示“未设置”?如果是这种情况,则设置0与完全不设置无异。我想你需要运行一些实际的渲染测试才能确定。 - Michael Bray


我认为这个功能可以在大多数情况下解决您的问题

function ustMaxZIndex(eleman) {
  var elm = $('#'+eleman);
  var zindex = parseInt(elm.css("z-index")) > 0 ? elm.css("z-index") : 0;
  while(true) {
    zindex = (parseInt(elm.css("z-index")) > 0 && parseInt(elm.css("z-index")) > zindex) ? elm.css("z-index") : zindex;
    if(elm.length > 0) {
      elm = elm.parent();
    } else {
      break;
    }
  }
  return zindex;
}

1
2017-09-15 13:39





优化版MC_delta_T的答案:

这不适用于嵌套的z索引,但它会在层次结构中找到最高值,它应该在大多数情况下工作:

function getEffectiveZIndex(elm) {
    var elementZIndex,
        style,
        zindex = 0;

    while(elm) {
        style = getComputedStyle(elm);

        if (style) {
            elementZIndex = parseInt(style.getPropertyValue('z-index'), 10);

            if (elementZIndex > zindex) {
                zindex = elementZIndex;
            }
        }

        elm = elm.parentNode;
    }

    return zindex;
}

0
2017-12-09 09:39