Как изменить толщину svg иконки

На чтение 6 мин Просмотров 10.8к. Опубликовано 22.04.2021

На чтение 6 мин Просмотров 10.8к. Опубликовано 22.04.2021

Содержание

  1. В предыдущих сериях…
  2. Где взять inline код SVG-иконки
  3. Содержимое svg кода
  4. Теги
  5. Атрибуты
  6. Интерактив по ховеру
  7. Заключение

В предыдущих сериях…

Ранее мы выяснили, в чем отличие растровых форматов изображения от векторных. И научились подключать SVG-иконку на сайт тремя способами.

Сегодня будем работать с inline кодом, посмотрим, какие бывают атрибуты у тега <svg>. Разберем случай, почему может не работать смена цвета иконки, прописанная в файле CSS.

Где взять inline код SVG-иконки

Если вы скачали готовую графику в формате .svg, то этот файл можно открыть в любом редакторе кода и увидеть тот самый inline код. Как мы помним, векторная графика описывает изображение с помощью специальных формул для создания фигур. При этом используются тег  <svg> (контейнер для хранения SVG графики), внутри которого помещается один или несколько тегов  <path> (для хранения координат прорисовки фигуры или части её). Этот код можно скопировать и вставить в html файл в том месте, где нужно расположить иконку.

Для примера возьмем иконку твиттера. Скопируем тег svg из файла иконки и вставим в HTML.

Содержимое svg кода

Итак, мы подключили иконку в формате svg inline, теперь рассмотрим код подробнее.

<h2>Пример inline кода</h2>

    <!-- Twitter icon -->
    <svg class="twitter-icon" width="256" height="256" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
        <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/>
    </svg>

Так отобразится в браузере:

Пример inline кода

Теги

Мы видим тег  <svg> и  <path>, у которого есть атрибут d с координатами точек на плоскости, по которым рисуется фигура. В данном случае тег <path> один, изображение состоит из одной фигуры, но изображение может состоять из нескольких фигур — тогда будет несколько тегов <path>.

Атрибуты

Перейдем к атрибутам тега <svg>

xmlns="http://www.w3.org/2000/svg" — данный атрибут прописывает путь к стандарту svg, в котором описана эта иконка

viewBox="0 0 512 512" — указывает на ту область иконки, которую мы видим в браузере

class="twitter-icon" — как и другим элементам, можно задать класс и стилизовать по нему в CSS файле

Теперь добавим некоторые атрибуты самостоятельно.

<h2>Пример inline кода с атрибутами</h2>

<!-- Twitter icon -->
<svg class="twitter-icon" width="256" height="256" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
   <path fill="red" stroke="green" stroke-width="10" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/>
</svg>

width="256" height="256" — при помощи этих атрибутов можно настраивать размер иконки

Атрибуты fill, stroke, stroke-width в SVG

Эти атрибуты можно применить к тегу <svg> и тогда они распространятся на всю иконку. А можно применить к отдельному <path> — тогда они будут работать только в области, описанной в конкретном <path>. В нашем случае иконка состоит всего из одного <path>, поэтому без разницы, к чему применить данные атрибуты.

fill="red" — заливка цветом

stroke="green" — цвет обводки

stroke-width="10" — толщина обводки

Вот так мы переделали иконку при помощи атрибутов:

Пример inline кода с атрибутами

Интерактив по ховеру

При помощи CSS будем менять поведение иконки при наведении на нее курсором (по ховеру). Вернемся к изначальному коду без дополнительных атрибутов. Копируем класс иконки и стилизуем в файле CSS. Зададим свойство fill: blue; и далее по псевдоклассу :hover меняем на fill: rgb(145, 8, 199);

HTML

<h2>Пример inline кода, стилизация в CSS</h2>

<!-- Twitter icon -->
<svg class="twitter-icon" width="256" height="256" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
   <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/>
</svg>

CSS

/* Интерактив. SVG inline код. Смена цвета по ховеру */
.twitter-icon {
    fill: blue;
}

.twitter-icon:hover {
    fill: rgb(145, 8, 199);
}

Результат в браузере:

Пример inline кода, стилизация в CSS

Внимание!

Этот прием будет работать только в том случае, если в html коде фигуры не прописан нигде атрибут fill="". Если вы работаете в CSS, то лучше убирать все атрибуты типа fill и stroke, чтобы не было путаницы. И переносить их в файл CSS в качестве свойств.

Заключение

Любой файл .svg можно открыть в редакторе кода. Сам код можно копировать и использовать в файле .html

Кастомизировать иконку можно при помощи атрибутов. Но создать интерактивность получится только при помощи стилизации в CSS файле. При этом важно следить за тем, чтобы контроль заливки или других свойств, которые будут меняться, происходил только в одном месте, в файле .css. В противном случае интерактив не заработает, так как значения атрибутов перебьют значения свойств.

6 сентября 2022

8953 просмотров

Предисловие

Каждый дизайнер хоть раз, да сталкивался с иконками. Эта статья о процессе работы с готовыми иконками и их подготовкой перед тем, как отдать разработчику. Разберёмся с рядом проблем и постараемся улучшить процесс. Затронем роль дизайнера и разработчика.

Если некоторые абзацы вам знакомы — смело пропускайте!

Форматы файлов

Существует несколько форматов изображений: jpg, tiff, png, webp, gif, svg и тд. Они разделяются на растровый и векторный форматы.

