Бесконечные циклы в контексте SVG.js чаще всего реализуются через
анимации, которые повторяются непрерывно. Для их создания используется
метод .animate() с опцией loop(). Этот подход
позволяет задавать постоянное движение объектов без необходимости
вручную перезапускать анимацию.
const draw = SVG().addTo('body').size(300, 300);
const circle = draw.circle(50).fill('red').move(50, 50);
circle.animate(2000, '<>')
.move(200, 50)
.loop();
В приведённом примере красный круг плавно перемещается по горизонтали, и цикл повторяется бесконечно.
Метод .animate() принимает три основных параметра:
linear, <, > и др.).Бесконечный цикл часто комбинируется с различными функциями перехода
для создания более естественного движения. Например, <
обозначает ускорение в начале, > — замедление в конце, а
<> — сочетание ускорения и замедления.
rect.animate(1000, '<>').rotate(360).loop();
В этом примере прямоугольник вращается непрерывно с плавным ускорением и замедлением.
loop() с обратным направлениемДля создания эффектов качания или пульсации можно использовать
параметр true в методе loop():
rect.animate(800).scale(1.5).loop(true, true);
true — бесконечный цикл.true — чередование направления: после
достижения конца анимации объект возвращается к исходному
состоянию.Такой подход особенно полезен для плавного увеличения и уменьшения размера элементов, создания дыхательного эффекта или движения «туда-сюда».
SVG.js поддерживает последовательные и параллельные анимации. Бесконечные циклы можно комбинировать с другими анимациями для создания сложных визуальных эффектов:
circle.animate(1500, '<>').move(200, 200).loop(true, true);
circle.animate(1500, '<>').fill({ color: '#00f' }).loop(true, true);
В данном случае круг одновременно перемещается и меняет цвет. Метод
.loop() гарантирует, что обе анимации будут повторяться
бесконечно, создавая синхронизированный эффект.
Для гибкого контроля полезно сохранять анимации в переменные:
const anim = rect.animate(1000).rotate(360).loop();
Это позволяет в любой момент остановить или изменить анимацию:
anim.stop(); // Прекращает анимацию
anim.speed(2); // Ускоряет анимацию в два раза
anim.loop(false); // Прекращает бесконечный цикл
Бесконечные циклы применимы не только для декоративных эффектов, но и для интерактивных элементов:
const pulse = draw.circle(40).fill('green').center(150, 150);
pulse.animate(600).scale(1.3).loop(true, true);
Здесь круг будет постоянно увеличиваться и уменьшаться, создавая эффект пульсации.
В версии 3.x библиотека упростила работу с бесконечными циклами:
.loop() теперь поддерживает передачу функции
обратного вызова для контроля каждого повторения..animate() и .loop() полностью
совместимы с современными браузерами без полифиллов.rect.animate(1200)
.move(300, 50)
.loop(true, false, () => console.log('Повтор завершён'));
Функция обратного вызова позволяет выполнять дополнительную логику на каждом повторении цикла.
loop() с speed(),
pause() и stop() для динамического
контроля.Бесконечные циклы в SVG.js предоставляют мощный инструмент для создания динамических и визуально привлекательных интерфейсов, где объекты постоянно находятся в движении без дополнительного вмешательства.