Изображения следует хранить в папке src/images
.
При запуске задачи images
файлы из папки src/images
копируются в build/images
.
ninelines-template
├── build
│ └── images
└── src
└── images
Для оптимизации изображений можно использовать задачу optimize:images
.
optimize:images
оптимизирует только исходные файлы из папкиsrc/images
!
Предварительно оптимизированные изображения рекомендуется хранить в папке src/resources/images
.
В таком случае при запуске задачи optimize:images
данные файлы не будут затронуты.
ninelines-template
└── src
└── resources
└── images
Работа с PNG-спрайтами строится следующим образом:
-
Берем две версии иконки — обычную и retina (увеличенную в два раза). Сохраняем в
src/images/sprites/png
:ninelines-template └── src └── images └── sprites └── png ├── phone.png └── [email protected]
-
Запускаем задачу
sprites:png
(если уже запущенgulp watch
илиgulp
, то данный шаг можно пропустить):gulp sprites:png
-
Генератор оптимизирует и объединяет иконки в спрайты:
ninelines-template └── build └── images ├── sprites.png └── [email protected]
На основе предзаданного шаблона
src/scss/_sprites.hbs
генерируется файлsrc/scss/_sprites.scss
, содержащий вспомогательную информацию о получившихся спрайтах:ninelines-template └── src └── scss ├── _sprites.hbs └── _sprites.scss
Для каждой иконки создается CSS-класс в формате
.sprite-[name]
. В нашем случае получим класс.sprite-phone
.В сборке также содержится ряд SCSS-функций и миксин для работы со спрайтами.
src/scss/functions/_sprites.scss
:@function sprite($name, $size: normal) { /* ... */ } @function sprite-width($name, $size: normal) { /* ... */ } @function sprite-height($name, $size: normal) { /* ... */ } @function sprite-image($name, $size: normal) { /* ... */ } @function sprite-x($name, $size: normal) { /* ... */ } @function sprite-y($name, $size: normal) { /* ... */ } @function sprite-total-width($name, $size: normal) { /* ... */ } @function sprite-total-height($name, $size: normal) { /* ... */ }
src/scss/mixins/_srites.scss
:@mixin sprite-width($name, $size: normal) { /* ... */ } @mixin sprite-height($name, $size: normal) { /* ... */ } @mixin sprite-background-image($name, $size: normal) { /* ... */ } @mixin sprite-background-position($name, $size: normal) { /* ... */ } @mixin sprite-background-size($name, $size: normal) { /* ... */ } @mixin sprite-background($name, $size: normal) { /* ... */ } @mixin sprite($name) { /* ... */ }
-
Полученные спрайты можно использовать в Pug (с помощью классов):
footer a(href="tel:+71234567890") span.sprite-phone | +7 (123) 456-78-90
Или в SCSS (с помощью миксин):
footer { a { &::before { @include sprite("phone"); content: ""; } } }
Принцип работы с SVG-спрайтами:
-
Получаем векторные иконки в формате
.svg
(либо заранее подготовленные, либо экспортируем с помощью редактора). Сохраняем в папкуsrc/images/sprites/svg
:ninelines-template └── src └── images └── sprites └── svg └── phone.svg
-
Запускаем задачу
sprites:svg
(если уже запущенgulp watch
илиgulp
, то данный шаг можно пропустить):gulp sprites:svg
-
Генератор оптимизирует и объединяет иконки в один спрайт:
ninelines-template └── build └── images └── sprites.svg
В сборке содержится Pug-миксин для подключения SVG-спрайтов.
src/pug/mixins/svg.pug
:mixin svg(name) svg&attributes(attributes) use(xlink:href=`${baseDir}images/sprites.svg#${name}`)
-
Подключаем иконку в Pug:
footer a(href="tel:+71234567890") +svg("phone") | +7 (123) 456-78-90
При необходимости иконку можно стилизовать:
footer { a { svg { display: inline-block; vertical-align: middle; width: 30px; height: 30px; fill: $color-black; } } }
Если цвет заливки или обводки не удается изменить с помощью CSS, то необходимо открыть SVG-файл иконки в редакторе и удалить соответствующие атрибуты (
fill
,stroke
) из кода.
-
Общий пример:
Шаг 1: исходная иконка без полей
<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="0 0 {width} {height}"> <path d="..."/> <path d="..."/> <path d="..."/> </svg>
Шаг 2: добавляем поле размером {padding}
<svg xmlns="http://www.w3.org/2000/svg" width="{width + 2 * padding}" height="{height + 2 * padding}" viewBox="0 0 {width + 2 * padding} {height + 2 * padding}"> <g transform="translate({padding} {padding})"> <path d="..."/> <path d="..."/> <path d="..."/> </g> </svg>
Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
<svg xmlns="http://www.w3.org/2000/svg" width="{width + 2 * padding}" height="{height + 2 * padding}" viewBox="0 0 {width + 2 * padding} {height + 2 * padding}"> <path d="..."/> <path d="..."/> <path d="..."/> </svg>
-
Конкретный пример:
Шаг 1: исходная иконка без полей
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="30" viewBox="0 0 20 30"> <path d="..."/> <path d="..."/> <path d="..."/> </svg>
Шаг 2: добавляем поле размером 1px
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="32" viewBox="0 0 22 32"> <g transform="translate(1 1)"> <path d="..."/> <path d="..."/> <path d="..."/> </g> </svg>
Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="32" viewBox="0 0 22 32"> <path d="..."/> <path d="..."/> <path d="..."/> </svg>