Как повторно использовать встроенный элемент SVG на той же странице?
У меня есть простая HTML5-страница со встроенным значком SVG.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">
</head>
<body>
<h1>
<span>ABC</span>
<svg id="move-icon"
width="0.7em" height="0.7em"
viewBox="0 0 10 10"
style="display: inline-block">
<defs>
<marker id="arrow-end-marker"
viewBox="0 0 10 10" refX="0" refY="5"
markerHeight="3"
orient="auto">
<polygon points="0 0 10 5 0 10" />
</marker>
</defs>
<line x1="5" y1="5" x2="5" y2="7"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="3" y2="5"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="5" y2="3"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="7" y2="5"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
</svg>
</h1>
<p>abc</p>
<h2>
<span>DEF</span>
<!-- reuse here -->❓
</h2>
<p>def</p>
</body>
</html>
Теперь я хочу повторно использовать встроенный значок SVG во втором заголовке. Как это может быть сделано?
2 ответа
symbol
+ use
+ href="#symbol-id"
один раз определить символ и использовать его в других svg документах
<!-- define symbol in hidden svg document -->
<svg style="display: none">
<symbol id="circle-arrow-left" viewbox="0 -10 100 110">
<path d="m 20 80 A 40 40 0 1 0 20 20"
fill="none" stroke="#000" stroke-width="10" />
<path d="M 10 0 v 40 h 40"
fill="#000" />
</symbol>
</svg>
<!-- use symbol of external svg document -->
<button>
<svg width="50" height="50">
<use href="#circle-arrow-left" />
</svg>
</button>
<!-- transform symbol with horizontal flip -->
<button>
<svg width="50" height="50" style="transform: scale(-1, 1)">
<use href="#circle-arrow-left" />
</svg>
</button>
Связанный:
https://css-tricks.com/svg-symbol-good-choice-icons/
https://css-tricks.com/svg-use-with-external-reference-take-2/
изменить: заменить устаревший xlink:href
с участием href
Вы можете сохранить SVG в файл и использовать его непосредственно в теге .
<img src="toto.svg" alt="toto description">
У меня сейчас есть решение, но я понятия не имею, почему это работает. Можно определить template
, который можно клонировать. Но клонирование означает дублирование id
атрибутов. А это значит, что они больше не уникальны. Но ссылаясь на них в marker-end
кажется, все еще возможно. Это немного странно, и я не уверен, стоит ли идти по этому пути.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">
</head>
<body>
<h1>
<span class="movable">ABC</span>
</h1>
<p>abc</p>
<h2>
<span class="movable">DEF</span>
</h2>
<p>def</p>
<template id="move-icon">
<svg width="0.7em" height="0.7em"
viewBox="0 0 10 10"
style="display: inline-block; vertical-align: baseline">
<defs>
<marker id="arrow-end-marker"
viewBox="0 0 10 10" refX="0" refY="5"
markerHeight="3"
orient="auto">
<polygon points="0 0 10 5 0 10" />
</marker>
</defs>
<line x1="5" y1="5" x2="5" y2="7"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="3" y2="5"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="5" y2="3"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
<line x1="5" y1="5" x2="7" y2="5"
stroke="black" stroke-width="0.03em"
marker-end="url(#arrow-end-marker)" />
</svg>
</template>
<script>
(function() {
var icon = document.querySelector('#move-icon');
var spans = document.querySelectorAll('span.movable');
for (var i = 0; i < spans.length; i += 1)
spans[i].parentNode.appendChild (icon.content.cloneNode(true));
})();
</script>
</body>
</html>