При верстке макета из PSD часто иконки вставлены в формате SVG, а если нет — просим их у дизайнера. Ранее мы использовали иконочные шрифты, но недавно увидели преимущества спрайтов и решили попробовать с ними поиграться внедрить их в процесс разработки. Нам нравятся иконочные шрифты, но они имеют ряд недостатков(на эту тему почитайте CSSTricks). Эксперимент удался, и вот как мы организовали систему.
Условия
Что нам нужно от спрайтов:
Гибкое управление размером, цветом и поведением(hover, focus etc) иконки
Автоматизация, минимум ручной работы
Подгрузка на страницу только необходимых иконок
Удобная вставка иконок в разметку страницы (для шаблонизации html я использую jade)
Структура папок:
Подробнее о том как работает наша сборка - можете почитать в репозитории.
Для создания спрайта используем gulp, а именно:
gulp-svg-sprite - создание спрайта
gulp-svgmin - минификация SVG
gulp-cheerio - удаление лишних атрибутов из svg
gulp-replace - фиксинг некоторых багов, об этом ниже
Поехали
Устанавливаем плагины(мы это делаем глобально и потом линкуем):
В gulpfile объявляем плагины:
Готовим спрайт
Создаем svg-файл с тегами symbol.
Давайте разберемся, что тут происходит по частям.
Говорим откуда нам нужно взять иконки и минифицируем их. Переменная assetsDir - для удобства.
Удаляем атрибуты style, fill и stroke из иконок, для того чтобы они не перебивали стили, заданные через css.
Однако у данного плагина один баг - иногда он преобразовывает символ ‘>’ в кодировку '>'.
Эту проблему решает следующий кусок таска:
Теперь сделаем из получившегося спрайт и положим в папку:
dest:’../../../sass/_sprite.scss’ - здесь мы объявили, куда нужно генерировать стили для спрайта.
template: assetsDir + “sass/templates/_sprite_template.scss” - код шаблона, на основе которого будут генерироваться стили для спрайта.
sprite.svg - это наш спрайт. Внутри он будет содержать следующее(для простоты приведена пара иконок):
Код шаблона для генерирования стилей представлен на гитхабе.
Получаем _sprite.scss следующего содержания:
Скомпилированный css будет таким:
Обратите внимание, что размеры иконок выражены через em, что позволит нам в дальнейшем управлять ими через font-size. Составляем итоговый таск, и запускаем его:
Подключаем на страницу
Итак мы получили svg-файл с иконками и scss-файл с оформлением.
Иконки вставляем через миксин jade, т.к. это быстро и удобно:
Теперь, чтобы встроить иконку вызываем миксин с её именем:
Результирующий html:
Открываем страницу в браузере:
Пока размеры иконки в натуральную величину и имеют стандартный цвет. Изменим это(не в сгенерированном файле, а в главном):
Результат:
Кроссбраузерность
Мы подключаем иконку ссылаясь на внешний svg-файл, к сожалению не все браузеры поддерживают такой запрос. Для решения этой проблемы есть библиотека svg4everybody. Подключаем её и инициализируем:
Вот и все, мы получили рабочую систему подключения иконок через спрайты, но есть еще один момент.
Некорректные иконки
К сожалению, не все дизайнеры делают иконки по пиксельной сетке. В этом случае иконки будут “размываться”. Если вы экспортируете иконки из иллюстратора вам нужно включить пиксельную сетку и подогнать размер и расположение иконки под пиксельную сетку. Если вы работаете в готовыми svg-файлами - воспользуйтесь сервисом iconmoon для их правильного выравнивания. Также важно конвертировать stroke для иконок, о том как это сделать написано в документации iconmoon.