SVG.js предоставляет мощный и гибкий инструмент для работы с векторной графикой в браузере, позволяя создавать сложные визуальные эффекты с минимальным количеством кода. Одним из ключевых аспектов является возможность цепного применения трансформаций к элементам SVG. Цепочки трансформаций позволяют последовательно применять к элементу масштабирование, вращение, перемещение и наклон, формируя сложные композиции.
В SVG.js трансформации можно применять к элементу несколькими способами:
const draw = SVG().addTo('body').size(600, 400);
const rect = draw.rect(100, 50).fill('#f06');
rect.move(50, 50)
.rotate(45)
.scale(1.5)
.skew(20, 0);
Здесь каждая функция возвращает объект элемента, что позволяет вызывать методы последовательно, формируя цепочку. Порядок вызовов имеет критическое значение: трансформации применяются в том порядке, в котором они указаны. Например, вращение до перемещения изменяет конечную позицию элемента на холсте.
Перемещение (move и
center)
move(x, y) — устанавливает координаты верхнего левого
угла элемента.center(cx, cy) — устанавливает центр элемента в
заданные координаты.Масштабирование (scale)
scale(sx, sy, cx, cy) — изменяет размер элемента. Если
sy не указан, используется sx. Параметры
cx и cy задают точку центра
масштабирования.Вращение (rotate)
rotate(angle, cx, cy) — поворачивает элемент на
angle градусов вокруг точки (cx, cy). Если
центр не указан, используется текущий центр элемента.Наклон (skew)
skew(sx, sy) — наклоняет элемент по горизонтали и
вертикали.Цепочки трансформаций особенно полезны при необходимости комбинировать несколько эффектов:
rect.rotate(30)
.scale(2)
.move(200, 100)
.skew(10, 15);
Внутренне SVG.js создает матричную трансформацию,
объединяя все вызовы в единый атрибут transform. Это
обеспечивает точность и позволяет применять анимации без потери
качества.
Для сложной графики важно корректно задавать точку вращения и масштабирования. Например, вращение вокруг центра элемента:
rect.rotate(45, rect.cx(), rect.cy());
Использование cx() и cy() возвращает
координаты центра элемента, что позволяет управлять трансформациями
независимо от текущего положения.
SVG.js позволяет анимировать трансформации через метод
animate():
rect.animate(1000, '<>')
.rotate(360)
.scale(1.2)
.move(300, 200);
Метод animate() возвращает объект анимации, на который
можно навешивать дополнительные события (after(),
loop()) и комбинировать с другими анимациями. Цепочки
трансформаций работают так же, как при статическом изменении, но их
значения интерполируются плавно.
Важнейший принцип — порядок вызовов определяет конечный результат. Например:
rect.scale(2).rotate(45);
не эквивалентно:
rect.rotate(45).scale(2);
В первом случае элемент сначала увеличивается, затем вращается, во втором — сначала вращается, затем масштабируется, что визуально меняет результат. Это особенно критично при сложной анимации или группировке элементов.
SVG.js поддерживает группировку элементов через group().
Все трансформации группы применяются ко всем вложенным элементам:
const g = draw.group();
g.add(rect).add(draw.circle(50).fill('#0f9'));
g.rotate(30).move(100, 50);
В этом примере и прямоугольник, и круг вращаются и перемещаются одновременно, сохраняя относительное положение друг к другу.
SVG.js позволяет сохранять текущее состояние трансформаций для последующего восстановления:
const t = rect.transform();
rect.rotate(90);
rect.transform(t); // Возвращение к исходному состоянию
Метод transform() может как считывать текущую матрицу
трансформации, так и задавать новую, что удобно для динамических
изменений и анимаций.
animate(), чтобы цепочки
трансформаций интерполировались плавно.Цепочки трансформаций в SVG.js позволяют создавать как простые визуальные эффекты, так и сложные динамические сцены, сохраняя при этом ясность и управляемость кода.