Хорошее понимание SVG — редкий навык. Удивительно часто, SVG рассматривается как просто другой формат изображения. Мы используем SVG из-за его масштабируемости и меньшего размера файла, но на самом деле SVG гораздо больше!
В этой статье я расскажу о трех самых популярных инструментах дизайна: Adobe Illustrator, Sketch и фиг. Существуют также другие инструменты, поддерживающие SVG, которые могут иметь другие функции и реализовывать другие решения.
Примечание : Если не указано иное, содержание этой статьи относится к SVG 1.1 2-е издание. Некоторые из пунктов, обсуждаемых ниже, не будут применяться к SVG 2, однако он все еще не достиг статуса рекомендации, оставляя SVG 1.1 самой современной спецификацией.
Зачем беспокоиться о Средства разработки?
SVG является языком разметки на основе XML и, как и любой другой язык программирования, может быть написан и отредактирован в текстовом редакторе. Таким образом, теоретически, в отличие от файлов JPG или PNG, нам не нужно никакого программного обеспечения с графическим интерфейсом для создания SVG. Однако в подавляющем большинстве случаев использование приложений графического дизайна неизбежно.
Работа со сложными фигурами и графикой в текстовом формате совершенно возможна, но обычно это будет очень сложно и утомительно. Поэтому обычной практикой является использование таких приложений, как Adobe Illustrator, Sketch или Figma, для визуального проектирования графики, а затем их экспорта в формат SVG.
Так что не важно, являетесь ли вы дизайнером, который кодирует или проектирует -сознательный разработчик, хорошее знание работы с SVG требует немного знаний с обеих сторон: инструментов проектирования и самого языка SVG. Чтобы лучше понять взаимосвязь между ними, давайте подробнее рассмотрим, что могут предложить приложения графического дизайна и как их функции переводятся в SVG.
Основные формы
Многие векторные графики созданы из нескольких основных форм — сгруппированы, преобразованы и объединены друг с другом. В приведенной ниже таблице представлены инструменты формы, доступные в Illustrator, Sketch и Figma, и какие SVG-элементы они экспортируют.
Illustrator | Sketch | Figma | Сгенерированный SVG | |
---|---|---|---|---|
Ellipse Tool | Овальный | 191935] Ellipse | или |
|
Прямоугольный инструмент | Прямоугольник | |
||
Rounded Rectangle Tool | Rounded | — | |
|
Инструмент сегмента линии | Линия | Линия | (Иллюстратор и Фигма) (Эскиз) |
|
— | Стрелка | Стрелка | |
|
Инструмент Polygon | Polygon | Polygon | | |
Star Tool | Star | Star | (Иллюстратор и эскиз) (Фигма) |
|
- | Треугольник | - | |
Эллипсы и круги
Одной из основных форм в каждом инструменте проектирования является эллипс. В SVG мы найдем соответствующий элемент
определяемый координатами центра эллипса ( cx
и cy
) и двумя радиусами ( ] rx
и ry
).
Так выглядит эллипс в SVG:
Весьма особый тип эллипса - круг. Круг - это эллипс с радиусами rx
и ry
равными друг другу. SVG имеет свой собственный элемент
который принимает один атрибут меньше, поскольку учитывается только один радиус:
В случае эллипсов и кругов все инструменты дизайна работают одинаково: Ellipse Tool в Illustrator, Овальный инструмент в Sketch и Ellipse в Figma будут генерировать элемент
если радиусы не равны: в таких случаях мы получим элемент
.
Прямоугольники и скругленные прямоугольники
Еще одна базовая форма, общая для всех инструментов дизайна, - это прямоугольник. В случае всех инструментов проектирования, использование инструмента прямоугольник создает элемент
в SVG. Базовые
определяются 4 атрибутами: его x
и y
координаты, наряду с его шириной и высотой:
]
Обратите внимание, что в то время как
положение определяется их геометрическими центрами, положение
определяется координатами его верхнего левого угла.
Помимо основных прямоугольников, мы часто используем прямоугольники с закругленными углами. Во всех трех инструментах проектирования вы можете превратить прямоугольник в скругленный прямоугольник, применив к нему радиус границы на панели Инспектор или на панели Свойства .
Кроме того, в Sketch и Illustrator имеются инструменты, предназначенные для создания прямоугольников со скругленными углами ( Rounded Rectangle Tool в Illustrator и инструмент Rounded в Sketch). Однако нет никакой разницы между обычным прямоугольником с примененным радиусом и скругленным прямоугольником, нарисованным с помощью инструмента Rounded Rectangle .
Следовательно, независимо от того, как он был создан, прямоугольник со скругленными углами будет экспортироваться с использованием следующий синтаксис:
В этом случае rx
является атрибутом, отвечающим за радиус закругленных углов:
Скругленные прямоугольники с эллиптическими углами
Одно существенное различие между инструментами проектирования и
Одно существенное отличие инструментов проектирования и SVG - это то, как определяются радиусы. Во всех инструментах проектирования, которые мы рассматриваем, радиус границы определяется одной переменной. Мы можем думать о радиусах границ как о маленьких кружках, используемых для маскировки углов наших прямоугольников:
Между тем, в SVG радиусы границ могут быть определены двумя атрибутами: rx
(как в примере выше) и ry
. Они позволяют нам создавать прямоугольники с эллиптическими углами. Вы можете думать о таких закругленных углах, как эллипсы, используемые в качестве масок вместо кругов:
Таким образом, в этом случае SVG предлагает вам больше возможностей, чем инструменты дизайна.
Примечание : Даже хотя это не совсем относится к теме этой статьи, стоит отметить, что описанная выше разница относится как к SVG, так и к HTML / CSS. Свойство CSS border-radius
которое используется для стилей узлов, таких как div и span, также позволяет создавать эллиптические углы. Вы можете увидеть пример ниже.
border-radius: 10px 5% / 20px 25em 30px 35em;
Значения до косой черты ([ /
) - горизонтальные радиусы (эквивалент rx
), а значения после косой черты - вертикальные значения (эквивалент ry
).
Скругленные прямоугольники с несколькими радиусами
В инструментах дизайна, так же как и в CSS, каждый из углов прямоугольника может управляться отдельно. Другими словами, каждый угол может иметь свой собственный радиус (или вообще не иметь радиус). Такая операция невозможна для элемента
в SVG. Каждый элемент
имеет только один атрибут rx
и один ry
. Если вы создаете прямоугольник с несколькими радиусами, примененными к его углам, инструмент проектирования сгенерирует элемент
вместо элемента
. Мы поговорим подробнее об элементе
в следующем разделе.
Гладкие углы
Одной из интересных особенностей, представленных Sketch и Figma не так давно, является гладкие углы. Короче говоря, гладкие углы используют неправильный радиус границы для достижения результата, который выглядит более естественным и, в общем, гладким. Наиболее распространенное приложение сглаживания углов - это иконки приложений и другие закругленные элементы на iOS. Apple использовала «обычные» закругленные углы на своей мобильной платформе до iOS6, а затем переключилась на то, что мы сегодня называем «гладкими» углами, как часть большого редизайна, представленного в 2013 году (iOS7).
В Sketch вы можете добиться эффекта гладких углов, переключаясь между Round Corners и Гладкие углы в Инспектор . Figma дает вам еще больший контроль над вашими углами, поскольку вы можете управлять уровнем плавности в меню Сглаживание углов .
К сожалению, ни один из них не может быть легко переведен в SVG как SVG вообще не знает концепции гладких углов. Есть также важное различие между тем, что делают Sketch и Figma, если вы пытаетесь экспортировать прямоугольник с гладкими углами в SVG.
Figma игнорирует сглаженные углы и экспортирует прямоугольник как обычный
элемент с закругленными углами. С другой стороны, Sketch экспортирует прямоугольник со сглаженными углами как
который пытается воспроизвести истинную форму гладких углов. Таким образом, Figma дает нам худшую точность ради сохранения прямоугольника в виде прямоугольника, а Sketch стремится к максимально возможной точности за счет семантики и большего размера файла. Если вы хотите лучше понять, что означает это различие, мы немного глубже рассмотрим плюсы и минусы сохранения основных форм.
Линии
Следующий базовый тип элемента это линия. В этом случае мы называем линию одной прямой линией, идущей из точки А в точку Б.
Illustrator, Sketch и Figma предлагают собственные инструменты для рисования линий.
В SVG у нас есть элемент
. Требуются четыре его атрибута: координаты его начальной точки и координаты его конечной точки:
Когда дело доходит до экспорта, Illustrator и Figma будут экспортировать строки как элементы
а Sketch всегда будет вычислять строки
элементов.
Полилинии
Теперь давайте посмотрим на полилинии. Полилиния - это связная серия прямых. У полилиний нет специальных инструментов в инструментах дизайна. Их можно нарисовать с помощью инструмента Pen (в Illustrator и Figma) или с помощью инструмента Vector (в Sketch).
В SVG полилинии определяются с помощью элемент
.
рисуется с использованием атрибута points
который представляет собой список координат, определяющих все точки, которые создают ломаную линию. Давайте рассмотрим пример полилинии, состоящей из трех сегментов и четырех точек:
Illustrator и Sketch переводят полилинии в элементы
в то время как Figma экспортирует полилинии как
s.
[
Стрелки
Во всех трех инструментах вы можете контролировать концы линий, превращая их в стрелки и тому подобное. И все три инструмента будут экспортировать такие строки как
с, даже если без примененных колпачков одинаковые формы будут переведены в
с или
с. Это потому, что SVG не поддерживает стрелки? Не совсем.
На самом деле, в спецификации SVG имеются настраиваемые концы линий, которые называются маркерами. Однако ни один из упомянутых нами инструментов проектирования не использует маркеры в создаваемой ими SVG.
является отдельным элементом SVG, который может быть определен в SVG
и затем использован в
и
элементы с атрибутами маркера: marker
marker-start
marker-mid
и marker-end
. Если вы хотите больше узнать об этих атрибутах, я бы порекомендовал вам ознакомиться с официальной документацией W3C.
Полигоны и звезды
Последняя базовая форма, которую мы рассмотрим это многоугольник. Многоугольник представляет собой замкнутую форму из прямых линий, например, звезда или шестиугольник. Вы также можете думать об этом как о замкнутой ломаной линии. Синтаксис элемента
в SVG на самом деле такой же, как у
. Единственное различие между ними состоит в том, что в
последняя точка в списке всегда связана с первой точкой, которая делает
замкнутой формой.
Некоторые многоугольники являются правильными многоугольниками. Что особенного в правильных многоугольниках, так это то, что все их стороны и углы равны. Чтобы нарисовать правильные многоугольники, такие как шестиугольник или пятиугольник, вы можете использовать инструмент Многоугольник такой же, как в Illustrator, Sketch и Figma. Инструменты Polygon в Illustrator и Sketch будут генерировать элементы
в SVG. В Figma, с другой стороны, все формы, сделанные с помощью инструмента Polygon приводят к элементам
.
Все три инструмента дизайна также имеют выделенные Звезда инструменты для рисования звезд. Однако когда дело доходит до экспорта, формы, созданные с помощью инструментов Star ведут себя точно так же, как формы, созданные с помощью инструментов Polygon . В SVG звезды - это просто многоугольники, там НЕТ элемента ~~
.
Важно помнить, что Star и Polygon инструменты используются для создания правильных звезд и многоугольников, в то время как элемент
в SVG может использоваться для любого многоугольника, регулярного или неправильного.
Все дороги, ведущие к
Как мы уже узнали, в SVG есть три основных фигуры, предназначенные для рисования фигур, сделанных из прямых линий:
и
. Но что, если мы хотим, чтобы наши линии были изогнуты? Настало время поговорить об элементе
.
Элемент
] - самый универсальный элемент SVG. Его можно использовать для рисования любой возможной линии и формы, включая, но не ограничиваясь, все основные формы, перечисленные выше. Фактически, каждая базовая фигура (
) можно описать как элемент
. Более того, есть много фигур, которые можно создать с помощью
но невозможно создать с помощью любого другого элемента SVG. Чтобы узнать больше о
и его синтаксисе, я бы порекомендовал вам проверить эту прекрасную статью Криса Койера.
Теперь, как мы создаем
элементы в средствах проектирования? Прежде всего, как мы узнали выше, некоторые слои, созданные с помощью инструментов формы, вычисляют элементы
хотя теоретически они могут быть другими элементами (например, Figma экспортирует все полигоны как
с, хотя они могли быть определены как
с. Затем, любую другую неправильную форму мы рисуем с помощью инструмента Pen или Vector инструмент должен быть экспортирован как
так как нет другого SVG-элемента, который мог бы их определять. Наконец, в Sketch и Figma мы можем преобразовать любую базовую фигуру в слой, который вычисляется в
. В Sketch это можно сделать, выбрав Layer> Combine> Flatten тогда как в Figma эту функцию можно найти в Object> Flatten Selection (] + E в macOS, Ctrl + E в Windows).
Булевы операции
Булевы операции - это функции, выполняемые над фигурами для объединения их несколькими различными способами. В Illustrator, Sketch и Figma есть 4 стандартных логических операции:
- Union (Unite)
Сумма фигур - Вычитание (Минус спереди)
Форма дна, вычитаемая из общей области между фигурами - Пересечение
Общая область между фигурами - Разница (исключая)
Сумма фигур, вычтенных из общей области между фигурами.
В Illustrator все эти функции генерируют одну фигуру (контур). Это действие, которое не может быть отменено - иначе как использование Undo ( ⌘ + Z в macOS, Ctrl + Z в Windows). В Sketch и Figma, с другой стороны, логические операции создают группы слоев, которые впоследствии можно разгруппировать без какого-либо вреда для фигур внутри. Однако вы можете объединить эти группы в одну фигуру, чтобы получить аналогичный результат, как в Illustrator, используя функции Flatten упомянутые в предыдущем абзаце.
Вопрос в том, поддерживает ли SVG логические операции? Нет, это не так. Они просто сливаются. Поэтому каждая комбинированная фигура, созданная вами с помощью логических операций в Figma или Sketch, будет экспортирована как один элемент
.
Она выглядит одинаково, так почему она имеет значение?
С точки зрения того, как различные формы могут быть определены в SVG, его синтаксис чрезвычайно универсален. Давайте рассмотрим базовый прямоугольник:
Такую форму можно определить в SVG несколькими разными способами. Это может быть элемент
элемент
. Это, безусловно, может быть элемент
(поскольку все может быть элементом
). Он также может быть элементом
(или элементом
), если мы решим создать его с использованием штрихов вместо заливок.
Каждый из этих элементы представляют прямоугольник, который выглядит точно так же:
прямоугольник | |
многоугольник | |
линия | |
путь | например, или |
Но, если конечный результат (рисунок, представленный пользовательским агентом в браузер) выглядит так же, действительно ли имеет значение, какой подход мы выбираем? Ну, это так. Как правило, я всегда рекомендовал бы использовать основные формы, где это возможно.
И последнее, но не менее важное: используйте наиболее очевидные формы для данного случая. Например, не создавайте прямоугольники с линиями или кругами с прямоугольниками, если у вас нет веской причины. За этим стоит как минимум несколько аргументов:
- Семантика / удобочитаемость
Инструменты сжатия, такие как SVGO, дают вам возможность вычислить все основные фигуры на пути элементы. Это может сэкономить вам несколько укусов, но определенно снизит читабельность вашего кода. - Размер файла
Сжатие фигур в контуры может помочь вам минимизировать файлы, но это не всегда так! Например, прямоугольник со скругленными углами занимает гораздо больше места как - Анимации
Вы когда-нибудь пытались оживить SVG? Это очень весело - до тех пор, пока вы работаете над чистой, семантической SVG. С помощью основных фигур вы можете легко манипулировать такими параметрами, как радиус, ширина, высота или положение точки. Если вы объединяете свои фигуры в контуры, большинство из этих операций будет гораздо труднее выполнить или просто невозможно. - Варианты / Отзывчивость
Помните, что SVG не является статичным изображением, таким как JPG. Вы можете стилизовать его, оформить тему, сделать его отзывчивым и так далее. Как и в случае с анимацией, правильное структурирование и семантика вашего файла определенно помогут вам в решении любой из этих задач.
Как и в любом правиле, вы можете найти некоторые исключения. Но, в общем, хорошей практикой является сохранение SVG максимально читабельным, гибким и структурированным.
Теперь давайте посмотрим на другие атрибуты и функции, такие как viewBox, группы, преобразования и визуальные эффекты. .
ширина
высота
и viewBox
Если у вас уже есть некоторый опыт работы с SVG, вы, вероятно, заметили, что Открывающий тег
часто имеет следующие атрибуты: ширина
высота
и viewBox
. В инструментах дизайна у нас есть размеры артбордов (или рамок в случае с Figma). Так как именно эти значения связаны друг с другом?
Давайте начнем с объяснения атрибутов
которые мы только что упомянули. Вы можете думать о viewBox
как о виртуальном холсте в форме системы координат. Центр этой системы координат расположен в верхнем левом углу обозначенной области. Все элементы в теге
размещаются в соответствии с этой системой координат и также обрезаются ею - все, что выходит за пределы viewBox
не будет отображаться. viewBox
принимает 4 числа в качестве значения:
Поскольку SVG обозначает масштабируемая векторная графика, для этих номеров не требуется никаких единиц. Просто представьте, что это абстрактная система координат, которую можно масштабировать до любого размера. Не беспокойтесь о первых двух числах, скорее всего, они вам не понадобятся. Последние два - вот что обычно имеет значение. Это фактические размеры нашего холста SVG.
viewBox
не определяет размер SVG. Он просто указывает координаты области, в которой нарисован наш SVG. Поэтому при использовании в Интернете
с указанным viewBox
всегда будет занимать все доступное пространство и сохранять соотношение, установленное viewBox
- если только мы предотвращаем это с помощью CSS или устанавливаем атрибуты width
и / или height
.
width
и height
являются
атрибуты, которые устанавливают фактическую ширину и высоту элемента SVG. В отличие от viewBox
они должны использовать определенные единицы измерения, такие как пиксели, ems или rems. Это означает, что мы также можем преобразовать SVG с ними - если отношение между шириной
и высотой
отличается от соотношения между значениями viewBox
SVG будет искажать графику, указанную в viewBox
в соответствии со значениями width
и height
:
Теперь, что происходит, когда мы экспортируем SVG из инструментов дизайна? В Sketch и Figma все ресурсы (независимо от того, являются ли они однослойными, группами или монтажными областями) всегда будут получать viewBox
равное размерам экспортируемого элемента и ширине
и высота
устанавливается в пикселях, равная двум последним значениям viewBox
. В Illustrator все ресурсы имеют viewBox
заданный таким же образом, как в Sketch и Figma, но без ширины
и высоты
.
Группы
Группы - это основное средство организации слоев в инструментах проектирования. Помимо настройки иерархии, группы используются для применения массовых операций, таких как преобразования, к нескольким элементам. Нет существенной разницы в том, как группы работают в Illustrator, Sketch и Figma, и, к счастью, базовая функциональность групп SVG (
) почти одинакова.
Transforms
В SVG существует пять основных преобразований, которые мы можем применить к элементу:
-
translate
: перемещает элемент по вертикали и / или горизонтальная ось;
-
масштаб
: масштабирует элемент по вертикальной и / или горизонтальной оси: -
поворот
: создает двухмерное вращение заданный угол, заданный в градусах вокруг данной точки; -
перекос
(skewX
илиskewY
): наклоняет элемент на заданный угол, указанный в градусах по вертикальной или горизонтальной оси; -
матрица
: самая сложная и универсальная из доступных функции преобразования. Поскольку для объяснения работы матричных преобразований потребуется много разговоров об алгебре, это выходит далеко за рамки этой статьи. Давайте просто признаем, что матрица
Примечание : Обратите внимание, что хотя некоторые из SVG-преобразований очень похожи на CSS-преобразования, они не одинаковы. Например, CSS предлагает функции 2D и 3D поворота, в то время как SVG имеет только одну функцию 2D поворота. Кроме того, в то время как CSS принимает различные угловые единицы, такие как градусы или радианы, повороты SVG всегда задаются в градусах, поэтому единицу можно не указывать (например, rotate (45)
NOT ~~ rotate (45deg) ~~
).
Все эти преобразования могут быть применены к любому элементу SVG, такому как формы или группы, и не являются -деструктивно, т.е. не влияют на исходную геометрию элемента. We apply transforms via a transform
attribute:
…
Let’s take a look at the design tools now! So, most of the transforms we apply in design tools interact directly with the objects’ geometry and their position on the canvas. They are not independent from the shapes and will not be exported as SVG transform functions.
Rotations are here the exception, with their values being stored in the Inspector separately from the element’s geometry and they do export as a transform="rotate(…)"
function.
Interestingly, the same rule applies to flips (reflections) in Sketch and Figma (not in Illustrator!). Each of them has its own approach though. Sketch uses a combination of negative scaling and translating to achieve a flip effect, while Figma performs a flip within a single matrix function.
Border Radius
We already spoke about rounded rectangles but what about rounding other shapes? In fact, in all the designs tools we discuss, you can round the corners of any shape, not only a rectangle.
But what about SVG? Do
and
elements also have a rx
and ry
attributes? Unfortunately, no. Any shape other than a rectangle, once you round any of its corners, will always be exported as a
element treating the rounded corners as an integral part of the shape’s geometry.
Fills And Strokes
Illustrator, Sketch and Figma all support fills and strokes as the basic properties of any shapes, and so it happens in SVG. Therefore, fills specified in design tools are exported within a fill
attribute and stokes are exported within a stroke
attribute. Don’t think it’s all that straightforward though. The devil is in the details.
Color Fill
Color fill is the most basic of available fills and is specified with a single plain color (e.g. #3fd8e2
). In SVG, this value is put directly in the fill
attribute (e.g. fill="#3fd8e2"
).
Design tools export color fills with hex values (e.g. #0000ff
), although, in SVG, you can also use all the other naming schemes known to CSS, such as color names (e.g. blue
), RGB values (e.g. rgb(0,0,255)
) or even HSL values (e.g. hsl(240,100%,50%)
).
Fill Opacity
When it comes to fill opacity, SVG accepts semi-transparent colors (e.g. RGBA values), although it also provides a fill-opacity
attribute. Because of compatibility issues, using fill-opacity
is a recommended approach and it is also the one used by Figma and Sketch. (I’m not mentioning Illustrator here, as Illustrator does not allow you to control fill opacity.) So, if you want to create an SVG square filled with half-transparent red color, you can do the following:
but a more recommended approach (used by Sketch and Figma) would be:
Gradient Fill
If you’re familiar with CSS, you may know that when it comes to backgrounds, switching between color and gradient backgrounds is relatively straightforward. The same background-color
(or background
) property can be used in both cases. As gradients in SVG are much older than CSS gradients, their syntax is also quite different.
To use a gradient is SVG, you first need to define it within the
tags and then refer to it in a fill
attribute, e.g.:
So, what happens during SVG export when you use a gradient fill is that a gradient is added to the
and it’s being referenced in the code below.
An important thing to remember is that that SVG supports only linear and radial gradients. Effects such as angular gradient or gradient mesh won’t be exported to SVG.
Pattern/Image Fill
Sketch and Figma also offer an Image fill where a raster graphic is used either to fill the entire element or as a repeating pattern.
When it comes to exporting Image fills to SVG, it’s actually quite similar to gradients. Images are being defined in the
with a
element and then referenced within a fill
attribute:
To make it work, the referenced #picture
image must be defined somewhere. The design tools will embed them directly in SVG as
elements, although it’s not a recommended approach when it comes to performance. If you really need to use raster images in your SVG, I would suggest to remove the image tag from the SVG and use it a standalone file instead:
Strokes
stroke
attribute in SVG, same as fill
attribute accepts colors in various formats, e.g. hex, RGB or HSL. And similarly to fill
you can control stroke’s opacity with stroke-opacity
. Also, same as with fill
strokes can use gradients as their value. All of those effects can be achieved in design tools and successfully exported to SVG.
Stroke Caps And Joins
There are also a few stroke specific attributes though. First, you can control the stroke width. Design tools support it and its exported as stroke-width
attribute. You can also control ends and joins of the strokes. SVG allows you to define them via stroke-linecap
and stroke-linejoin
attributes. There are three possible caps: butt
cap, round
cap and square
cap, and three possible joins: miter
join, round
join and bevel
join. Both caps and joins can be controlled in Illustrator, Figma and Sketch and available caps and joins are matching those available in SVG.
Dashed And Dotted Strokes
Another effect we can achieve with strokes is dashed strokes. In Illustrator and Figma, you can set multiple dashes and gaps, while in Sketch, only a single sequence of a dash and a gap is possible.
SVG allows you to create dashed lines with a stroke-dasharray
attribute. stroke-dasharray
allows a sequence of multiple dashes and gaps to be passed as its value which matches Figma’s and Illustrator’s features. It also means Sketch does not allow you to use the full possibilities of SVG in this case.
An interesting edge case is a dotted line. We achieve it by setting the stroke-linecap
to round
and a dash’s length to zero, e.g.:
Note: Currently, Figma users experience a bug that doesn’t allow them to create dotted lines. For example, using 0, 10
or 10, 0
as Dashes is interpreted the same way as 10, 10
and gives a regular dashed line rather than a dotted line. Fortunately, there’s a way to get around it. Rather than using zero, use a very small value, e.g. 0.0001, 10
— this should result in perfectly dotted line, as expected.
Stroke Alignment
There is one other, much more significant difference between design tools and SVG: stroke alignment. Illustrator, Sketch and Figma all allow you to control the alignment of the stroke and set it inside, outside or centre-align it. Но угадайте что? SVG 1.1 does not support stroke alignment. In SVG, all strokes are centre-aligned strokes. No inside strokes or outside strokes. Which is why some very weird things happen when you’re exporting your outside- and inside- aligned strokes to SVG.
Illustrator, in such case, exports the shape and its stroke as two separate shapes. So if you apply an inside stroke or an outside stroke to a rectangle in Illustrator, in SVG it will result in a rectangle and a separate
element representing the rectangle’s stroke, e.g.:
This behavior has some very important repercussions. For example, you can no longer change the width of the stroke or make it dashed. It also won’t scale the same way as “real” strokes. What is more, Illustrator changes the dimensions of the original shape, e.g. a 100×100 square with a 20-units bold inner stroke will actually export as a 120×120 square to avoid rendering issues. Eventually, it’s just not a stroke. It’s just another shape with a fill.
Figma and Sketch have a different approach though. They faithfully export all strokes as strokes but they recalculate the dimensions of the shape. So if you have a circle with a radius equal to 5 and an inside stroke equal to 2, what you’ll find in your SVG will be a circle with a radius equal to 4 (and a stroke still equal to 2).
This approach allows Figma and Sketch to avoid most of the issues mentioned in the case of Illustrator. However, with some more complicated shapes this technique may turn out not to be precise and the final result to be a bit different than expected. With is why Sketch’s and Figma’s approach is not necessarily better — it’s definitely more semantic, performant and flexible, but Illustrator’s solution is more accurate.
Note: The same problem with stroke alignment applies to CSS as well. The CSS border
property does not support inside or outside alignment neither. However, if you want, you can hack this behavior with outline
and box-shadow
properties.
Multiple Fills And Strokes
In design tools, you can add multiple fills and strokes per layer. This makes a lot of sense once combined with such attributes as opacity and blend modes. Unfortunately, SVG does not support such a feature. If you export a layer that has fills and/or strokes, it will get multiplied and each of the strokes and fills applied to its own layer.
Shadows, Filters, And Other Effects
Let’s talk about some less popular effects now. SVG is a very powerful language, in fact much more powerful than how it’s usually used on the web. One of the most interesting SVG’s features is a wide range of advanced visual effects, known as SVG filters.
The full scope of SVG filter’s possibilities is far too wide to be described in this article. If you’d like to learn more about them I strongly recommend you to check out some talks and articles on this topic by Sarah Soueidan.
Filters, same as patterns or gradients, need to be defined to apply them later to a layer. Every filter is defined as a
element that can contain numerous effects, known as filter primitiveseach standing for a separate visual effect.
Filter primitives can be combined together to create filters. For example, this is what a basic blur effect applied to a rectangle looks like:
…but you can also create a more complex filter that consists of more than one filter primitive:
Out of the three design tools we discuss, only Illustrator lets you play with SVG filters. You can find them in the app’s menu, under Effect > SVG Filters. Sketch and Figma are a completely different story. Any effects these applications offer are mostly focused on CSS and native implementations, e.g. Background Blur effect was implemented primarily for designing iOS apps and Drop/Inner Shadow effects parameters are matching CSS properties (box-shadow
and text-shadow
).
It doesn’t mean we can’t export these effects to SVG. We can. However, translating these effects to SVG is utterly not as straightforward as to CSS. Let’s consider a square with a drop shadow applied.
This is how our square could look like, once exported to HTML/CSS:
A similar square exported from Sketch to SVG gives us a significantly more complex piece of code:
What happens here is that Sketch duplicates the square, so we have two identical squares, one above another, and turns the duplicate into a shadow.
To accomplish this, it applies a filter to a duplicated square that consists of three different filter primitives:
- one to offset the square;
- one to set its color to semi-transparent black;
- one to blur it.
In other design tools, we would encounter a similar situation.
It doesn’t mean that we should never, by all means, use shadows in SVG. It’s handy to keep in mind though that as long as SVG gives you a very powerful toolkit to modify your graphics, some seemingly simple effects are not that simple to achieve at all.
Blend Modes
Blend modes (such as DarkenMultiply or Overlay) allow blending two or more elements by combining their values in different ways. Well known to graphic designers (and applications such as Adobe Photoshop), blend modes work in Sketch, Figma and Illustrator as well.
In SVG, blend modes exist as one of the filters. They have their own
filter primitive. However, as
’s syntax is fairly complicated, Sketch, Figma and Illustrator use CSS instead:
.rectangle {
mix-blend-mode: overlay;
}
With mix-blend-mode
browser support being fairly good nowadays, it shouldn’t be a big issue. However, if it’s important for you to ensure bulletproof browser support that includes Microsoft Edge and IE, you will have to replace the CSS blend modes with SVG filters manually.
Same as with multiple fills and strokes, SVG does not support blend modes applied directly on fill and stroke attributes (rather than on whole layers). If you try to export fill and strokes with their own blend modes from a design tool to SVG, the layer will get multiplied and the blend modes applied to respective copies of the layer.
Symbols And Components
In some of the code examples above, you may have noticed an element we haven’t discussed yet: a element.
lets us define and reuse elements in SVG, a bit similar to Symbols in Illustrator and Sketch or Components in Figma. Remember defining patterns, gradients and filters within the
tags so they can be used in some other part of your SVG code? In fact, any SVG element can be defined and reused this way. Once you defined a shape or a group, you can refer to it in the rest of the document as many times as you like, e.g.:
...
You can also reuse much more complex structures using a
tag. Symbol acts as a separate body within our SVG and can have its own viewBox
attribute (see Width, height and viewBox for reference).
Does it mean our design tools’ symbols and components will be exported to SVG symbols? In Illustrator — yes, it does. In Sketch and Figma — no, it doesn’t. Зачем? Primarily, because Illustrator symbols are fairly simple and can be easily translated to SVG while Sketch’s symbols and Figma’s components are not that simple at all and exporting some of its features (such as nested overrides) would be very tricky or even impossible.
Text
It wouldn’t be a comprehensive guide if we don’t mention typography. All the design tools offer a wide variety of tools related to text. SVG, even though usually used for graphics, supports text elements too.
Illustrator, Sketch and Figma all support exporting text to SVG and computes text layers into
elements in SVG. SVG text elements are rendered like any other graphic elements, shapes etc. with the only difference is that they’re text.
Same as in CSS, we can control all the basic text’s parameters, such as weight, line height or alignment. In fact, if you know how to style text in CSS, you already know how to do it in SVG. However, it may feel a bit old-school. Firstly, all the parameters must be set in inline attributes, similarly to the golden standards of HTML 3.2. Secondly, there are no shorthands. For example, you won’t find anything resembling a font
CSS property. That’s because SVG text attributes are actually based on CSS 2 spec which takes us back to the 90ties and are way older than CSS we know today.
Nonetheless, all of those attributes are being exported from the design tools perfectly well every time we want some text layer to become SVG code.
Custom Fonts
Unfortunately, things get a bit tricky when it comes to custom fonts. Back in the days, when SVG 1 standard was being created, custom typefaces weren’t a common thing to the web. Everybody used standard fonts, such as Tahoma, Verdana or Courier. Going fancy and using fonts people didn’t have on their machines by default, usually meant rasterizing them ruthlessly and using them as images. However, SVG implemented its own fonts format, named SVG fonts. Today, 18 years after the SVG 1.0 was published, SVG fonts are no longer supported in most of the major browsers.
Luckily for us, SVG plays very nicely with CSS, which means we can use web fonts instead of SVG fonts, e.g.:
Text
Let me not get into detail of implementing web fonts here apart from one crucial note: don’t forget about it. In other words, if you use custom fonts in your SVG, you need to remember about providing these fonts to the client, the same as in HTML/CSS.
Outlining Fonts
One may argue that much easier than warring about fonts and all, would be to outline all the text layers and don’t worry about them ever after. Nonetheless, there are at least a few good reasons not to change your text to shapes:
- You can’t edit outlined text — before nor after export.
Working with outlined text, you need to remember about keeping an editable copy in your Illustrator, Sketch or Figma file at all times. Otherwise, you won’t be able to edit your text layers, once they are outlined. This adds unnecessary complexity to the process. Not to mention editing the outlined text after the SVG was exported. Text in SVG can be updated at any time. Outlined text requires opening the source file every time you want to make the tiniest copy change. - Outlined text is not accessible.
Text in SVG, same as other text elements on the web, can be read by screen readers and other accessible technologies. By outlining text layers, you prevent people from using such technologies from accessing your content. - People expect text to be text.
Most people using the web know absolutely nothing about SVG, HTML or design tools. If they see text, they expect it to be just that. They may want to select it, copy it or put in a search engine. All of this is possible with text in SVG — unless you outline it. - Don’t forget about SEO.
Text in SVG is also accessible and used by search engines. By outlining text, you make your content less searchable and potentially less visible to the public.
Summary
Thank you a lot for going with me on a journey through the ins and outs of working with SVG and design tools. This article definitely does not cover the full spectrum of the topic, although it should be enough to deal with the most common use cases. If you have any questions or queries regarding the things that have not been mentioned here, don’t hesitate to post them in the comments!