Нас не интересует растр. Наши изображения должны минимально весить и хорошо отображаться на любом устройстве, даже с дисплеем Retina. Поэтому говорить мы сегодня будем о векторе, а именно о формате svg.

SVG иконка = код

Да, вы не ослышались. Если вы смотрите на svg-изображение, то будьте уверены, что это 100% код.

Формат содержит специальную разметку, где указываются параметры: заливка, обводка, размер, точки на плоскости.

Любое svg-изображение можно открыть не только в режиме его просмотра, но и в любом текстовом редакторе.

Вот так мы видим иконку Figma в любом браузере, веб или мобильном:

А вот так она выглядит в коде:

<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.03769 3.78769C9.02226 2.80312 10.3576 2.25 11.75 2.25H20.25C21.6424 2.25 22.9777 2.80312 23.9623 3.78769C24.9469 4.77226 25.5 6.10761 25.5 7.5C25.5 8.89239 24.9469 10.2277 23.9623 11.2123C23.7656 11.409 23.5549 11.5885 23.3325 11.7498C24.646 12.704 25.5 14.2523 25.5 16C25.5 18.8995 23.1495 21.25 20.25 21.25C19.0228 21.25 17.8939 20.8289 17 20.1234V24.5C17 25.5384 16.6921 26.5534 16.1152 27.4167C15.5383 28.2801 14.7184 28.953 13.7591 29.3504C12.7998 29.7477 11.7442 29.8517 10.7258 29.6491C9.70738 29.4466 8.77192 28.9465 8.03769 28.2123C7.30347 27.4781 6.80345 26.5426 6.60088 25.5242C6.39831 24.5058 6.50227 23.4502 6.89963 22.4909C7.27123 21.5938 7.88381 20.8186 8.66778 20.25C8.4453 20.0887 8.23449 19.9091 8.03769 19.7123C7.05313 18.7277 6.5 17.3924 6.5 16C6.5 14.6076 7.05313 13.2723 8.03769 12.2877C8.23448 12.0909 8.44529 11.9113 8.66776 11.75C8.44529 11.5887 8.23448 11.4091 8.03769 11.2123C7.05313 10.2277 6.5 8.89239 6.5 7.5C6.5 6.10761 7.05313 4.77226 8.03769 3.78769ZM11.75 10.75C10.888 10.75 10.0614 10.4076 9.45191 9.7981C8.84241 9.1886 8.5 8.36195 8.5 7.5C8.5 6.63805 8.84241 5.8114 9.45191 5.2019C10.0614 4.59241 10.888 4.25 11.75 4.25H15V10.75H11.75ZM15 12.75H11.75C10.888 12.75 10.0614 13.0924 9.45191 13.7019C8.84241 14.3114 8.5 15.138 8.5 16C8.5 16.862 8.84241 17.6886 9.45191 18.2981C10.0614 18.9076 10.888 19.25 11.75 19.25H15V12.75ZM15 21.25H11.75C11.1072 21.25 10.4789 21.4406 9.9444 21.7977C9.40994 22.1548 8.99338 22.6624 8.74739 23.2563C8.50141 23.8501 8.43705 24.5036 8.56245 25.134C8.68785 25.7645 8.99738 26.3436 9.4519 26.7981C9.90643 27.2526 10.4855 27.5621 11.116 27.6876C11.7464 27.813 12.3999 27.7486 12.9937 27.5026C13.5876 27.2566 14.0952 26.8401 14.4523 26.3056C14.8094 25.7711 15 25.1428 15 24.5V21.25ZM20.25 12.75C18.4551 12.75 17 14.2051 17 16C17 17.7949 18.4551 19.25 20.25 19.25C22.0449 19.25 23.5 17.7949 23.5 16C23.5 14.2051 22.0449 12.75 20.25 12.75ZM17 10.75V4.25H20.25C21.112 4.25 21.9386 4.59241 22.5481 5.2019C23.1576 5.8114 23.5 6.63805 23.5 7.5C23.5 8.36195 23.1576 9.1886 22.5481 9.7981C21.9386 10.4076 21.112 10.75 20.25 10.75H17Z" fill="white"/>
</svg>

Работа в Figma

Иконки в вариантах

Об этом совсем недавно рассказывал Саша Окунев. Я тоже об этом немного расскажу, так как это часть процесса.

Некоторые дизайнеры избыточно используют фишку Figma — Variants, закидывая в них иконки. Это не удобно по ряду причин:

  • если иконок много, то в списке вариантов вы можете запутаться;
  • на превью компонента всегда будет одна и та же иконка, найти нужную будет сложно;
  • не будет поиска по названию, компонент всегда будет один;
  • при экспорте иконки, имена файлов будут соответствовать названию слоя, то есть содержать длинное свойство компонента, например так:
icon name=ArrowCircleUpLeft, size=32px.svg
Иконки через Figma Variants

Иконки отдельным компонентом

Лучше всего организовывать свою библиотеку с иконками отдельным компонентом, для более гибкого управления:

  • выгружать такие иконки легче и название файла будет понятно для всех;
  • легко можно найти в панели Assets, как по имени, так и по превью;
  • можно писать в начало названия компонента 16px, 24px и тд, тогда размерность иконок будет разложена по виртуальным папкам.
