如何找出文档中最高的 z-index?

IT技术 javascript html css z-index
2021-02-02 01:24:00

为了将包含透明文本图像的 div 设置为文档中最高的 z-index,我选择了数字 10,000,它解决了我的问题。

以前我用数字 3 猜过,但没有效果。

那么,是否有更科学的方法来确定哪个 z-index 高于所有其他元素的 z-index?

我尝试在 Firebug 中寻找这个指标,但没有找到。

6个回答

为了清楚起见,从 abcoder 站点窃取一些代码:

  var maxZ = Math.max.apply(null, 
    $.map($('body *'), function(e,n) {
      if ($(e).css('position') != 'static')
        return parseInt($(e).css('z-index')) || 1;
  }));
优雅但不可用,因为,来自 mdn of Math.max:“如果数组有太多元素,两者都会传播(...)并且apply要么失败要么返回错误的结果”
2021-03-17 01:24:00
^ 话虽如此,Math.maxChrome 上最多可以接受 100,000 个参数,Firefox 上最多可以接受 300,000 个参数,Edge 上最多可以接受 400,000 个参数,IE11 上最多可以接受 150,000 个参数(在 Win10 上测试,所有浏览器都是最新的)。
2021-03-20 01:24:00
这似乎是迄今为止我见过的最短、最有效的获取 z-index 的方法。
2021-04-05 01:24:00
我发现的唯一答案不限于特定元素类型的最大值。我希望我的 z-index 高于所有其他 z-index,这是一个宝石。
2021-04-13 01:24:00

您可以调用findHighestZIndex特定的元素类型,例如<div>

findHighestZIndex('div');

假设一个findHighestZindex定义如下函数:

function findHighestZIndex(elem)
{
  var elems = document.getElementsByTagName(elem);
  var highest = Number.MIN_SAFE_INTEGER || -(Math.pow(2, 53) - 1);
  for (var i = 0; i < elems.length; i++)
  {
    var zindex = Number.parseInt(
      document.defaultView.getComputedStyle(elems[i], null).getPropertyValue("z-index"),
      10
    );
    if (zindex > highest)
    {
      highest = zindex;
    }
  }
  return highest;
}
为什么要将其限制为一种元素类型?
2021-03-15 01:24:00
目前不能正常工作,因为最高被保存为字符串。相反,在您找到的 z-index 上调用 parseInt 之后设置 zindex(注意:这意味着您应该检查 !isNaN() 而不是 != 'auto')。
2021-03-17 01:24:00
这仅适用于所有 z-index 都低于 999 的情况。它正在比较字符串,因此它认为 999 > 1000。它还假设最高 z-index 高于零。最高值可能是负数。devmunchies.com/tutorial/finding-highest-z-index-on-page
2021-03-19 01:24:00
@ChristopherJamesCalo,这是一个通用的解决方案。如果您使用 '*' 作为 的参数findHighestZIndex,它将适用于所有元素。
2021-03-26 01:24:00
IE 缺少 getComputedStyle 的解决方法erik.eae.net/archives/2007/07/27/18.54.15
2021-03-29 01:24:00

使用 ES6 更简洁的方法

function maxZIndex() {

     return Array.from(document.querySelectorAll('body *'))
           .map(a => parseFloat(window.getComputedStyle(a).zIndex))
           .filter(a => !isNaN(a))
           .sort()
           .pop();
}
Sort 需要一个比较器才能正常工作。考虑一下:[2 ,1, 100].sort()给出[1, 100, 2]错误的结果改用比较器:[2 ,1, 100].sort((a,b) => a-b)这给出了正确的[1, 2, 100]
2021-03-20 01:24:00
虽然这并没有给我元素。那么如何获得 z-index 最高的元素呢?
2021-03-24 01:24:00
这个答案本身不起作用。添加.sort((a,b) => a-b)@AdamSzmyd 说让它工作。
2021-03-26 01:24:00
使用sort似乎有很多不必要的 CPU 和内存消耗
2021-04-07 01:24:00
Areduce只会遍历索引集一次O = n,而sortO = n log(n)因此,人们可以很容易地更换sortpop使用reduce
2021-04-07 01:24:00

我想添加我在我的用户脚本之一中使用的 ECMAScript 6 实现。我正在使用这个来定义z-index特定元素的 ,以便它们始终显示在最高位置。

在 JS 中,您还可以将某些属性或类名设置为您可能想要排除的元素。例如,考虑您的脚本data-highest在要显示为最高元素(例如弹出窗口)的元素上设置属性;并考虑具有yetHigher您无法控制的类名的元素,它应该更高(例如自定义上下文菜单)。我可以使用链式:not选择器排除这些元素请注意,这:not([data-highest], .yetHigher)是可能的,但处于实验阶段,并且截至 2021 年 1 月仅提供有限的浏览器支持。

let highestZIndex = 0;

// Then later, potentially repeatedly
highestZIndex = Math.max(
  highestZIndex,
  ...Array.from(document.querySelectorAll("body *:not([data-highest]):not(.yetHigher)"), (elem) => parseFloat(getComputedStyle(elem).zIndex))
    .filter((zIndex) => !isNaN(zIndex))
);

下面的五行可以多次运行并highestZIndex通过找出当前 highestZIndex值与所有其他元素的所有其他计算 z 索引之间的最大值来重复更新变量filter排除所有的"auto"值。

话虽如此,这可能会涵盖大多数现实情况,因为 Chrome 最多支持 100k 值、Firefox 300k、Edge 400k。
2021-03-17 01:24:00
根据 MDN 的说法,不能Math.max用来这样做:“如果数组元素过多,要么传播(...)apply要么失败或返回错误的结果 [...] 减少解决方案没有这个问题”
2021-04-05 01:24:00

在我看来,解决这个问题的最好方法是,z-index为不同类型的元素使用什么样的es来设置自己的约定然后,您将z-index通过回顾您的文档找到正确的使用方法。

虽然我同意这是一种最佳实践并且在大多数情况下都可以提供帮助,但如果您正在构建可能在未知页面上运行的插件或脚本,而您的脚本不了解所使用的 z-index 约定,则它无济于事。(很抱歉对您 9 年前的帖子发表评论。)
2021-03-17 01:24:00