Увеличение тега 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);