Если вы когда-нибудь открывали SVG-файл в текстовом редакторе, то наверняка встречали что-нибудь вроде M 20 40 C 60 10 120 90 160 40. С первого взгляда это выглядит как какая-то странная смесь координат, команд терминала и заклинаний веб-разработчика. Но на самом деле перед нами одна из самых интересных возможностей SVG — элемент <path>.
С помощью SVG Path можно рисовать практически что угодно: прямые линии, волны, иконки, логотипы, графики, сложные иллюстрации и произвольные геометрические формы. А самое интересное — всё это описывается обычным текстом.
В этой статье разберёмся, как устроен <path>, что означают загадочные буквы M, L, C, Q, A, Z и зачем вообще веб-разработчику понимать SVG-пути.
К статье я также подготовил готовые SVG-файлы с примерами. Их можно скачать, открыть прямо в браузере или текстовом редакторе и менять координаты самостоятельно.
Что такое SVG Path
SVG — это векторный формат изображений. В отличие от JPEG или PNG, картинка здесь может быть описана набором геометрических объектов и координат. Поэтому SVG можно увеличивать практически до любого размера без появления пикселей.
Одним из таких объектов является:
<path>
Удобнее всего представить path как движение виртуального пера по листу бумаги. Мы говорим перу: сначала переместись сюда, потом проведи линию туда, затем нарисуй кривую, после этого ещё одну линию и в конце замкни фигуру.
Все инструкции записываются в атрибуте d:
<svg viewBox="0 0 320 200">
<path d="M 60,50 L 260,150" />
</svg>
Буквы здесь — команды, а числа — их параметры.
| Команда | Название | Что делает |
|---|---|---|
M | Move | Перемещает перо |
L | Line | Рисует прямую линию |
Q | Quadratic Bézier | Квадратичная кривая Безье |
C | Cubic Bézier | Кубическая кривая Безье |
A | Arc | Рисует эллиптическую дугу |
Z | Close Path | Замыкает контур |
T | Smooth Quadratic | Продолжает квадратичную кривую |
S | Smooth Cubic | Продолжает кубическую кривую |
Система координат SVG
Перед тем как экспериментировать с путями, нужно понять одну простую вещь: SVG существует внутри собственной системы координат.
Например:
<svg viewBox="0 0 320 200">
означает, что наша рабочая область имеет условную ширину 320 единиц и высоту 200 единиц.
Точка 0,0 располагается в левом верхнем углу. Координата X увеличивается слева направо, а Y — сверху вниз.
Поэтому:
0,0— левый верхний угол;320,0— правый верхний;0,200— левый нижний;320,200— правый нижний.
И практически вся работа с SVG Path сводится к путешествию между такими точками.
Команда M — перемещаем перо
Начнём с самой простой команды. M происходит от слова Move и перемещает виртуальное перо в указанную точку.
M 60,50
То есть:
X = 60
Y = 50
Важно понимать: сама команда M ничего не рисует. Она только выбирает точку, с которой мы хотим начать.
Это примерно как взять настоящий карандаш, поднять его над листом бумаги и переставить в другое место.
Команда L — рисуем линии
После того как перо оказалось в нужной точке, можно начать рисовать. Для обычной прямой используется команда L — Line.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 200">
<path
d="
M 60,50
L 260,150
M 60,150
L 260,50
"
fill="none"
stroke="black"
stroke-width="10"
/>
</svg>
Сначала команда M устанавливает начальную позицию. Затем L проводит линию от текущего положения пера до указанной точки.
Обратите внимание на интересную особенность: команде L не требуется указывать начальную координату линии. Она уже известна из предыдущей команды.
Получается простая цепочка:
M → L → L → L → ...
Именно этот принцип делает SVG Path таким мощным: следующая команда продолжает работу с того места, где закончилась предыдущая.
Кривые Безье в SVG
С прямыми всё относительно просто. Настоящее веселье начинается тогда, когда нам нужно нарисовать плавную линию.
Для этого SVG поддерживает кривые Безье. Если вы работали в Illustrator, Figma, Photoshop, CorelDRAW или другом графическом редакторе, то наверняка уже сталкивались с управляющими точками кривых.
Квадратичная кривая Q
Самый простой вариант — команда Q. Для неё используется одна управляющая точка.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 200">
<path
d="
M 40,150
Q 160,20 280,150
"
fill="none"
stroke="black"
stroke-width="10"
/>
</svg>
Разберём запись:
M 40,150
Q 160,20 280,150
Начальная точка уже определена командой M. После Q идут ещё две точки:
160,20— управляющая точка;280,150— конечная точка.
Управляющая точка словно притягивает линию к себе. Чем сильнее мы меняем её положение, тем заметнее изменяется изгиб.
Упрощённо это можно представить так:
кривая = начальная точка + управляющая точка + конечная точка
Кубическая кривая C
Когда одной управляющей точки недостаточно, появляется команда C — Cubic Bézier.
У неё уже две управляющие точки:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 200">
<path
d="
M 30,150
C 70,20 250,180 290,50
"
fill="none"
stroke="black"
stroke-width="10"
/>
</svg>
После C мы видим сразу три пары координат:
C 70,20 250,180 290,50
Это:
- первая управляющая точка;
- вторая управляющая точка;
- конечная точка.
Начальная точка, опять же, берётся из предыдущей команды.
Именно кубические кривые позволяют создавать сложные S‑образные линии, плавные волны и множество форм, которые постоянно встречаются в логотипах и векторных иллюстрациях.
Q или C — что использовать?
На практике всё довольно просто. Если нужна обычная плавная дуга, часто достаточно Q. Если форма должна менять направление или вам нужен более точный контроль над изгибом, удобнее C.
| Q | C | |
|---|---|---|
| Управляющих точек | 1 | 2 |
| Сложность | Низкая | Выше |
| Контроль формы | Базовый | Точный |
| S‑образные формы | Ограниченно | Да |
Команда A — дуги в SVG
А теперь добрались до команды, которая способна немного сломать мозг даже человеку, который уже вполне нормально понимает остальные SVG Paths.
A означает Arc — эллиптическая дуга.
В общем виде она записывается примерно так:
A rx ry rotation large-arc-flag sweep-flag x y
Выглядит страшновато. Но давайте не будем пытаться запомнить всё сразу.
Простейший пример:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 200">
<path
d="
M 50,140
A 130,100 0 0 1 270,140
"
fill="none"
stroke="black"
stroke-width="10"
/>
</svg>
Как читать параметры A
Возьмём только саму команду:
A 130,100 0 0 1 270,140
| Параметр | Значение | Назначение |
|---|---|---|
| rx | 130 | Горизонтальный радиус |
| ry | 100 | Вертикальный радиус |
| rotation | 0 | Поворот эллипса |
| large-arc-flag | 0 | Малая или большая дуга |
| sweep-flag | 1 | Направление дуги |
| x | 270 | Конечная X |
| y | 140 | Конечная Y |
Самое непривычное здесь то, что мы не задаём центр окружности. Браузер сам вычисляет подходящий эллипс, который сможет соединить начальную и конечную точки.
Большая и маленькая дуга
Между двумя точками по одному эллипсу можно пройти разными путями. Поэтому SVG нужно сообщить, какую именно часть эллипса мы хотим использовать.
За это отвечает large-arc-flag:
0 = короткая дуга
1 = длинная дуга
Есть ещё sweep-flag, определяющий направление:
0 = одно направление
1 = противоположное направление
И вот здесь я бы советовал не пытаться заучивать всё теоретически. Гораздо проще взять готовый SVG из архива, поменять ноль на единицу, обновить страницу браузера и посмотреть, куда внезапно убежала дуга.
Как замкнуть SVG Path
До сих пор мы рисовали открытые линии. Но path может создавать и замкнутые фигуры.
Для этого существует команда Z.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 220">
<path
d="
M 70,50
L 70,170
L 250,170
Z
"
/>
</svg>
Z автоматически соединяет последнюю точку с той точкой, с которой начался текущий контур.
То есть:
M 70,50
L 70,170
L 250,170
Z
по смыслу заканчивается линией обратно к 70,50.
Абсолютные и относительные команды SVG
До сих пор все команды мы писали заглавными буквами:
M L Q C A
Но SVG чувствителен к регистру. У большинства команд есть версии с маленькими буквами:
m l q c a
И это не просто другой способ написания.
Заглавные команды используют абсолютные координаты, а строчные — относительные.
Например:
M 60,60
l 70,110
Первая команда устанавливает позицию:
X = 60
Y = 60
А следующая говорит не «иди в точку 70,110», а:
X = 60 + 70 = 130
Y = 60 + 110 = 170
То есть координаты считаются относительно текущего положения.
Иногда это очень удобно, особенно если форма состоит из повторяющихся элементов или её нужно легко перемещать, не пересчитывая все координаты.
Плавное продолжение кривых: T и S
Представим, что мы нарисовали одну кривую Безье и хотим сразу продолжить её второй. Если самостоятельно подобрать следующую управляющую точку не совсем точно, в месте соединения может появиться заметный излом.
SVG умеет решать эту проблему автоматически.
Команда T
T используется вместе с квадратичными кривыми.
<path
d="
M 40,110
Q 90,20 160,110
T 280,110
"
/>
Для T не нужно задавать новую управляющую точку. SVG рассчитывает её автоматически как отражение предыдущей, благодаря чему переход получается плавным.
Команда S
У кубических кривых существует похожая команда — S.
<path
d="
M 30,110
C 80,20 130,200 180,110
S 280,20 330,110
"
/>
Это очень удобно для волн и длинных плавных контуров. Не приходится вручную угадывать положение каждой следующей управляющей точки.
Пробелы и запятые в SVG Path
Если открыть какой-нибудь SVG, экспортированный графическим редактором, можно увидеть довольно неприятную конструкцию:
<path d="M60 50L260 150M60 150L260 50"/>
И она совершенно нормально работает.
Но при ручной работе я предпочитаю писать так:
<path
d="
M 60,50
L 260,150
M 60,150
L 260,50
"
/>
Браузеру в большинстве случаев всё равно, зато человеку второй вариант читать намного проще.
Особенно это становится заметно, когда внутри одного path уже не две команды, а двадцать.
Можно ли анимировать SVG Path?
Да, и вот здесь начинается ещё одна очень интересная тема.
Например, можно сделать эффект, будто линия постепенно рисуется прямо на экране. Один из классических способов основан на свойствах:
stroke-dasharray
stroke-dashoffset
Упрощённый вариант можно сделать даже внутри самого SVG:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 220">
<path
pathLength="1"
d="M 30,160 C 80,20 150,200 210,80 S 300,40 330,150"
fill="none"
stroke="black"
stroke-width="9"
stroke-dasharray="1"
stroke-dashoffset="1"
>
<animate
attributeName="stroke-dashoffset"
from="1"
to="0"
dur="2.5s"
fill="freeze"
/>
</path>
</svg>
Если открыть этот SVG непосредственно в браузере, линия будет постепенно появляться.
А дальше на SVG Paths можно строить уже куда более сложные вещи: анимированные логотипы, индикаторы загрузки, графики, маршруты на картах, декоративные линии и полноценные иллюстрации.
Шпаргалка по SVG Path
После всех этих M, L, Q и C всё может немного перемешаться в голове, поэтому соберу основные команды ещё раз.
| Команда | Что запомнить |
|---|---|
M x,y | Перейти в точку |
L x,y | Провести прямую |
Q cx,cy x,y | Кривая с одной управляющей точкой |
C c1x,c1y c2x,c2y x,y | Кривая с двумя управляющими точками |
A rx,ry rotation large sweep x,y | Эллиптическая дуга |
Z | Замкнуть контур |
T x,y | Плавно продолжить Q |
S cx,cy x,y | Плавно продолжить C |
Как самому разобраться с SVG Paths
Мне кажется, SVG Path — как раз тот случай, когда чтение документации помогает только до определённого момента. Можно десять раз прочитать, что такое управляющая точка кубической кривой Безье, но гораздо полезнее один раз открыть SVG в редакторе и поменять:
C 70,20 250,180 290,50
например, на:
C 150,10 170,190 290,50
После этого обновить страницу и посмотреть, что произошло с линией.
Именно поэтому к статье я приложил архив с готовыми примерами. Каждый пример — обычный самостоятельный SVG-файл. Его можно открыть в Chrome, Firefox или другом браузере, затем открыть код в любом текстовом редакторе, поменять координаты и посмотреть результат.
Что в итоге
На первый взгляд SVG Paths действительно выглядят пугающе. Особенно когда вместо аккуратно отформатированного примера встречаешь экспортированный из графического редактора путь на несколько экранов, состоящий практически из одних букв и цифр.
Но базовая идея на самом деле очень простая: представьте, что внутри SVG находится виртуальное перо, а мы последовательно отдаём ему команды.
Переместились:
M
Провели линию:
L
Сделали плавный изгиб:
Q или C
Нарисовали дугу:
A
Замкнули фигуру:
Z
И всё это можно объединять внутри одного <path>, получая практически любую векторную форму.
Причём знание SVG Path полезно не только разработчикам. Если вы занимаетесь веб-дизайном, интерфейсами, логотипами, иконками или анимацией, понимание того, что скрывается внутри SVG-файла, довольно быстро перестаёт быть бесполезной технической мелочью.
А дальше самое интересное — открыть примеры и начать ломать их самостоятельно. В случае с SVG это, пожалуй, один из самых быстрых способов понять, как всё устроено.
Часто задаваемые вопросы (ЧаВо)
Что такое SVG Path?
SVG Path — это элемент <path>, который позволяет описывать линии, кривые, дуги и сложные векторные фигуры с помощью текстовых команд и координат. Инструкции для построения пути записываются в атрибуте d.
Что означают команды M, L, C, Q, A и Z в SVG?
Команда M перемещает виртуальное перо в заданную точку, L рисует прямую линию, Q создаёт квадратичную кривую Безье, C — кубическую кривую, A — эллиптическую дугу, а Z замыкает текущий контур.
Чем отличаются команды Q и C в SVG Path?
Команда Q создаёт квадратичную кривую Безье с одной управляющей точкой, а команда C использует две управляющие точки. Q удобна для относительно простых плавных изгибов, а C предоставляет более точный контроль и позволяет создавать сложные и S‑образные кривые.
Чем отличаются заглавные и строчные команды SVG Path?
Заглавные команды, например M, L, Q и C, используют абсолютные координаты относительно системы координат SVG. Строчные команды m, l, q и c используют относительные координаты, которые рассчитываются от текущего положения пути.
Как работает команда A для дуг в SVG?
Команда A создаёт эллиптическую дугу между текущей и конечной точками. В её параметрах задаются горизонтальный и вертикальный радиусы, поворот эллипса, выбор большой или малой дуги, направление и координаты конечной точки.
Можно ли анимировать SVG Path?
Да. Например, с помощью stroke-dasharray и stroke-dashoffset можно создать эффект постепенного рисования линии. На основе SVG Path также можно делать анимированные логотипы, графики, маршруты, индикаторы загрузки и декоративные элементы.
Как быстрее научиться работать с SVG Path?
Один из самых простых способов — взять готовый SVG-файл, открыть его код в текстовом редакторе и самостоятельно менять команды и координаты. После каждого изменения можно открывать или обновлять SVG в браузере и сразу наблюдать, как изменяется форма пути.





