При верстке макета из PSD часто иконки вставлены в формате SVG, а если нет — просим их у дизайнера. Ранее мы использовали иконочные шрифты, но недавно увидели преимущества спрайтов и решили попробовать с ними поиграться внедрить их в процесс разработки. Нам нравятся иконочные шрифты, но они имеют ряд недостатков(на эту тему почитайте CSSTricks). Эксперимент удался, и вот как мы организовали систему.
Условия
Что нам нужно от спрайтов:
Гибкое управление размером, цветом и поведением(hover, focus etc) иконки
Автоматизация, минимум ручной работы
Кеширование иконок для хорошей скорости загрузки страниц
Удобная вставка иконок в разметку страницы (для шаблонизации html я использую jade)
Структура папок:
Подробнее о том как работает наша сборка - можете почитать в репозитории.
Для создания спрайта используем gulp, а именно:
gulp-svg-sprites - создание спрайта
gulp-svgmin - минификация SVG
gulp-cheerio - удаление лишних атрибутов из svg
gulp-replace - фиксинг некоторых багов, об этом ниже
Поехали
Устанавливаем плагины(мы это делаем глобально и потом линкуем):
В gulpfile объявляем плагины:
Варим спрайт
Первый таск - создаем html-файл с тегами symbol.
Давайте разберемся, что тут происходит по частям.
Говорим откуда нам нужно взять иконки и минифицируем их. Переменная assetsDir - для удобства.
Удаляем атрибуты style и fill из иконок, для того чтобы они не перебивали стили, заданные через css.
Однако у данного плагина один баг - иногда он преобразовывает символ ‘>’ в кодировку '>'.
Эту проблему решает следующий кусок таска:
Теперь сделаем из получившегося спрайт и положим в папку:
symbol_sprite.html - и есть наш спрайт. Внутри он будет содержать следующее(для простоты приведена пара иконок):
Щепотка стилей
Теперь нам нужно сделать стили для нашего спрайта(в данном случае файл .scss). В плагине gulp-svg-sprites мы можем задать этот файл, но вот какая досада - его нельзя сделать при данной настройке:
Сделаем для создания scss отдельный таск.
В свойстве cssFile объявляем, куда положить на scss файл(потом инклудим его).
В свойстве templates объявляем, где взять для него шаблон. Код шаблона:
Получаем _svg_sprite.scss следующего содержания:
Скомпилированный css будет таким:
Обратите внимание, что размеры иконок выражены через em, что позволит нам в дальнейшем управлять ими через font-size. Составляем итоговый таск, и запускаем его:
Подключаем на страницу
Итак мы получили html-файл с иконками и scss-файл с оформлением. Далее подключим файл на страницу, используя кеширование через localStorage. Этот процесс подробно описан в статье Caching SVG Sprite in localStorage.
Подключаем js-файл следующего содержания:
Файл подключен, после первой загрузки он кешируется. Если вам нужно нужно обновить спрайт в js-файле приведенном выше меняйте параметр revision на +1.
Иконки вставляем через миксин jade, т.к. это быстро и удобно:
Теперь, чтобы встроить иконку вызываем миксин с её именем:
Результирующий html:
Открываем страницу в браузере:
Пока размеры иконок в натуральную величину и имеют стандартный цвет. Изменим это(не в сгенерированном файле, а в главном):
Результат:
Вот и все, мы получили рабочую систему подключения иконок через спрайты, но есть еще один момент.
Размытие
К сожалению, не все дизайнеры делают иконки по пиксельной сетке. В этом случае иконки будут “размываться”. Если вы экспортируете иконки из иллюстратора вам нужно включить пиксельную сетку и подогнать размер и расположение иконки под пиксельную сетку. Если вы работаете в готовыми svg-файлами - воспользуйтесь сервисом iconmoon для их правильного выравнивания.