Кратко
СкопированоАтрибут d
описывает путь, который будет отрисован элементом <path>
.
Значение атрибута — строка со списком команд, написанных особым образом.
Пример
Скопировано<svg width="300" height="300"> <path d=" M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z" stroke="white" stroke-width="4" fill="none" /> </svg>
Как пишется
СкопированоКоманды атрибута d
состоят из одной буквы и нескольких чисел. Доступные команды:
- перемещение кисти —
M
,m
; - прямая линия —
L
,l
,H
,h
,V
,v
; - кубическая кривая Безье —
C
,c
,S
,s
; - квадратичная кривая Безье —
Q
,q
,T
,t
; - эллиптическая кривая —
A
,a
; - закрытие пути —
Z
,z
.
Каждая буква не случайно написана в верхнем и нижнем регистрах. Регистр команды влияет на обработку координат, стоящих после буквы. Заглавные буквы означают работу с абсолютными координатами, а строчные — с относительными.
Текущей позицией будем называть точку, в которой находится кисть перед выполнением команды.
Команды перемещения кисти
СкопированоРисование фигур с помощью <path>
начинается с выбора точки на плоскости. Это начальная позиция воображаемой кисти, которая будет перемещаться по холсту с помощью команд.
Команда | Параметры | Описание |
---|---|---|
M | (x y )+ | Перемещение кисти в точку x . |
m | (dx dy )+ | Перемещение кисти на dx относительно текущей позиции. |
Если передать в команду несколько точек, то, начиная со второй точки, будут выполнены не перемещения кисти, а рисование прямых линий как при использовании команды прямой линии L
или l
.
<svg width="300" height="300"> <path d=" M 50 125 L 150 225 M 150 50 250 150" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 50 125 L 150 225 M 150 50 250 150" stroke="white" stroke-width="4" fill="none" /> </svg>
Команды прямых линий
СкопированоКоманда | Параметры | Описание |
---|---|---|
L | (x y )+ | Прямая линия до точки x . |
l | (dx dy )+ | Прямая линия до точки, находящейся на dx от текущей позиции. |
H | (x )+ | Горизонтальная линия до координаты x . |
h | (dx )+ | Горизонтальная линия длиной dx . |
V | (y )+ | Вертикальная линия до координаты y . |
v | (dy )+ | Вертикальная линия длиной dy . |
<svg width="300" height="300"> <path d=" M 50 50 V 150 H 150 L 250 250" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 50 50 V 150 H 150 L 250 250" stroke="white" stroke-width="4" fill="none" /> </svg>
Команды кубических кривых Безье
СкопированоКривые Безье позволяют рисовать плавные линии. Для описания кривой требуется всего несколько координат точек. Первая и последняя точки будут началом и концом кривой, а промежуточные будут влиять на её изгиб. «Кривые Безье».
Кривые Безье бывают разных порядков, всё зависит от количества промежуточных точек. Кубическая кривая Безье имеет 2 промежуточные точки.
Команда | Параметры | Описание |
---|---|---|
C | (x1 y1 x2 y2 x y )+ | Кубическая кривая Безье от текущей позиции до x , где x1 и x2 — опорные точки. |
c | (dx1 dy1 dx2 dy2 dx dy )+ | Кубическая кривая Безье от текущей позиции до точки с координатами текущий x + dx , где опорными являются точки, полученные смещением текущей позиции на dx1 и dx2 соответственно. |
S | (x2 y2 x y )+ | Кубическая кривая Безье от текущей позиции до x , где x2 — координаты конечной опорной точки. |
s | (dx2 dy2 dx dy )+ | Кубическая кривая Безье от текущей позиции до точки с координатами текущий x + dx , где конечная опорная точка будет иметь координаты текущий x + dx2 . |
S
/ s
рисует более плавную кривую, потому что берёт координаты второй из четырех опорных точек x1
на основании предыдущей команды. Если предыдущая команда была кривой Безье, то вторая опорная точка станет отражением предпоследней точки предыдущей кривой. Иначе координаты опорной точки будут совпадать с текущей позицией.
Оранжевыми точками (fill
) отмечены опорные, начальные и конечные точки кривых. Синим цветом (fill
) отмечена промежуточная опорная точка второй кривой, которую получили отражением промежуточной опорной точки первой кривой.
<svg width="300" height="300"> <path d=" M 50 50 C 150 50 50 150 150 150 S 150 250 250 250" stroke="white" stroke-width="4" fill="none" /> <circle r="5" cx="50" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="50" fill="#FF8630" /> <circle r="5" cx="50" cy="150" fill="#FF8630" /> <circle r="5" cx="150" cy="150" fill="#FF8630" /> <circle r="5" cx="150" cy="250" fill="#FF8630" /> <circle r="5" cx="250" cy="250" fill="#FF8630" /> <circle r="5" cx="250" cy="150" fill="#2E9AFF" /></svg>
<svg width="300" height="300"> <path d=" M 50 50 C 150 50 50 150 150 150 S 150 250 250 250" stroke="white" stroke-width="4" fill="none" /> <circle r="5" cx="50" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="50" fill="#FF8630" /> <circle r="5" cx="50" cy="150" fill="#FF8630" /> <circle r="5" cx="150" cy="150" fill="#FF8630" /> <circle r="5" cx="150" cy="250" fill="#FF8630" /> <circle r="5" cx="250" cy="250" fill="#FF8630" /> <circle r="5" cx="250" cy="150" fill="#2E9AFF" /> </svg>
Команды квадратичных кривых Безье
СкопированоКвадратичная кривая Безье имеет 1 промежуточную точку.
Команда | Параметры | Описание |
---|---|---|
Q | (x1 y1 x y )+ | Квадратичная кривая Безье от текущей позиции до x , где x1 — опорная точка. |
q | (dx1 dy1 dx dy )+ | Квадратичная кривая Безье от текущей позиции до точки с координатами текущий x + dx , где опорной является точка, полученная смещением текущей позиции на dx1 . |
T | (x y )+ | Квадратичная кривая Безье от текущей позиции до x . |
t | (dx dy )+ | Квадратичная кривая Безье от текущей позиции до текущий x + dx . |
T
/ t
рисует более плавную квадратичную кривую Безье, потому что берёт координаты опорной точки x1
на основании предыдущей команды. Если предыдущая команда была кривой Безье, то промежуточная опорная точка станет отражением предпоследней точки предыдущей кривой. Иначе координаты опорной точки будут совпадать с текущей позицией.
Красные точки (fill
) — опорные, начальные и конечные точки кривых. Синим цветом (fill
) отмечена промежуточная опорная точка второй кривой, которую получили отражением промежуточной опорной точки первой кривой.
<svg width="300" height="300"> <path d=" M 50 50 Q 150 50 150 150 T 250 250" stroke="white" stroke-width="4" fill="none" /> <circle r="5" cx="50" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="150" fill="#FF8630" /> <circle r="5" cx="250" cy="250" fill="#FF8630" /> <circle r="5" cx="150" cy="250" fill="#2E9AFF" /></svg>
<svg width="300" height="300"> <path d=" M 50 50 Q 150 50 150 150 T 250 250" stroke="white" stroke-width="4" fill="none" /> <circle r="5" cx="50" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="50" fill="#FF8630" /> <circle r="5" cx="150" cy="150" fill="#FF8630" /> <circle r="5" cx="250" cy="250" fill="#FF8630" /> <circle r="5" cx="150" cy="250" fill="#2E9AFF" /> </svg>
Команды эллиптических кривых
СкопированоЭллиптическими кривыми называют такие линии, которые соответствуют некоторой части эллипса.
Команда | Параметры | Описание |
---|---|---|
A | (rx ry angle large sweep x y )+ | Эллиптическая кривая с горизонтальным радиусом rx и вертикальным радиусом ry , которая начинается в текущей точке и завершается в точке с координатами x . angle отвечает за поворот кривой относительно горизонтальной оси плоскости. |
a | (rx ry angle large sweep dx dy )+ | Эллиптическая кривая с горизонтальным радиусом rx и вертикальным радиусом ry , которая начинается в текущей точке и завершается в точке с координатами текущий x + dx . angle отвечает за поворот кривой относительно горизонтальной оси плоскости. |
Флаг large
отвечает за выбор большей дуги при значении 1
и меньшей при значении 0
. Флаг sweep
отвечает за выбор направления дуги: 1
— по часовой стрелке, 0
— против часовой стрелки.
Лучше понять как флаги влияют на отображение кривой помогут эти демки. Оранжевыми точками (fill
) отмечены начальная и конечная позиция кисти при рисовании кривой. Белым цветом отмечена дуга (stroke
), которая нарисована с указанными значениями флагов. Серым отмечены остальные комбинации флагов.
<svg width="300" height="300"> <path d="M 125 175 A 50 50 0 large-arc-flag sweep-flag 175 125" stroke="white" stroke-width="4" fill="none" /> <!-- Замените large-arc-flag и sweep-flag значениями из примеров --> <circle r="5" cx="125" cy="175" fill="#FF8630" /> <circle r="5" cx="175" cy="125" fill="#FF8630" /></svg>
<svg width="300" height="300"> <path d="M 125 175 A 50 50 0 large-arc-flag sweep-flag 175 125" stroke="white" stroke-width="4" fill="none" /> <!-- Замените large-arc-flag и sweep-flag значениями из примеров --> <circle r="5" cx="125" cy="175" fill="#FF8630" /> <circle r="5" cx="175" cy="125" fill="#FF8630" /> </svg>
Короткая дуга против часовой стрелки (large
, sweep
):
Короткая дуга по часовой стрелке (large
, sweep
):
Длинная дуга против часовой стрелки (large
, sweep
):
Длинная дуга по часовой стрелке (large
, sweep
):
Нарисовать круг или эллипс с помощью этой команды не получится. Если всё-таки стоит такая задача, нужного эффекта можно добиться, воспользовавшись двумя кривыми:
<svg width="300" height="300"> <path d=" M 50 150 A 100 100 0 0 1 150 50 100 100 0 1 1 50 150" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 50 150 A 100 100 0 0 1 150 50 100 100 0 1 1 50 150" stroke="white" stroke-width="4" fill="none" /> </svg>
Команды закрытия пути
СкопированоКоманда Z
, z
проводит прямую линию до начальной точки текущей части пути.
В примере из начала статьи используется команда закрытия пути. Она проводит прямую линию до начальной точки:
<svg width="300" height="300"> <path d=" M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z" stroke="white" stroke-width="4" fill="none" /> </svg>
В описании команды закрытия пути указано, что она проводит линию до начальной точки текущей части пути. Это означает, что путь может состоять из нескольких частей, начинаясь командой перемещения кисти M
/m
и заканчиваясь командой закрытия пути Z
/z
.
<svg width="300" height="300"> <path d=" M 50 50 V 125 H 125 Z M 250 250 V 175 H 175 Z" stroke="white" stroke-width="4" fill="none" /></svg>
<svg width="300" height="300"> <path d=" M 50 50 V 125 H 125 Z M 250 250 V 175 H 175 Z" stroke="white" stroke-width="4" fill="none" /> </svg>
Нюансы синтаксиса описания пути
СкопированоЧисла в описании пути могут быть разделены пробельными символами или запятыми, причем нет ограничений в каких ситуациях запятую можно, а в каких нет. Результат будет одинаковый:
M 50 50 L 150 50 150 150
— вообще не используем запятые.M 50 50 L 150 50
— разделяем запятыми пары координаты., 150 150 M 50 50 L 150
— разделяем запятыми числа внутри пары координаты., 50 150 , 150 M 50 50 L 150
— ставим запятые между и внутри пар., 50 , 150 , 150 M50
— вообще не используем пробелы., 50L150 , 50 , 150 , 150
Подробнее о грамматике описания пути в официальной спецификации SVG.
Использование в CSS
СкопированоВ CSS значение атрибута d
можно задать с помощью функции path
.
.path { d: path("M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z");}
.path { d: path("M 190 240 Q 90 240 90 190 T 190 140 L 190 40 Z"); }