Увеличение тега SVG с теневым DOM
я экспериментировал с HTML5 и SVG; и я очень новичок в JavaScript и веб-разработке, поэтому, вероятно, что-то мне не хватает. Я пытаюсь создать многоразовые веб-компоненты, используя некоторые из новых функций, таких как импорт HTML, теневой DOM и расширение существующих веб-элементов. У меня есть два HTML-файла:
2 ответов
вы не можете этого сделать, поскольку svg не может быть тенью хозяина. Только ограниченное количество элементов может быть тенью хозяина:
article, aside, blockquote, body, div, footer, h1, h2, h3, h4, h5, h6, header, main, nav, p, section, span.
не только svg, но и другие подобные input или textarea не может иметь shadow-doms (я говорю о Shadow-DOM v1).
определение attachShadow для деталей:https://dom.spec.whatwg.org/#dom-element-attachshadow
обратите внимание также, что:
-
SVGSVGElementне реализуетHTMLElement. - также слышал что-то о SVG, уже содержащем shadow-dom в их реализации, и с пользовательскими элементами v1 у вас может быть только одна тень-dom (см. здесь: http://hayato.io/2016/shadowdomv1/).
почему бы вам не создать вместо этого обычный пользовательский элемент, который может содержать <svg> элементы внутри его shadow-dom?
это потому, что в своем <template>, the <rect> элемент не находится внутри <svg> тег, поэтому он не распознается как SVGRectElement, а как .
чтобы заставить его работать, просто добавьте <svg> tag around:
<template id="tank">
<svg>
<rect fill="red" width="50" height="50"></rect>
</svg>
</template>
теперь вы можете импортировать элемент с помощью importNode() или cloneNode():
//Works
var rect = tankElement.content.querySelector('rect').cloneNode();
root.appendChild(rect);
обновление импорт элементов MUTLIPLE SVG
поставить элементы в <g>:
<template id="tank">
<svg>
<g>
<rect fill="red" width="50" height="50"></rect>
<rect fill="blue" width="25" height="50"></rect>
</g>
</svg>
</template>
клон <g> С его содержанием:
var g = tankElement.content.querySelector('g').cloneNode(true);
root.appendChild(g);