Иконки в Figma отдельным компонентом

Иконки в папках

Несколько советов по хранению иконок в проектах.

Здесь важно обратится к иерархии хранения компонентов. Figma раскладывает компоненты по папкам через Страница — Фрейм — Название компонента. Некоторые свойства иерархии можно миновать.

  • Если компоненты иконок лежат на странице icons, а название иконки heart, то в панели assets компонент будет лежать в папке icons/heart;
Компоненты иконок на странице icons
  • Если компоненты иконок лежат на странице icons, во фрейме с названием 24px, а название иконки heart, то в панели assets компонент будет лежать в папке icons/24px/heart;
Компоненты иконок в отдельном фрейме
  • Если компоненты иконок лежат на странице icons, а вы не хотите хранить иконки в отдельных фреймах, а просто на канвасе, при этом сохранить размерную иерархию, то добавьте к названию иконки 24px/heart. Тогда в панели assets компонент будет лежать в папке icons/24px/heart.
Компоненты иконок в размерной сетке

Если у вас в проекте несколько размерных сеток для иконок, то лучше всего раскладывать их по виртуальным папкам, так вам легче будет ориентироваться в компонентах и находить нужные.

  • Если у вас не так много компонентов и вы хотите держать их на одной странице, но хотите сохранить иерархию компонентов, то заведите страницу components (или как вам удобно), положите в нее все компоненты и назовите иконки полным адресом иерархии icons/24px/icon-name.
Компоненты на одной странице разделённые на группы

Возможно, вашим разработчикам понадобится всего лишь один размерный ряд, но об этом мы поговорим ниже, в видах использования иконок.

Стиль для иконок

К сожалению, на протяжении долгого времени Figma не может поправить прыжок цвета, после того, как мы подменяем инстанс иконки. Поэтому заведите отдельный цветовой стиль.

Это связано с тем, что порядок и количество слоёв у иконки меняется, когда мы подменяем одну другой. Figma не может смэтчить эти слои и красит в родительский цвет, которым покрашен главный компонент.

Чуть дальше мы рассмотрим почему так происходит и научимся объединять слои.

Изменение размера

Предположим, что имеем иконку в размере 16px, которую мы хотим увеличить до 24px. Заливки у иконок нет, а есть линии — Stroke.

Если попробовать изменить размер инструментом move, то размер иконки увеличится, а размер обводки (stroke) — нет. Иконка стала тоньше.

В Figma есть отличный инструмент Scale, с помощью которого мы можем поменять все свойства объекта пропорционально.

⚡️ Этот инструмент можно применять не только к иконкам, но и к любой векторной графике и элементам Figma, чтобы сохранять свойства и пропорции.

В панели инструментов зажимаем Move и выбираем Scale, либо нажимаем на горячую клавишу K и тянем иконку за угол с зажатым Shift, чтобы пропорционально изменить её размеры.

Изменение иконки через инструмент Scale

Размер иконки поменялся, а вместе с ним сохранила свои пропорции и толщина обводки.

Почему иконки делают через Stroke мы узнаем дальше.

Взаимодействие дизайнер — разработчик

Во взаимодействии дизайнера и разработчика бывают сложности в силу некоторых причин:

  • Дизайнеры — делают иконки разного размера, с дробными величинами, с лишними слоями.
  • Разработчики — не видят слои, прокликивают в иконку мимо квадратного фрейма и выгружают совсем не то, что нужно.

Сейчас по шагам разберём, какие проблемы могут вас ждать и как их решить.

Иконки во фрейме

Самая большая ошибка, которая может повлечь за собой большие переделки — не унифицировать иконки.

Геометрия у иконок разная: квадратная, прямоугольная вертикальная, прямоугольная горизонтальная. От этого могут не правильно отображаться компоненты, в которых есть иконка, если ее подменять. А еще может поехать верстка, потому что у разных иконок — разные размеры.

Решением такой проблемы — унификация всех компонентов. Достаточно положить иконки в квадратный фрейм фиксированного размера и проблема будет решена.

Размеры фреймов для иконок

Теперь внутри квадратного фрейма мы можем делать всё что угодно, добавлять иконки любого размера, даже с дробными числами. Главное, что обертка остается всегда фиксированного размера.

Иконки в квадратных фреймах лучше, чем просто иконки

Stroke иконки

В готовых паках можно встретить иконки оформленные через обводку. Дизайнеры, которые рисовали эти иконки оставили нам возможность для кастомизации их толщины.

Regular иконки могут быть с толщиной линии 1-1.5px, но вам может понадобится иконки чуть жирнее или менее интенсивнее. Тогда вы с легкостью, поменяв толщину обводки, измените их вид.

Изменение толщины иконки через Stroke

Но отдавать разработчику иконки в режиме stroke — плохая идея.

Как мы помним — svg это код. Когда браузер подгрузит иконку, у которой включена обводка, он может неправильно сделать рендер и тогда наша иконка в вебе будет выглядеть плохо. Например, при смене размера иконки в коде.

А ещё у иконки может быть несколько слоёв, каждый из которых отрисовывает определенную часть иконки.

Нам необходимо преобразовать обводку в фигуру (кривые), объединить все слои в группу и слить всё в один слой.

Слитые слои у иконки через Flatten Selection

