【发布时间】:2021-03-31 11:02:57
【问题描述】:
我目前正在从事一个Angular Elements 项目。在这个自定义组件中,我想使用SVG.js 3+。
但是由于我需要在我的组件中使用ViewEncapsulation.ShadowDom,所以我在初始化 SVG.js 时遇到了一些问题。
创建 SVG 和绘制矩形的标准过程如下:
this.draw = SVG().addTo("#SVGContainer").viewbox(0, 0, 300, 140);
this.draw.rect(100, 100).move(100, 50).fill('#f06')
这里的问题是.addTo("#SVGContainer") 只能找到不在shadow-root 中的元素。我已经用我的使用 shadow-root 的组件和不使用 shadow-root 的容器对其进行了测试。正如预期的那样,SVG.js 在没有 Shadow Dom 的 Angular 项目中工作,但在使用 shadow-root 的项目中没有工作。
我知道使用container.shadowRoot.querySelector(".test").innerHTML 可以访问阴影元素,但函数.addTo() 只允许我传递元素的id,因此没有传递dom 元素本身的选项。
由于ViewEncapsulation.ShadowDom 是我的新自定义 Web 组件的要求,我想知道是否可以将 shadow-dom 元素传递给 SVG.js,或者根本不可能。
【问题讨论】:
-
那个 addTo 函数需要修补,以便它可以接受一个字符串(就像现在一样)或一个元素。在他们的 GitHub Repo 上请求它,他们很快就会回复。 github.com/svgdotjs/svg.js/issues
-
一个不同的(疯狂的)想法是注册一个自定义窗口并给它窗口对象并作为文档阴影根。但这只是我的想法。也许它有效:D
-
@Danny'365CSI'Engelman 感谢您的 cmets。我今天解决了。请考虑阅读我的答案。干杯
-
@fuzzyma 好主意,但如果没有任何效果,那将是我的备份备份计划:D
-
使用
SVG.find(selector, shadowroot)可能是一种侵入性较小的方法 - 这会将方法范围限定为影子根并找到您的元素
标签: javascript angular typescript shadow-dom svg.js