Я не думаю, что вы можете использовать <slot>
в SVG
Упрощение вашего кода только для того, чтобы посмотреть, что работает.
Ниже приведен собственный пользовательский элемент, который позволяет встроить внутреннийсодержание.Внутренний контент - это SVG.Я добавил значения в SVG, чтобы заставить его работать.
class MyElement extends HTMLElement {
constructor() {
super();
const s = this.attachShadow({mode:'open'});
s.innerHTML = `<div>Your SVG</div>
<div style="border:1px solid blue;width:20px;height:20px;"><slot></slot></div>`;
}
}
customElements.define('my-element', MyElement);
<my-element>
<svg height="20" width="20">
<circle cx=10 cy=10 r=10 fill=red></circle>
</svg>
</my-element>
Теперь давайте попробуем сделать это с svg, а не с div:
class MyElement extends HTMLElement {
constructor() {
super();
const s = this.attachShadow({mode:'open'});
s.innerHTML = `<div>Your SVG</div>
<svg height="20" width="20" style="border:1px solid blue;"><slot></slot></svg>`
}
}
customElements.define('my-element', MyElement);
<my-element>
<circle cx=10 cy=10 r=10 fill=red></circle>
</my-element>
Если вы покопаетесь в Dev Tools, вы увидите, что SVG отказывается принимать тег слота как дочерний.Я не думал, что SVG учитывает <slot>
, и не уверен.Я просто не думаю, что вы можете сделать это так, как вы хотите.