В Snap.svg элемент <path> используется для
создания сложных графических фигур, линий и кривых с помощью
последовательности команд, задающих путь. Путь определяется атрибутом
d, который содержит строку команд, каждая
из которых указывает движение пера по координатной сетке.
Команды бывают абсолютными и относительными.
Основные команды:
| Команда | Описание | Пример |
|---|---|---|
M x y |
Переместить перо в точку (x, y) | M100 100 |
L x y |
Провести линию к точке (x, y) | L200 200 |
H x |
Горизонтальная линия до x | H300 |
V y |
Вертикальная линия до y | V150 |
C x1 y1 x2 y2 x y |
Кубическая кривая Безье к (x,y) с контрольными точками (x1,y1) и (x2,y2) | C100 100 150 150 200 100 |
S x2 y2 x y |
Продолжение кубической кривой Безье | S250 50 300 100 |
Q x1 y1 x y |
Квадратичная кривая Безье к (x,y) с контрольной точкой (x1,y1) | Q150 150 200 100 |
T x y |
Продолжение квадратичной кривой | T250 50 |
A rx ry xAxisRotation largeArcFlag sweepFlag x y |
Дуга эллипса | A50 50 0 0 1 200 200 |
Z |
Закрыть путь, соединив последнюю точку с первой | Z |
Для создания элемента path используется метод
paper.path(), где paper — объект Snap:
var s = Snap(500, 500); // создаём SVG контейнер 500x500
var path = s.path("M50 50 L150 50 L100 150 Z");
path.attr({
fill: "#f06",
stroke: "#000",
strokeWidth: 2
});
В этом примере:
M50 50 – начальная точка.L150 50 и L100 150 – линии к новым
координатам.Z – закрытие контура.Путь может содержать несколько команд подряд:
var complexPath = s.path("M100 100 C150 50 200 150 250 100 S350 50 400 100");
complexPath.attr({
fill: "none",
stroke: "#00f",
strokeWidth: 3
});
C создаёт кубическую кривую.S продолжает кривую без указания первой контрольной
точки, используя отражение предыдущей.Использование строчных команд уменьшает объём кода и облегчает масштабирование:
var relativePath = s.path("m50 50 l100 0 l-50 100 z");
relativePath.attr({
fill: "#0f0",
stroke: "#000",
strokeWidth: 2
});
m50 50 – перемещение относительно текущей позиции.l100 0 – линия на 100 пикселей вправо.l-50 100 – линия 50 пикселей влево и 100 вниз.Snap.svg позволяет плавно изменять путь с помощью метода
animate():
var animPath = s.path("M50 250 C150 200 250 300 350 250");
animPath.attr({
fill: "none",
stroke: "#f00",
strokeWidth: 4
});
animPath.animate({ d: "M50 250 C150 300 250 200 350 250" }, 2000, mina.easeinout);
d.mina.easeinout задаёт тип ускорения анимации.Snap.svg предоставляет методы для работы с path:
getTotalLength() – длина пути.getPointAtLength(len) – координаты точки на пути по
длине.getSubpath(from, to) – вырезает участок пути.Пример использования getPointAtLength:
var p = s.path("M0 0 L200 200");
var len = p.getTotalLength();
var point = p.getPointAtLength(len / 2); // точка на середине линии
console.log(point.x, point.y);
Путь можно трансформировать методами:
translate(dx, dy) – перемещение.scale(sx, sy, cx, cy) – масштабирование относительно
точки (cx, cy).rotate(angle, cx, cy) – поворот вокруг точки.Пример:
var p = s.path("M50 50 L150 50 L100 150 Z");
p.transform("translate(50,50) scale(1.5) rotate(30 100 100)");
Z, чтобы корректно применять
заливку.Синтаксис path является мощным инструментом Snap.svg,
позволяя создавать как простые линии, так и сложные органические формы с
плавными кривыми и динамическими анимациями.