Спрайтовая нирвана
Опубликовал Александр Шабуневич — 31 Октябрь 2012, 12:24
Думаю, многие используют спрайты при разработке сайтов (а если не используют, то должны, ведь это очень эффективный способ ускорить загрузку сайта). Лично для меня процесс изготовления спрайтов раньше выглядел примерно так:
- В Fireworks (или в Фотошопе) создается отдельный файл.
- В него добавляются иконки-картинки (по сетке или без).
- Файл экспортируется в PNG (который по желанию еще дополнительно оптимизируется).
- У каждой иконки замеряются координаты левого угла и её ширина/высота [↺].
- Эти координаты добавляются в CSS вместе с рядом правил для выравнивания [↺].
Это минимум, а последние два шага повторяются много раз. Обычно координаты иконок в дальнейшем не меняются, но иногда что-то (перфекционизм?) заставляет вносить такие изменения, которые требуют что-то передвинуть и тогда нужно проходить по CSS-файлам и менять координаты. Всё это несколько неудобно, а потому порой возникает желание забить на спрайты вообще, применяя их лишь в самых важных проектах.
Новый Fireworks умеет генерить спрайты автоматически (включая и нужный CSS к ним). Но лично я с ним как-то не очень разобрался в плане повторной генерации кода и картинки: видимо, код нужно всегда держать отдельно, чтобы потом его можно было легко заменить. Еще один минус: все иконки должны располагаться в одном исходном файле (для генерации единого спрайта), а так бывает далеко не всегда. К тому же это решение привязано к конкретному редактору, что не всегда бывает удобно.
Есть еще сервисы типа Sprite Cow или Spritebox, которые упрощают жизнь в части операций (вычисления координат или генерации CSS, например), но все равно требуют слишком много возни. В любом случае, такие дополнительные сервисы мне всегда было слишком лениво открывать.
Когда я открыл для себя LESS, я попытался слегка упорядочить генерацию спрайтов при помощи самописных примесей. Это уменьшило количество CSS-кода, но определение и указывание координат все равно приходилось делать вручную. Хотя тогда мне это еще казалось нормальным — я был вполне доволен такой полуручной сборкой.
А потом я познакомился с SASS и попробовал сгенерировать спрайты Компасом. И это открыло мне глаза на то, насколько легко можно работать со спрайтами. Всё, что от вас требуется:
- Набросать все свои картинки-иконки в папку.
- Добавить две строчки в SASS/SCSS-файл:
@import "sprites/*.png";
@include all-sprites-sprites;
И это всё. Никакой расстановки по сетке, вычислений координат и прочего. Всё происходит автоматически, но при желании настраивается под ваши нужды. После всего вы получаете:
- Саму картинку-спрайт (с уникальным урлом, что удобно при обновлении картинки, которая иначе закешируется).
- CSS-код (классы, которые вы можете добавлять к элементам HTML или просто расширять).
Добавьте новую иконку в папку (или удалите старую) — и спрайт со всеми координатами будут автоматически обновлены. Более того, размер спрайта получается даже меньше, чем у Fireworks (который вообще-то довольно прилично оптимизирует изображения). Компас даже умеет определять состояния по названию файлов: добавьте _active
или _hover
к имени файла и получите желаемый результат. Магия!
В общем, настоятельно рекомендую вам попробовать. Для Стайлуса тоже есть подобный модуль (не для Windows), но я его не пробовал.
Комментарии
Я пока обхожусь расположением спрайтов по сетке и миксинами для Стилуса. В миксины я передаю координаты ячеек, а не пиксели, — это делает жизнь намного проще, но не настолько, конечно, как тут.
Было бы интересено посмотреть, как пользоваться тем, что нагенерировала эта штука. Вот есть у меня элемент, хочу, чтобы у него фон брался из спрайта, как будет выглядеть код?
А stylus-sprite вообще непонятно для чего. Там и про мак жалуются, что не устанавливается.
Артём, ну по умолчанию он генерит классы по названиям картинок. То есть из картинки /sprites/search.png получится примерно такой CSS:
.sprites-search, .sprites-add { background: url(„../i/sprites-s919ca2e360.png“) no-repeat; }
.sprites-search { background-position: 0 –32px; }
.sprites-add { … }
При этом, если указать параметр
$sprites-sprite-dimensions: true;
, то второе правило еще будет включать в себя ширину/высоту картинки.Что касается использования: самое простое — добавить класс в разметке, в стиле OOCSS. Но если разметку засорять не хочется, можно написать так, например:
.search-element { @extend .sprites-search; // + правила, типа позиционирования }
Вообще, там много всяких функций (возвращающие координаты, адрес картинки и прочее) из которых можно свои примеси сделать, чтобы вывод контролировать. Но проще всего наверное так, как я написал.
Про примеси я написал — сам ими пользовался с LESS. И это было уже лучше, чем без них, но совсем не сравнишь с тем, что сейчас =)
Да, неплохо. Надо посмотреть ту штуку для Стилуса.
А вот про OOCSS нифига не согласен — это стиль class=„mb10 red bold“ получается :-)
Имхо, с распространением data:url спрайты стали почти не нужны. Маленькие картинки внедряются в CSS, а для больших в спрайтах не необходимости.
Компас, кстати, и data:url генерировать умеет. Так что вполне можно совмещать.
А есть еще такое http://glue.readthedocs.org