Сделать это довольно просто:

  • выбираем иконку;
  • выделяем все слои в ней;
  • ПКМ — Outline Stroke
    или нажимаем горячую клавишу CMD (CTRL) + Shift + O;
  • В верхней панели булевых операций выбираем Union Selection или Flatten Selection.

Булевые операции в Figma: Union и Flatten

✨ Отличие Union Selection от Flatten Selection в том, что Union — редактируемая группа слоёв, в которую можно добавить элемент, удалить или подвинуть. Flatten — это монолитная фигура, соединённая точками.

Всё, наши слои стали фигурой и слиты в один. Это порадует разработчика потому что:

  • код изображения станет меньше, а значит легче, следовательно подгрузится быстрее на странице;
  • разработчик сможет их красить CSS-свойством Fill, но об этом поговорим ниже.

Выгрузка иконок разработчиком и блокировка слоёв

Теперь рассмотрим проблему со стороны фронта. Когда он заходит в наш проект с правами доступа can view, то разработчик не может гибко управлять выделением слоёв и кликает в то, что кликается первым.

Разработчик кликает в иконку и вместо квадратного фрейма выбирает как раз его внутренность — то есть иконку с рандомным размером. Квадратный фрейм он тоже может выбрать, но здесь играет роль человеческий фактор.

Разработчик пытается выгрузить иконку из Figma

Разрешить такую ситуацию поможет блокировка слоя с иконкой. Когда разработчик кликнет в заблокированные слои, то выбрать он их не сможет и выберет только квадратный фрейм.

⚡️ Важно: такой способ работает, только если речь идет о компоненте, который не вложен в какой-либо другой фрейм.

С заблокированными слоями у разработчика есть возможность выделить только общий фрейм с иконкой

Массовая выгрузка и лайфхак для лучшего взаимодействия

На одном из проектов иконки жили как самостоятельные изображения. Чтобы каждый раз не говорить разработчикам какие иконки мы сменили, не созваниваться и не обсуждать каждую, мы сократили коммуникацию и унифицировали процесс.

Вы можете самостоятельно подготовить все настройки для экспорта и просто рассказать разработчикам как это делать в пару кликов.

  • Заводим страницу с иконками или фрейм;
  • Выбираем иконки;
  • В правой панели нажимаем плюс, рядом с настройкой Export;
  • Настраиваем нужный формат, в данном случае SVG.

А дальше нам нужно зайти в Меню — File — Export. В открывшемся окне видим все изображения, которые можно выгрузить. Оставляем все или выбираем необходимые и сохраняем.

Теперь разработчику не нужно искать и выгружать «криво» иконки, достаточно простой манипуляции.

Помечаем иконки на экспорт для разработчика, после чего разработчик может выгружать их быстро, не прокликивая слои

Такой подход хорош в двух случаях:

  • если вы добавили новые иконки, то при выгрузке всех иконок разработчик увидит в репозитории новые файлы (если подключен Git, а скорее всего он подключен);
  • если вы перерисовали и заменили иконки, то при выгрузке они просто перезапишутся и отобразятся новые (при чем изменения разработчик увидит так же через Git).

Как видят разработчики новые и измененные файлы в среде разработке

⚡️ Важно: синхронизируйте названия иконок в Figma и названия иконок в проекте, чтобы иконки перезаписывались правильно.

Виды иконок в вебе

Бонусный блок для общего понимания, как работают иконки.

Если вы думаете, что изображения в вебе можно отображать только как самостоятельные картинки, то это не так. Сейчас мы рассмотрим несколько вариантов. Это не все способы, но самые популярные.

Самостоятельные изображения

Самостоятельные изображения, это когда каждая иконка хранится отдельным файлом. Ее можно добавить как в html-разметку, так добавить с помощью CSS-свойства background-image.

Так как мы говорим об svg, то такие иконки можно красить через свойство fill прямо в коде, а еще изменять размер.

Поэтому, если в вашем проекте хранятся несколько иконочных библиотек с разными размерами (например 16, 24 и 32px), то для кода будет достаточно одной. Все остальное можно настроить через CSS.

Но такой способ не очень удобен, если в библиотеке большое количество иконок.

Настройка svg-иконок через CSS

В тексте выше мы объединяли несколько объектов через flatten selection, чтобы свойство fill корректно красило наши иконки.

Такой фокус не прокатывает с png изображениями.

Спрайты иконок

Спрайт — одно изображение с сеткой иконок, которые отображаются на странице с помощью позиционирования и ID. Так же поддаются покраске, изменению фона и размера.

Большой отличительной чертой от самостоятельного изображения является скорость загрузки. В первом случае — каждая иконка загружается отдельно. В случае плохого интернета часть иконок может подгрузиться, а часть подвиснуть.

Спрайты работают как с svg, так и png. Отличаются только разными подходами. Сгенерировать svg-спрайт можно на сайте svgsprit.es

Забрасываем иконки и получаем спрайт:

