javascript - 将形状/ mask 动态添加到内联 svg

标签 javascript jquery html svg svg-animate

我有一个包含一系列元素的站点,单击这些元素时,会向该元素添加内联 svg 代码。 svg 基本上为“虹膜删除”设置动画以将元素变为白色。来自单独 html 文档的代码被加载到一系列 div 中。当所有图像加载完成后,我想在 svg 代码中附加一个 mask ,以将虹膜删除回原来的样子。

我正在使用 waitForImages.js检查图像何时完成加载。这是成功的。掩码也被正确添加到 svg 中。然而,面具动画。

这是添加 svg 的初始代码:

$("#selProject").append('<svg id="circleCont" x="0px" y="0px" viewBox="0 0 360 360" enable-background="new 0 0 360 360"><circle class="circ" cx="50%" cy="50%" r="0.01" stroke="#FFFFFF" stroke-width="0.5" fill="none"><animate attributeName="r" from="0.01" to="100%" dur="0.2" begin="0s" fill="freeze"/><animate attributeName="stroke-width" from="0.5" to="100" dur="0.2" begin="0s" fill="freeze"/></circle><circle class="circ" cx="50%" cy="50%" r="0.01" stroke="#FFFFFF" stroke-width="0.5" fill="none"><animate attributeName="r" from="0.01" to="100%" dur="0.2" begin="0.1s" fill="freeze"/><animate attributeName="stroke-width" from="0.5" to="200" dur="0.2" begin="0.1s" fill="freeze"/></circle><circle class="circ" cx="50%" cy="50%" r="0.01" fill="#FFFFFF" mask="url(#mask1)"><animate attributeName="r" from="0.01" to="100%" dur="0.3" begin="0.2s" fill="freeze"/></circle></svg>')

这可能不是最简洁的方法,但这是我知道的方法。

稍后,在一些其他代码/使用 ajax 加载其他 html 文档之后

$("#selProject").waitForImages(function() {
    $("#projectPageInfo").waitForImages(function() {
        $("svg").append('<mask id="mask1"><rect fill="white" width="100%" height="100%" /><circle id="circmask" class="circ" cx="50%" cy="50%" r="0.01" fill="#000000"><animate attributeName="r" from="0.01" to="100%" dur="0.3" begin="0s" fill="freeze"/></circle></mask>');
    });
});

当它与添加的初始 svg 代码分开时, mask 可以正常工作,并且应该具有动画效果。但是,我需要它在图像加载之前不要发生,现在,尽管成功地将蒙版添加到 svg,但它没有动画。我错过了什么?

最佳答案

我怀疑这是典型的 jQuery 问题。不能依赖 JQuery 对 SVG 元素做正确的事情。 jQuery 旨在处理 HTML,而不是 SVG,其元素位于不同的命名空间中。

第一个追加是有效的,因为浏览器知道如何处理 <svg>元素,并做正确的事。但是第二次追加失败,因为 <mask>元素将在默认(即 HTML)命名空间而不是 SVG 命名空间中创建。

如果您查看附加的 <mask> 的 DOM 属性元素在浏览器的开发工具中,您可能会发现它有错误的(即不是 SVG)命名空间。

作为解决方案,我会尝试添加 <mask>返回原始 SVG 并仅设置 mask当您想要使用蒙版时的属性。换句话说,删除:

mask="url(#mask1)"

然后当你想要应用蒙版时:

document.getElementById("id-of-masked-circle").setAttribute("mask", "url(#mask1)");

关于javascript - 将形状/ mask 动态添加到内联 svg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29401475/

相关文章:

javascript - jQuery 事件仅影响元素的此实例

jquery - 使用 jQuery 创建的 Div 不显示在屏幕上

javascript - 当用户要写东西时如何防止重新加载?

javascript - 基于 JSF 的 Web 架构中是否有 JQuery 的空间?

javascript - <a> 标签内的 <a> 标签?

javascript - Python/Flask/HTML - 在新窗口而不是主页中呈现 HTML

javascript - 网页中的非 Canvas 图形

javascript - 将逗号分隔的数字添加到 Javascript 输出

javascript - 如果我在我的页面上使用 CSS 缩放,然后将另一个包含动画的网站加载到 iframe 中,我的页面会变得模糊并且动画行为不正常

javascript - 使用 Firebase Auth (NextJS) 实现用户角色