Кратко
СкопированоSVG-спрайт — это файл, получаемый в результате объединения нескольких файлов SVG. Файл-спрайт используется для сокращения количества запросов к сети — вместо загрузки нескольких файлов, грузится только один. Также для уменьшения размеров и читаемости HTML-кода при многократном использовании векторной графики в разметке.
Что такое SVG-спрайт?
СкопированоСпрайт это метод, который помогает уменьшить количество запросов сети к графическим ресурсам. В давние времена спрайты применялись для растровой графики, так как грузить большое количество изображений (обычно это были иконки) было накладно из-за особенностей протокола HTTP/1. Для каждого запроса необходимо было открывать своё соединение и дожидаться его закрытия, и только после этого можно было переходить к загрузке следующего файла. При такой реализации тратилось много времени и ресурсов на установку и закрытие соединения. Чтобы сократить накладные расходы и был придуман способ объединения нескольких файлов в один.
В настоящее время в сети используется протокол HTTP/2, который позволяет открывать несколько параллельных соединений и снизить накладные расходы. Но всё равно важно следить за нагрузкой на сеть, так как пользователи могут столкнуться с ситуацией когда их интернет-соединение является медленным и скорость загрузки ресурсов может быть критичной.
Часто SVG-графика используется для создания системы иконок и её последующего использования на сайте. Можно по-разному добавлять SVG-иконки на сайт, но наиболее распространённым способом является добавление иконок прямо в разметку страницы, так как это позволяет стилизовать SVG при помощи CSS. При таком подходе можно столкнуться с ситуацией когда на одной или нескольких страницах приходится дублировать разметку вставляя одну и те же SVG-иконку (например, иконку удаления или редактирования данных).
Использование спрайтов в данном случае позволит избежать дублирования кода и уменьшить вес HTML-файла. К тому же, если потребуется внести изменения, нужно будет изменить только один файл.
Как создать SVG-спрайт
СкопированоПредположим что уже имеется подготовленный набор отдельных SVG-иконок. Перейдём к формированию SVG-спрайта.
Для начала создадим отдельный файл с расширением .svg
. Внутрь созданного файла добавим обёртку для SVG-файла состоящую из тега <svg>
и атрибута xmlns
, указывающего используемый диалект XML.
<svg xmlns="http://www.w3.org/2000/svg"> ...</svg>
<svg xmlns="http://www.w3.org/2000/svg"> ... </svg>
Далее каждая SVG-иконка помещается внутрь тега <symbol>
, который предоставляет возможность группировать элементы. При этом данные объекты не отображаются до тех пор, пока на них не будут ссылаться при помощи тега <use>
.
Код ниже сокращён для удобства чтения.
<svg xmlns="http://www.w3.org/2000/svg"> ... <symbol id="social-facebook" viewBox="0 0 6 12"> <path d="M1.09903 2.72854C1.09903 ..."/> </symbol> <symbol id="social-twitter" viewBox="0 0 16 11"> <path d="M13.3758 4.62011C14.2231 ..."/> </symbol> ...</svg>
<svg xmlns="http://www.w3.org/2000/svg"> ... <symbol id="social-facebook" viewBox="0 0 6 12"> <path d="M1.09903 2.72854C1.09903 ..."/> </symbol> <symbol id="social-twitter" viewBox="0 0 16 11"> <path d="M13.3758 4.62011C14.2231 ..."/> </symbol> ... </svg>
Каждый элемент <symbol>
содержит атрибут id
с уникальным идентификатором, который будет использоваться для ссылки на иконку в HTML. Также, каждая иконка содержит атрибут view
, который определяет размеры окна отображения. Управляя данным атрибутом, можно указать в какой части холста находится конкретная иконка. Это позволяет использовать в спрайте иконки разных размеров и масштабировать их.
Чтобы использовать иконку из спрайта на странице, нужно добавить внутрь тега <svg>
тег <use>
с обязательным атрибутом href
. Данный атрибут должен ссылаться на файл спрайта с указанием id
символа, содержащего нужное изображение.
<svg class="social-icon" viewBox="0 0 24 24" width="24" height="24"> <use href="sprite.svg#social-vk"></use></svg>
<svg class="social-icon" viewBox="0 0 24 24" width="24" height="24"> <use href="sprite.svg#social-vk"></use> </svg>
Полученные таким образом элементы можно стилизовать с помощью CSS, как и обычные HTML-элементы. Вот пример:
.social-icon { background-color: black; fill: white; transition: fill 0.3s ease-in-out;}.social-icon:hover,.social-icon:focus { fill: rgb(160 123 80);}
.social-icon { background-color: black; fill: white; transition: fill 0.3s ease-in-out; } .social-icon:hover, .social-icon:focus { fill: rgb(160 123 80); }
Откройте демо в новой вкладке и проверьте что иконки грузятся как спрайт в одном файле.
Преимущества данного метода:
- Сокращение количества HTTP-запросов;
- Возможность стилизации иконок с помощью CSS;
- Адаптивность и масштабируемость изображений без потери качества.
Недостатки:
- Нельзя использовать как фоновое изображение.
SVG-спрайт для фона
СкопированоЧтобы использовать SVG из спрайта как фоновое изображение, придётся сформировать иконки в спрайте друг за другом (или по сетке).
Изменение фона будет происходить при помощи сдвига области просмотра SVG. Делается это с помощью тега <view>
. Этот тег связывает иконку со специальным идентификатором и определяет её область просмотра.
Область просмотра - это ограниченный прямоугольник, который определяет какая часть холста видна пользователю в данный момент.
В спецификации SVG такой способ называется именованными фрагментами.
<svg width="24" height="72" viewBox="0 0 24 72" fill="none" xmlns="http://www.w3.org/2000/svg"> <view id="icon-first-view" viewBox="0 0 24 24"/> <path d="M4 12V20C4 20.5304 ..."/> <view id="icon-second-view" viewBox="0 24 24 24"/> <path d="M4 12V20C4 20.5304 ..."/> <view id="icon-third-view" viewBox="0 48 24 24"/> <path d="M4 12V20C4 20.5304 ..."/></svg>
<svg width="24" height="72" viewBox="0 0 24 72" fill="none" xmlns="http://www.w3.org/2000/svg" > <view id="icon-first-view" viewBox="0 0 24 24"/> <path d="M4 12V20C4 20.5304 ..."/> <view id="icon-second-view" viewBox="0 24 24 24"/> <path d="M4 12V20C4 20.5304 ..."/> <view id="icon-third-view" viewBox="0 48 24 24"/> <path d="M4 12V20C4 20.5304 ..."/> </svg>
Атрибут view
здесь работает так же, как для <svg>
. Первые два значения определяют сдвиг области просмотра по осям x и y, следующие два — размер иконки. В нашем примере мы имеем три иконки размером 24 на 24 пикселя, расположенные друг за другом по вертикали. Подробнее об атрибуте view
можно узнать в статье.
Для дальнейшего использования в CSS или HTML необходимо указать путь к файлу и идентификатор конкретного изображения.
.image { background-image: url('fragments.svg#icon-first-view');}
.image { background-image: url('fragments.svg#icon-first-view'); }
Также можно воспользоваться альтернативным синтаксисом. Вместо того чтобы задавать внутри спрайта каждой иконке именованный фрагмент с использованием тега <view>
, можно сразу при подключении файла указать область, которую хотите просмотреть. Для этого после адреса файла необходимо воспользоваться параметрами svg
и view
, в котором указать желаемую область просмотра.
.image { background-image: url('fragments.svg#svgView(viewBox(0, 0, 24, 48))');}.image:hover,.image:focus { background-image: url('fragments.svg#svgView(viewBox(0, 24, 24, 48))');}
.image { background-image: url('fragments.svg#svgView(viewBox(0, 0, 24, 48))'); } .image:hover, .image:focus { background-image: url('fragments.svg#svgView(viewBox(0, 24, 24, 48))'); }
При наведении курсора на иконку происходит смена области видимости внутри SVG-спрайта.
Недостатком является невозможность стилизовать иконку при помощи CSS.
SVG-спрайт как стек
СкопированоДанный способ также использует именованные фрагменты, но, в отличие от предыдущего способа, иконки в спрайте располагаются не последовательно друг за другом, а одна под другой. Каждая иконка скрыта по умолчанию и становится видна при ссылке на неё через именованный фрагмент.
Как и в случае с <symbol>
, значки не занимают своё место, поскольку они наложены друг на друга. Но они не скрыты по умолчанию, в отличие от <symbol>
. Вот почему нужно скрыть их с помощью display
, но не все, а только те, на которые не нацелен идентификатор в URL-адресе спрайта.
<svg xmlns="http://www.w3.org/2000/svg"> <defs> <style> g { display: none; } g:target { display: inline; } </style> </defs> <g id="cat"> <path d="M9 13.125C9 13.3475 ..." fill="black"/> </g> <g id="dog"> <path d="M22.4728 11.7187L20.9334 ..." fill="black"/> </g></svg>
<svg xmlns="http://www.w3.org/2000/svg"> <defs> <style> g { display: none; } g:target { display: inline; } </style> </defs> <g id="cat"> <path d="M9 13.125C9 13.3475 ..." fill="black"/> </g> <g id="dog"> <path d="M22.4728 11.7187L20.9334 ..." fill="black"/> </g> </svg>
Существуют разные способы использования SVG-спрайтов, каждый из которых имеет свои преимущества и недостатки. В одних случаях можно использовать иконки как фоновые изображения, но нельзя стилизовать их. В других наоборот. Важно знать различные способы применения SVG-спрайтов и их особенности, а также правильно применять их в той или иной задаче.
Подсказки
Скопировано💡 Если использовать иконку из SVG-спрайта как фоновое изображение и при этом нужно при каком-либо взаимодействии изменить её стили (например, при наведении курсора изменить цвет), можно создать копию необходимой иконки с нужными стилями и при взаимодействии менять одну иконку на другую.