<svg width="0" height="0" class="hidden">
        <symbol version="1.1" id="FigmaLogo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" xml:space="preserve" viewBox="0 0 32 32">
            <path d="M23.3,11.7c0.2-0.2,0.5-0.3,0.7-0.5c1-1,1.5-2.3,1.5-3.7S24.9,4.8,24,3.8c-1-1-2.3-1.5-3.7-1.5H16h-4.2
            C10.4,2.2,9,2.8,8,3.8c-1,1-1.5,2.3-1.5,3.7s0.6,2.7,1.5,3.7c0.2,0.2,0.4,0.4,0.7,0.5c-0.2,0.2-0.5,0.3-0.7,0.5
            c-1,1-1.5,2.3-1.5,3.7s0.6,2.7,1.5,3.7c0.2,0.2,0.4,0.4,0.7,0.5c-0.8,0.6-1.4,1.3-1.8,2.2c-0.4,1-0.5,2-0.3,3c0.2,1,0.7,2,1.4,2.7
            c0.7,0.7,1.7,1.2,2.7,1.4c1,0.2,2.1,0.1,3-0.3c1-0.4,1.8-1.1,2.4-1.9c0.6-0.9,0.9-1.9,0.9-2.9v-4.2v-0.2c0.9,0.7,2,1.2,3.2,1.2
            c2.9,0,5.2-2.4,5.2-5.2C25.5,14.2,24.6,12.7,23.3,11.7z M22.5,5.2c0.6,0.6,1,1.4,1,2.3s-0.3,1.7-1,2.3s-1.4,1-2.3,1H17V4.2h3.2
            C21.1,4.2,21.9,4.6,22.5,5.2z M9.5,9.8c-0.6-0.6-1-1.4-1-2.3s0.3-1.7,1-2.3s1.4-1,2.3-1H15v6.5h-3.2C10.9,10.8,10.1,10.4,9.5,9.8z
            M9.5,13.7c0.6-0.6,1.4-1,2.3-1H15v6.5h-3.2c-0.9,0-1.7-0.3-2.3-1s-1-1.4-1-2.3S8.8,14.3,9.5,13.7z M15,24.5c0,0.6-0.2,1.3-0.5,1.8
            c-0.4,0.5-0.9,1-1.5,1.2c-0.6,0.2-1.2,0.3-1.9,0.2c-0.6-0.1-1.2-0.4-1.7-0.9c-0.5-0.5-0.8-1-0.9-1.7c-0.1-0.6-0.1-1.3,0.2-1.9
            c0.2-0.6,0.7-1.1,1.2-1.5c0.5-0.4,1.2-0.5,1.8-0.5H15V24.5z M20.2,19.2c-1.8,0-3.2-1.5-3.2-3.2c0-1.8,1.5-3.2,3.2-3.2
            s3.2,1.5,3.2,3.2C23.5,17.8,22,19.2,20.2,19.2z"></path>
        </symbol>
        <symbol version="1.1" id="TelegramLogo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" xml:space="preserve" viewBox="0 0 32 32">
            <path d="M29.5,4.9c-0.1-0.3-0.3-0.7-0.6-0.9c-0.1-0.1-0.2-0.2-0.4-0.2c0,0,0,0,0,0c-0.2-0.1-0.4-0.2-0.6-0.2c-0.4-0.1-0.7,0-1.1,0.1
            L3.8,12.7c-0.8,0.3-1.3,1.1-1.3,2c0.1,0.9,0.7,1.6,1.6,1.8l5.9,1.2V25c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.5,0.6,0.9,0.7
            c0.2,0.1,0.5,0.1,0.8,0.1c0.1,0,0.3,0,0.4,0c0.4-0.1,0.7-0.3,1-0.6l3.2-3.2l4.9,4.3c0.3,0.2,0.6,0.4,0.9,0.5c0.1,0,0.3,0,0.4,0
            c0.2,0,0.4,0,0.6-0.1c0.3-0.1,0.6-0.3,0.9-0.6c0.2-0.3,0.4-0.6,0.5-0.9l4.7-20.5C29.6,5.6,29.6,5.2,29.5,4.9z M22,7.7l-11.3,8.1
            l-6.2-1.3L22,7.7z M12,25v-5.9l3.2,2.8L12,25z M22.9,26l-10.3-9.1L27.4,6.2L22.9,26z"></path>
        </symbol>
    </svg>

А дальше пользуемся короткими вставками кода привязываясь к ID-иконки:

<svg class="icon">
   <use xlink:href="#FigmaLogo"></use>
</svg>
<svg class="icon">
   <use xlink:href="#TelegramLogo"></use>
</svg>

Мы так же можем менять размер svg-иконки, заливку и обводку:

SVG-спрайты в работе

Иконочный шрифт

Когда вы читаете текст — вы видите буквы, которые подгружаются из файла шрифта. Технически, буквы это такой же вектор как и иконки.

Существуют сервисы, которые генерируют шрифты на основе ваших иконок. Буква на клавиатуре или так называемый юникод, соответствует иконке в шрифте. Вы получаете файлы в формате веб-шрифтов: TTF, EOT, WOFF и SVG.

Иконки подключаются как обычный шрифт и управляются в вебе как текст, с помощью свойств color и font-size.

Минусом такого подхода является слабый интернет. В момент загрузки страницы вместо иконок вы можете наблюдать буквы «a, b, c…«, пока шрифт с иконками не подгрузится и не отобразится.

В целом такой подход некоторые разработчики не приветствуют, аргументируя это дополнительной загрузкой страницы и недоступностью для скринридеров, которые не могут прочитать альтернативную подпись к изображению.

Создать иконочный шрифт можно с помощью сервиса fontastic.me. Не буду подробно останавливаться на этом моменте, сервис имеет человеко-понятный интерфейс:

  • создаем шрифт;
  • называем его на латинице как необходимо;
  • добавляем иконки
  • настраиваем;
  • скачиваем и подключаем к проекту.

