Ниже приведена комбинация ответов gael и maqam7 с исправлением ошибки и некоторыми подробностями.
Сначала мы объединяем два SVG в один. (Мы пишем наш собственный скрипт, используем макросы редактора, используем один из веб-сайтов, которые делают это, или делают это вручную.)
sprite.svg
<svg id="mysprite" xmlns="http://www.w3.org/2000/svg">
<symbol id="circle"
viewBox="0 0 400 300"
width="400" height="300">
<circle cx="200" cy="150" r="100"
stroke="red" fill="blue" stroke-width="10" />
</symbol>
<symbol id="square"
viewBox="0 0 400 300"
width="400" height="300">
<rect x="100" y="50" width="200" height="200"
stroke="green" fill="gray" stroke-width="10" />
</symbol>
</svg>
Когда нам нужен круг или квадрат, мы use
атрибут xlink:href
( устарел , но продолжаем его использовать), который вызывает субспрайт.
<div class="container">
<svg>
<use xlink:href="sprite.svg#circle"></use>
</svg>
<svg>
<use xlink:href="sprite.svg#square"></use>
</svg>
</div>
Нет необходимости включать спрайт в body
<img src="sprite.svg"/>
как на спрайт ссылаются в каждом элементе svg
.
Следовательно, нет необходимости скрывать глобальный спрайт.
#svg-sprite {
display: none;
}
Отображаются только детали.
Одно предупреждение: Chrome загружает img
и svg
напрямую, но откажется загружать use
/ xlink:href
, если вы не запустите локальный сервер.
Остальные проблемы
Я не уверен, что это оптимально. Возможно, что два запроса продолжают отправляться. Просто кеш будет ловить второй как идентичный. Не навреди. Тем не менее, загрузка один раз через скрытый svg
может быть лучшим подходом, если кто-то может заполнить детали.