确定 DOM 中每个元素的有效 z-index(垂直堆栈位置)?

Determine effective z-index (vertical stack position) of each element in the DOM?

我正在编写一个工具,该工具使用 javascript 来执行诸如将 HTML 文档转换为 SVG 之类的操作。

这需要知道哪些元素可以与其他元素重叠,从而了解整个文档的整体 z-index 堆叠顺序。

所以我想为源页面中的每个元素分配一个编号,这样如果我重新排列所有元素使其彼此重叠,该编号将反映它们在该堆栈中的位置,1 表示顶部(或底部) , 2 是下一个,依此类推

这当然受 z-index 值的影响,但与它们没有直接关系。

我知道有一种方法可以自己使用谨慎的 DOM 遍历和排序来完成,但这会很棘手。

是否有更简单的现有方法?

我可以使用任何必要的库,但了解如何在 vanillaJS 中使用会很有帮助。

谢谢!

编辑:当我考虑自己滚动时,绘画顺序的 CSS 条目位于 https://www.w3.org/TR/CSS21/zindex.html, with a healthy discussion at http://vanseodesign.com/css/css-stack-z-index/

嗯,老实说,这很难回答你说:

This is of course influenced by z-index values but is not directly related to them.

但是,如果我简单回答标题中的问题:

Determine effective z-index (vertical stack position) of each element in the DOM?

如果您知道元素的 ID(或名称),那么获取 zIndex 就相对容易,因为您可以通过以下方式获取任何 dom 元素的 z-index:

document.getElementById('someID').style.zIndex;

对于任何其他答案,您需要缩小您的要求。

未经检验的想法:

  1. 使用 CSS transform: translate() 样式按摩整个 DOM 树,直到 所有 可见元素以其边界框重叠的方式堆叠在特定点,例如在文档的左上角。
  2. 获取文档最顶层的元素document.elementFromPoint
  3. 使用 pointer-events:none; 设置元素样式,这会将它从元素检索中排除
  4. 转到 2

这应该会给你总排序。