Вы получаете готовый код, который остается просто подключить к проекту и начать использовать. Сервис генерирует демо с иконками и их отношением к шрифту.

Соответствие иконок названию в коде и символам в шрифте

После того как всё подключили, можно добавлять иконки на страницу через тег <i>, <span>, <div> или подключать в CSS через background-image.

Работа с иконочным шрифтом через обычные CSS-свойства

Заключение

Я постарался максимально вложить в эту статью все свои знания по процессу работы с иконками в инструменте и их дальнейшей передачей.

Такие подходы позволяют мне сократить время общения с разработкой и улучшить процесс взаимодействия.

Способы не исчерпывающие и наверняка, у вас найдется еще 1000 и 1 способ, как улучшить взаимодействие при передаче иконок. Обязательно поделитесь им в комментариях.

Чтобы не пропускать новый материал, подпишись на телеграм-канал Мамкин Дизайнер

Гарнитура Gilroy приобретена в компании «Паратайп» в двух лицензиях «Веб» и «Десктоп».

В SVG заливка и обводка имеют много разных интересных опций, которые предоставляют возможности гораздо шире того, что есть в CSS.

Например, можно нарисовать SVG-паттерн и использовать его не только в заливке, но и в обводке. Заливке и обводке можно указывать разную прозрачность, также можно управлять пунктирной обводкой, на чем можно построить интересные анимированные эффекты.

В качестве заливки и обводки можно задавать none, цвета, ключевые слова (currentColor и transparent), а также градиенты и паттерны.

fill

Заливка элемента.

Возможные значения: none, ключевые слова, цвета, паттерны и градиенты.
Значение по умолчанию — black.

<svg width="200" height="200">
  <defs>
    <symbol id="s-rect">
      <rect width="70" height="70"/>
    </symbol>
    <linearGradient id="g-green"
      x1="0%" y1="0%"
      x2="0%" y2="90%"
    >
      <stop offset="0%" stop-color="yellowgreen" />
      <stop offset="90%" stop-color="green" />
    </linearGradient>
  </defs>

  <use xlink:href="#s-rect"
    x="20" y="20"
    fill="hsla(348, 83%, 47%,.3)"/> <!-- HSLA -->
  <use xlink:href="#s-rect"
    x="110" y="20"
    fill="rgb(255, 215, 0)"/> <!-- RGB -->
  <use xlink:href="#s-rect"
    x="20" y="110"
    fill="url(#g-green)"/> <!-- Градиент -->
  <use xlink:href="#s-rect"
    x="110" y="110"
    fill="skyblue"/> <!-- Цвет по названию -->
</svg>

fill-rule

Свойство определяет как будут заливаться сложные фигуры, имеющие пересечения внутри себя. Для простых фигур ни на что не влияет.

Возможные значения: nonzero, evenodd

fill-rule="nonzero" интересно ведет себя для фигур из двух путей. Например, если внешний круг нарисован по часовой стрелке, а внутренний в обратном направлении, центральный круг останется без заливки (слева). Если же оба круга нарисованы в одном направлении — фигура зальется полностью (справа):

fill-opacity

Управление прозрачностью заливки. Можно задавать значения от 0.0 до 1.0 или в процентах. Правда, Firefox не любит значения в процентах для градиентов (пруфлинк, смотреть в FF).

<!-- ... -->
<use xlink:href="#s-rect"
  x="20" y="20"
  fill="url(#g-red)" fill-opacity=".5"/>
<use xlink:href="#s-rect"
  x="50" y="50"
  fill="hsl(50, 100%, 50%)" fill-opacity=".5"/>
<use xlink:href="#s-rect"
  x="80" y="80"
  fill="url(#g-green)" fill-opacity=".5"/>
<!-- ... -->

stroke

Цвет обводки. Значения по умолчанию нет.

<svg width="200" height="200">
  <rect width="160" height="160" x="20" y="20"
    fill="none"
    stroke="yellowgreen"/>
</svg>

stroke-width

Толщина обводки, можно задавать в единицах длины или в процентах.
Значение по умолчанию: 1.

<svg width="200" height="200">
  <rect width="100" height="100" x="50" y="50"
    fill="none" stroke="gold"
    stroke-width="10"/>
  <rect width="160" height="160" x="20" y="20"
    fill="none" stroke="yellowgreen"
    stroke-width="10%"/>
</svg>

stroke-linecap

Свойство определяет как будут выглядеть концы линий.
Возможные значения: butt, round, square.
Значение по умолчанию: butt.

<!-- ... -->
  <use xlink:href="#s-path" stroke="orangered" y="20"
    stroke-linecap="butt"/>

  <use xlink:href="#s-path" stroke="olivedrab" y="85"
    stroke-linecap="round"/>

  <use xlink:href="#s-path" stroke="steelblue" y="150"
    stroke-linecap="square"/>
<!-- ... -->

stroke-linejoin

Определяет как будут выглядеть соединения линий на углах.
Возможные значения: miter, round, bevel.
Значение по умолчанию: miter.

