В целях оптимизации и удобства при многократном использовании SVG изображений можно объединить в один файл-спрайт. Как это сделать? Для примера возьмем несколько изображений:
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"/><path d="M17,7H15v8.52a2,2,0,0,0,.75,1.56l4.63,3.7,1.24-1.56L17,15.52Z"/></g>
</svg>
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><polygon points="28.71 4.71 27.29 3.29 16 14.59 4.71 3.29 3.29 4.71 14.59 16 3.29 27.29 4.71 28.71 16 17.41 27.29 28.71 28.71 27.29 17.41 16 28.71 4.71"/></g>
</svg>
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><path d="M16,2,3,6.28V12C3,26.61,15.63,29.94,15.76,30L16,30l.24-.06c.13,0,12.76-3.36,12.76-18V6.28ZM27,12c0,12.1-9.31,15.45-11,16C14.31,27.45,5,24.1,5,12V7.72L16,4.05,27,7.72Z"/><path d="M11.59,15l-1.42,1.41,2.29,2.29a2,2,0,0,0,1.42.59,2,2,0,0,0,1.41-.59l6.54-6.53-1.42-1.42-6.53,6.54Z"/></g>
</svg>
У SVG есть несколько элементов-контейнеров – <g>
, <defs>
и <symbol>
, лучшим для спрайтов является <symbol>
т.к. он поддерживает все атрибуты как у <svg>
.
Итак, нужно создать файл icons.svg, в нём будет общий контейнер <svg>...</svg>
, далее в него помещаются изображения, с заменой <svg>
на <symbol>
оставляя все другие параметры и добавляется атрибут id
для дальнейшего вывода.
<svg>
<symbol id="icon-1" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"/><path d="M17,7H15v8.52a2,2,0,0,0,.75,1.56l4.63,3.7,1.24-1.56L17,15.52Z"/></g>
</symbol>
<symbol id="icon-2" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><polygon points="28.71 4.71 27.29 3.29 16 14.59 4.71 3.29 3.29 4.71 14.59 16 3.29 27.29 4.71 28.71 16 17.41 27.29 28.71 28.71 27.29 17.41 16 28.71 4.71"/></g>
</symbol>
<symbol id="icon-3" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g><path d="M16,2,3,6.28V12C3,26.61,15.63,29.94,15.76,30L16,30l.24-.06c.13,0,12.76-3.36,12.76-18V6.28ZM27,12c0,12.1-9.31,15.45-11,16C14.31,27.45,5,24.1,5,12V7.72L16,4.05,27,7.72Z"/><path d="M11.59,15l-1.42,1.41,2.29,2.29a2,2,0,0,0,1.42.59,2,2,0,0,0,1.41-.59l6.54-6.53-1.42-1.42-6.53,6.54Z"/></g>
</symbol>
</svg>
Вывод осуществляется с помощью элемента <use>
с ссылкой на файл спрайта и id
изображения.
<svg height="100" width="100"><use xlink:href="/icons.svg#icon-1"></use></svg>
<svg height="100" width="100"><use xlink:href="/icons.svg#icon-2"></use></svg>
<svg height="100" width="100"><use xlink:href="/icons.svg#icon-3"></use></svg>
Результат:
Минусы
- Если открыть файл спрайта в браузере, то изображения выводится не будут.
- В старых браузерах (до IE9) тег
<use>
не поддерживается. Но для них есть плагин https://github.com/jonathantneal/svg4everybody.