Библиотека SVG.js предоставляет гибкий и мощный
инструмент для создания анимированных элементов SVG. Анимация в SVG.js
строится на цепочках методов, позволяющих изменять атрибуты объектов во
времени. Основной метод для анимации — animate().
const draw = SVG().addTo('body').size(200, 200);
const circle = draw.circle(50).fill('#f06');
circle.animate(1000).move(100, 100).fill('#0f9');
В этом примере круг перемещается и меняет цвет за 1 секунду. Методы
move(), fill(), size() и другие
могут использоваться внутри animate() для динамического
изменения свойств.
Метод animate() принимает объект с дополнительными
настройками:
'linear', 'ease-in', 'ease-out',
'bounce').circle.animate({ duration: 1500, ease: '<>', delay: 500 }).radius(30).fill('#ff0');
Использование easing-функций позволяет создать более естественное движение объектов.
Для последовательного выполнения анимаций используется метод
after().
circle.animate(1000).move(150, 150).after(() => {
circle.animate(500).fill('#00f');
});
Параллельные анимации можно запускать без цепочек:
circle.animate(1000).move(150, 150);
circle.animate(1000).fill('#00f');
Объект будет одновременно двигаться и менять цвет.
SVG.js поддерживает трансформации объектов через метод
transform() или отдельные методы rotate(),
scale(), skew(), translate().
circle.animate(1000).rotate(180).scale(2).translate(50, 50);
Трансформации можно комбинировать для создания сложных эффектов вращения и масштабирования.
По умолчанию вращение выполняется относительно центра объекта. Чтобы вращать относительно другой точки, используется объект с координатами:
circle.animate(1000).rotate(90, 50, 50); // Поворот вокруг точки (50, 50)
Масштабирование часто требует фиксированной точки привязки:
circle.animate(1000).scale(1.5, 1.5, 75, 75);
Здесь (75, 75) — точка, относительно которой выполняется
масштабирование.
Анимированные иконки строятся на комбинации форм,
групп и анимации трансформаций.
Использование group() позволяет объединять несколько
элементов и анимировать их как единое целое.
const group = draw.group();
const rect = group.rect(40, 40).fill('#f06');
const circle2 = group.circle(30).fill('#0f9').move(20, 20);
group.animate(1000).rotate(360);
В этом примере весь набор объектов вращается вместе.
Для иконок с несколькими этапами анимации удобно использовать функции обратного вызова:
function animateIcon() {
rect.animate(500).move(60, 0).after(() => {
circle2.animate(500).scale(1.5).after(() => {
group.animate(1000).rotate(180, 50, 50).after(animateIcon);
});
});
}
animateIcon();
Такая структура позволяет создавать бесконечные циклы анимации.
Цвета и градиенты могут изменяться в процессе анимации. SVG.js
поддерживает анимирование заполнения (fill) и обводки
(stroke):
rect.animate(1000).fill({ color: '#ff0', opacity: 0.5 });
rect.animate(1000).stroke({ color: '#00f', width: 4 });
Градиенты задаются через gradient() и могут
использоваться в анимации:
const grad = draw.gradient('linear', (add) => {
add.stop(0, '#f06');
add.stop(1, '#0f9');
});
rect.fill(grad);
grad.animate(2000).from(0, 0).to(1, 1);
Это позволяет создавать эффект перемещения цвета по иконке.
SVG.js имеет мощные возможности работы с кривыми и линиями через
plot():
const path = draw.path('M10 80 C 40 10, 65 10, 95 80').fill('none').stroke({ width: 2, color: '#000' });
path.animate(1500).plot('M10 80 C 40 150, 65 150, 95 80');
Метод plot() изменяет атрибут d пути, что
позволяет создавать эффекты «рисования» линий и кривых.
Для движения объектов вдоль пути используется
motion():
const dot = draw.circle(10).fill('#f06');
dot.animate(2000).during((pos) => {
const point = path.pointAt(pos * path.length());
dot.center(point.x, point.y);
});
Метод during() передает прогресс анимации от 0 до 1,
позволяя синхронизировать движение объекта с кривой.
Цикличность и обратное воспроизведение анимаций задаются через
loop() и reverse():
circle.animate(1000).move(150, 150).loop(3, true); // Повтор 3 раза с реверсом
Параметры loop(count, reverse) обеспечивают детальный
контроль над повторением и направлением анимации.
SVG.js поддерживает маскировку и клиппинг, что расширяет возможности анимированных иконок:
const mask = draw.rect(50, 50).fill('#fff');
const icon = draw.circle(50).fill('#f06').maskWith(mask);
mask.animate(1000).move(50, 0).loop();
Таким образом, маска движется, создавая эффект динамического проявления иконки.
group() для одновременной
анимации.after() и during() для
сложных последовательностей.loop() для бесконечных иконок с цикличной
анимацией.Анимированные иконки с использованием SVG.js становятся легкими для управления и интеграции, позволяя создавать динамичные интерфейсы с минимальным объемом кода.