【发布时间】:2021-10-16 07:35:38
【问题描述】:
我正在实现一组将像这样使用的自定义元素:
<om-root>
...
<om-node id="node1">
...
<om-node id="node2">
...
</om-node>
...
</om-node>
...
<om-root>
也就是说,我的 <om-node> 元素将与任意 HTML 混合,其中可能应用了定位和/或 CSS 转换。
这些<om-node> 元素的目的是根据各种条件对其内容应用 CSS 仿射变换。但无论其在层次结构中的位置如何,每个om-node 都会计算相对于根节点的变换。
我不能只将计算出的转换应用于节点,因为浏览器会将其与其所有祖先元素的转换结合起来:如果我将 node1 旋转 30 度,那么 node2 也将旋转 30 度在应用其自身的变换之前 30 度。
理想情况下,我想要的是类似于Element.getClientRects() 的东西,但返回一个矩阵而不仅仅是一个边界框。然后我可以做一些数学运算来补偿<om-node> 和<om-root> 元素的坐标系之间的差异。
This question 与我的相似,但没有有用的答案。问题提到了使用getComputedStyle(),但这并没有起到所声称的作用——getComputedStyle(elt).transform 返回相对于元素包含块的转换,不是视口。另外,结果不包括“传统”CSS 定位的效果(事实上,对于传统定位的元素,它根本没有价值)。
所以: 是否有可靠的方法来获取元素相对于视口的转换矩阵?
布局引擎显然有这个信息,我不希望每次发生任何变化时都执行复杂(且昂贵)的树遍历过程。
【问题讨论】:
-
如果您可以访问 chrome devtools API(例如,使用一些电子应用程序、chrome 调试器等),那么有一个 API 可以帮助解决这个问题
DOM.getContentQuadschromedevtools.github.io/devtools-protocol/tot/DOM/… -
我一般需要在网络上进行这项工作,这样 API 就不能直接使用。但这让我想到:可能有一种方法可以仅使用 getClientRects() 来计算元素的变换四边形(以及仿射变换矩阵)......
标签: javascript css dom layout