<!-- ... -->
  <use xlink:href="#s-corner" stroke="orangered" y="0"
    stroke-linejoin="miter"/>

  <use xlink:href="#s-corner" stroke="olivedrab" y="80"
    stroke-linejoin="round"/>

  <use xlink:href="#s-corner" stroke="steelblue" y="160"
    stroke-linejoin="bevel"/>
<!-- ... -->

stroke-dasharray

Управляет видом пунктирной обводки. Можно задавать в единицах длины или в процентах.
Если задано одно значение, второе значение считается равным первому. Например, stroke-dasharray="1" нарисует линию из отрезков длиной одну единицу разделенных пробелами такой же ширины.

Примеры разных пунктирных линий:

<svg width="300" height="160">
  <path d="M 20 20 h 260"
    stroke="purple" stroke-width="1"
    stroke-dasharray="1" />
  <path d="M 20 40 h 260"
    stroke="mediumspringgreen" stroke-width="15"
    stroke-dasharray="1 3" />
  <path d="M 20 60 h 260"
    stroke="orangered" stroke-width="1"
    stroke-dasharray="5%" />
  <path d="M 20 80 h 260"
    stroke="green" stroke-width="1"
    stroke-dasharray="1 5" />
  <path d="M 20 100 h 260"
    stroke="steelblue" stroke-width="1"
    stroke-dasharray="2 7 6" />
  <path d="M 20 120 h 260"
    stroke="orange" stroke-width="5"
    stroke-dasharray="5" />
  <path d="M 20 140 h 260"
    stroke="mediumseagreen" stroke-width="1"
    stroke-dasharray="12% 5%" />
</svg>

Используя обводку и простые фигуры можно получить удивительные вещи:

Также stroke-dasharray интересно сочетается с анимацией:

stroke-dashoffset

Свойство позволяет задать смещение пунктирной обводки относительно первоначального положения. Значение задается в единицах длины или в процентах, значения могут быть отрицательными.
Значение по умолчанию: 0.

В этом примере оранжевые и желтые линии смещены относительно красной с помощью разных значений stroke-dashoffset:

<svg width="270" height="270">
  <g class="g-circles" fill="none"
    stroke-width="15"
    stroke-dasharray="25% 110%"
    transform="rotate(72 135 135)">
    <circle r="115" cx="135" cy="135"
      stroke="crimson"/> <!-- Красная обводка без смещения -->
    <circle r="115" cx="135" cy="135"
      stroke="orangered"
      stroke-dashoffset="25%"/> <!-- Оранжевая обводка смещена на 25% -->
    <circle r="115" cx="135" cy="135"
      stroke="gold"
      stroke-dashoffset="50%"/> <!-- Желтая обводка смещена на 50% -->
  </g>
</svg>

Сочетая stroke-dashoffset и stroke-dasharray можно получить интересные эффекты.

Для полноценного просмотра воспользуйтесь браузерами на Webkit. Ссылка на полную версию.

Для перезапуска нажмите Rerun.

Несколько вдохновляющих ссылок про анимацию на stroke-dashoffset:

  • How SVG Line Animation Works
  • Animated line drawing in SVG
  • SVG Drawing Animation

stroke-opacity

Прозрачность обводки. Задаются значения от 0.0 до 1.0.

<svg width="200" height="200">
  <g class="g-circles" fill="none"
    stroke-width="15">
    <circle r="40" cx="60" cy="60"
      stroke="crimson"
      stroke-opacity=".7"/>
    <circle r="55" cx="100" cy="100"
      stroke="orangered"
      stroke-opacity=".5" />
    <circle r="40" cx="140" cy="140"
      stroke="gold"
      stroke-opacity=".25"/>
  </g>
</svg>

Анимация обводки позволяет получить совершенно удивительные вещи. Правда, я в своих примерах использовала CSS (и это демо не играет в Firefox) и SVG-анимацию, которая работает таки везде, но задается странно, длинно и неудобно. Думаю, что оптимальнее всего для анимации SVG использовать JavaScript-библиотеки.

SVG предлагает широкий диапазон свойств, отвечающих за стиль контуров графических фигур. Эти свойства имеют вид «stroke-*«. Здесь мы рассмотрим следующие свойства:

  • stroke
  • stroke-width
  • stroke-linecap
  • stroke-dasharray

Все эти свойства могут использоваться со всеми видами линий, текста и контурами графических фигур, вроде круга.

SVG свойство stroke

Свойство stroke определяет цвет линии, текста или контура (обводки) элемента:

Ваш браузер не поддерживает HTML тег SVG.

SVG код:


<svg height="80" width="300">
   <g fill="none">
     <path stroke="red" d="M5 20 l215 0" />
     <path stroke="black" d="M5 40 l215 0" />
     <path stroke="blue" d="M5 60 l215 0" />
   </g>
</svg> 

SVG свойство stroke-width

Свойство stroke-width определяет толщину линии, текста или контура (обводки) элемента:

Ваш браузер не поддерживает HTML тег SVG.

SVG код:


<svg height="80" width="300">
   <g fill="none" stroke="black">
     <path stroke-width="2" d="M5 20 l215 0" />
     <path stroke-width="4" d="M5 40 l215 0" />
     <path stroke-width="6" d="M5 60 l215 0" />
   </g>
</svg> 

SVG свойство stroke-linecap

Свойство stroke-linecap определяет различные типы концов открытых линий:

Ваш браузер не поддерживает HTML тег SVG.

SVG код:


