尝试在 SVG 中嵌套 appendChild
Trying to nest an appendChild in a SVG
基于此:
https://dev.to/gavinsykes/appending-a-child-to-an-svg-using-pure-javascript-1h9g
我试图在 SVG 的 defs 部分附加一个过滤器...但它没有用。
当我尝试时它给了我一个错误:Oo_banner.defs.appendChild(filter)
Oo_banner 是 SVG 的 ID。
所以我一直在想我可以在 SVG 的末尾定义我的模糊过滤器,但即使那样也不起作用,因为它将 feGaussianBlur 放在过滤器标签之后。
不管怎样,这是我的代码:
<svg id="Oo_banner" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 600 300">
<defs>
</defs>
<rect id="subj" x="30" y="30" width="70" height="70" fill="#f9f"/>
</svg>
<script>
var Oo_banner = document.querySelector("#Oo_banner"),
subj=document.querySelector("#subj"),
filter = document.createElementNS('http://www.w3.org/2000/svg','filter');
filter.setAttribute('id','blur_subj');
Oo_banner.appendChild(filter);
var filterBlur = document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur');
filterBlur.setAttribute('id','blur_subj_');
filterBlur.setAttribute('stdDeviation','15');
Oo_banner.appendChild(filterBlur);
subj.setAttribute('filter','url(#blur_subj)');
</script>
我也在这里做了一个婴儿围栏:
https://codepen.io/trufo/pen/dyWbOQp
这是我在 Chrome 中检查页面时得到的结构:
https://i.imgur.com/Et1Lv4h.png
所以我有三个问题:
1.) 如何在 SVG 的 defs 部分附加标签(过滤器)?
2.) 如何在刚刚创建的标签中附加一个标签(feGaussianBlur)?
3.) 如何使最后一个标签 (feGaussianBlur) 没有结束标签(例如 img 标签)
谢谢
我认为你的属性和 DOM id 很混乱。如果您想将子元素附加到 defs,则获取对 defs 元素的 DOM 引用 - 您只需将该 id 从 SVG 向下移动到 defs 即可。
然后,如果您想将 feGaussianBlur 嵌套在滤镜中,请将其附加到滤镜 DOM 元素 - 而不是 svg 元素。
(另外 - 我鼓励更好的命名 - 用尾随下划线区分两个不同的 ID 会给你带来麻烦。)
const Oo_banner = document.querySelector("#Oo_banner");
let subj = document.querySelector("#subj");
filter = document.createElementNS('http://www.w3.org/2000/svg','filter');
filter.setAttribute('id','blurme');
Oo_banner.appendChild(filter);
let filterBlur = document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur');
filterBlur.setAttribute('id','blur_subj_');
filterBlur.setAttribute('stdDeviation','2');
filter.appendChild(filterBlur);
subj.setAttribute('filter','url(#blurme)');
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 600 300">
<defs id="Oo_banner">
</defs>
<rect id="subj" x="30" y="30" width="70" height="70" fill="green"/>
</svg>
基于此: https://dev.to/gavinsykes/appending-a-child-to-an-svg-using-pure-javascript-1h9g
我试图在 SVG 的 defs 部分附加一个过滤器...但它没有用。 当我尝试时它给了我一个错误:Oo_banner.defs.appendChild(filter) Oo_banner 是 SVG 的 ID。
所以我一直在想我可以在 SVG 的末尾定义我的模糊过滤器,但即使那样也不起作用,因为它将 feGaussianBlur 放在过滤器标签之后。 不管怎样,这是我的代码:
<svg id="Oo_banner" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 600 300">
<defs>
</defs>
<rect id="subj" x="30" y="30" width="70" height="70" fill="#f9f"/>
</svg>
<script>
var Oo_banner = document.querySelector("#Oo_banner"),
subj=document.querySelector("#subj"),
filter = document.createElementNS('http://www.w3.org/2000/svg','filter');
filter.setAttribute('id','blur_subj');
Oo_banner.appendChild(filter);
var filterBlur = document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur');
filterBlur.setAttribute('id','blur_subj_');
filterBlur.setAttribute('stdDeviation','15');
Oo_banner.appendChild(filterBlur);
subj.setAttribute('filter','url(#blur_subj)');
</script>
我也在这里做了一个婴儿围栏: https://codepen.io/trufo/pen/dyWbOQp
这是我在 Chrome 中检查页面时得到的结构: https://i.imgur.com/Et1Lv4h.png
所以我有三个问题:
1.) 如何在 SVG 的 defs 部分附加标签(过滤器)?
2.) 如何在刚刚创建的标签中附加一个标签(feGaussianBlur)?
3.) 如何使最后一个标签 (feGaussianBlur) 没有结束标签(例如 img 标签)
谢谢
我认为你的属性和 DOM id 很混乱。如果您想将子元素附加到 defs,则获取对 defs 元素的 DOM 引用 - 您只需将该 id 从 SVG 向下移动到 defs 即可。
然后,如果您想将 feGaussianBlur 嵌套在滤镜中,请将其附加到滤镜 DOM 元素 - 而不是 svg 元素。
(另外 - 我鼓励更好的命名 - 用尾随下划线区分两个不同的 ID 会给你带来麻烦。)
const Oo_banner = document.querySelector("#Oo_banner");
let subj = document.querySelector("#subj");
filter = document.createElementNS('http://www.w3.org/2000/svg','filter');
filter.setAttribute('id','blurme');
Oo_banner.appendChild(filter);
let filterBlur = document.createElementNS('http://www.w3.org/2000/svg','feGaussianBlur');
filterBlur.setAttribute('id','blur_subj_');
filterBlur.setAttribute('stdDeviation','2');
filter.appendChild(filterBlur);
subj.setAttribute('filter','url(#blurme)');
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 600 300">
<defs id="Oo_banner">
</defs>
<rect id="subj" x="30" y="30" width="70" height="70" fill="green"/>
</svg>