<svg height="80" width="300">
   <g fill="none" stroke="black" stroke-width="6">
     <path stroke-linecap="butt" d="M5 20 l215 0" />
     <path stroke-linecap="round" d="M5 40 l215 0" />
     <path stroke-linecap="square" d="M5 60 l215 0" />
   </g>
</svg> 

SVG свойство stroke-dasharray

Свойство stroke-dasharray используется для создания прерывистых линий:

Ваш браузер не поддерживает HTML тег SVG.

SVG код:


<svg height="80" width="300">
   <g fill="none" stroke="black" stroke-width="4">
     <path stroke-dasharray="5,5" d="M5 20 l215 0" />
     <path stroke-dasharray="10,10" d="M5 40 l215 0" />
     <path stroke-dasharray="20,10,5,5,5,10" d="M5 60 l215 0" />
   </g>
</svg>

Можно ли как-то избежать расширения треугольника наружу? Чтобы при
увеличении толщины, увеличивался размер только внутри

Увеличение внешнего размера треугольника при увеличении толщины stroke-width линии происходит из-за симметричного увеличения толщины линии в обе стороны от осевой линии.

Нужно обрезать внешнюю часть линии от осевой, а внутреннюю часть отставить.

Решить эту задачу можно с помощью использования двух полигонов.
Один полигон будет взят в качестве основы, второй полигон будет применён в качестве маски к первому полигону.

Представьте, что вы имеете треугольник, в котором выдавливаете треугольником меньшего размера треугольное отверстие. Так как у первого треугольника мы не увеличиваем толщину линии, то и увеличение общего размера треугольника не будет.

При уменьшении внутреннего треугольника толщина линии будет расти.

Маска при fill="black" прорезает треугольное отверстие. При stroke="white" становится видна линия.

<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400"  >
    
   <defs>
   <mask id="msk"> 
    <rect width="100%" height="100%" fill="white" />
     <polygon  id="inner" fill="black" stroke-width="4" stroke="white" points="171.14 230.86,200 171.14,230.86 230.86">
       
     </polygon>
   </mask>  
   
  </defs>  
   <rect width="100%" height="100%" fill="wheat" />
 <!-- Первый треугольник полностью закрашен в красный цвет и к нему применена маска, которая вырезает треугольное отверстие, оставляя видимой только внутреннюю ширину линии  -->    
<polygon id="poly"  mask="url(#msk)" fill="red" stroke="none"  points="171.14 230.86,200 171.14,230.86 230.86"></polygon>
</svg> 

Пример анимации, показывающий, как при росте ширины линии stroke-width маски, растёт внутренняя толщина линии, без увеличения общего размера треугольника.

<polygon  id="inner" fill="black" stroke-width="2" stroke="white" points="171.14 230.86,200 171.14,230.86 230.86">
       <animate attributeName="stroke-width" begin="svg1.click" dur="5s" values="2;24" fill="freeze" />
</polygon>

Полный код анимации

Из примера видно, что толщину линии stroke-width можно увеличивать, пока она не закрасит весь треугольник.

Выберите значение stroke-width, чтобы обеспечить необходимую толщину линии.

I have collected SVG icons from different sources. Some use thick paths and shapes. Others use thin ones.

Is there a way to change the thickness of paths and shapes in an SVG without having to adjust all the points in the object?

enter image description here

asked Jul 19, 2019 at 14:36

Marc Bolh's user avatar

1

It would depend on how the graphics were constructed.

If it’s made of simple strokes, then you could just apply a thinner stroke.

If the strokes have been converted to outlines, all bets are probably off. In this case it would be easier to redraw them as strokes, and apply a thinner stroke.

I don’t use Sketch, but the example below was done in Inkscape. I redrew the shapes with the Bézier/Pen tool, and changed the stroke size. It should also be possible in Sketch

enter image description here

answered Jul 19, 2019 at 15:27

Billy Kerr's user avatar

Billy KerrBilly Kerr

78.1k6 gold badges68 silver badges155 bronze badges

1

Sketch doesn’t have strokes. To make a line icon in Sketch you need to make a smaller version of a path (shape) and change the fill color.

To fix the problem, I had to ungroup the paths, remove the fill color, add a border and increase the thickness.

enter image description here

answered Jul 26, 2019 at 12:48

Marc Bolh's user avatar

Marc BolhMarc Bolh

1651 silver badge7 bronze badges

If you want to make a path thicker, here’s an engineer’s approach.

Open the SVG file in a text editor (say, Notepad) and look for <path. Add the following text right after <path : stroke="color" stroke-width="width", where:

  • color should be the same color as the path. It can be explicitly defined (for instance #000 for black) or set to currentColor, meaning the color of a container.
  • width is how much the path should be thicker. Try numbers between 1 and the viewBox width (512 in my example below).

The SVG should start looking as this:

<svg id="svg-repo-html5" class="svg-repo-html5" viewBox="0 0 512 512">
<path stroke="currentColor" stroke-width="10"

Sometimes it’s a way better just to quickly edit a file than opening it in a WYSIWYG editor.

Unfortunately, you cannot make the path thinner this way.

answered Jul 12, 2022 at 13:10

Shtole's user avatar

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить толстое лицо
  • Как изменить токсичного человека
  • Как изменить токсика
  • Как изменить токен телеграмм бота
  • Как изменить токен бота telegram

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии