В Snap.svg анимация объектов строится на методе animate,
который позволяет плавно изменять свойства элементов SVG за определённое
время. Одним из ключевых аспектов создания сложных последовательностей
анимаций является управление задержкой начала анимации.
Задержка позволяет запускать анимацию не сразу, а через определённый
интервал времени, создавая эффекты цепочек и синхронизаций.
Простейший способ реализовать задержку — использование функции
setTimeout:
var s = Snap("#svg");
// Создание прямоугольника
var rect = s.rect(50, 50, 100, 100).attr({
fill: "#3498db"
});
// Запуск анимации с задержкой 1 секунда
setTimeout(function() {
rect.animate({ x: 200, fill: "#e74c3c" }, 1000, mina.easeinout);
}, 1000);
Здесь setTimeout откладывает вызов метода
animate, создавая эффект задержки. Недостаток
такого подхода — сложность управления сложными
последовательными анимациями и невозможность легко синхронизировать
несколько объектов.
mina.delaySnap.svg включает встроенный механизм для более удобного контроля
задержки через объект mina. Несмотря на то, что
animate напрямую не принимает параметр delay,
можно использовать комбинацию анимации и функций обратного
вызова для точного управления временем запуска.
Пример последовательной анимации с использованием обратных вызовов:
var circle1 = s.circle(50, 50, 30).attr({ fill: "#2ecc71" });
var circle2 = s.circle(150, 50, 30).attr({ fill: "#f1c40f" });
circle1.animate({ cx: 150 }, 1000, mina.easeinout, function() {
circle2.animate({ cx: 250 }, 1000, mina.easeinout);
});
Преимущество такого подхода — возможность строить сложные последовательности без внешних таймеров. Недостаток — “глубокая вложенность” обратных вызовов при большом количестве элементов.
Для более масштабных проектов лучше использовать промисы, что упрощает управление последовательными анимациями:
function animateElement(el, attrs, duration) {
return new Promise(function(resolve) {
el.animate(attrs, duration, mina.easeinout, resolve);
});
}
animateElement(circle1, { cx: 150 }, 1000)
.then(() => animateElement(circle2, { cx: 250 }, 1000))
.then(() => console.log("Все анимации завершены"));
Такой подход позволяет:
Если требуется параллельное выполнение анимаций с разной
задержкой, удобно использовать forEach с
setTimeout:
var colors = ["#e74c3c", "#3498db", "#2ecc71"];
var circles = colors.map((color, i) => s.circle(50, 50 + i*60, 30).attr({ fill: color }));
circles.forEach((circle, index) => {
setTimeout(() => {
circle.animate({ cx: 250 }, 1000, mina.easeinout);
}, index * 500); // Задержка увеличивается для каждого элемента
});
Так создается эффект ступенчатой анимации, где каждый объект начинает движение с определённым интервалом.
Snap.animateМетод Snap.animate позволяет создавать кастомные
анимации с функциями обратного вызова и временными
интервалами:
var start = 0;
Snap.animate(start, 100, function(value) {
circle1.attr({ cx: value });
}, 1000, mina.easeinout, function() {
console.log("Анимация завершена");
});
Путём комбинирования с setTimeout можно реализовать
точный контроль времени запуска, создавая синхронные
или асинхронные эффекты для нескольких элементов.
mina.easeinout или другие
easing-функции для плавного старта и остановки анимаций.click, hover) или к
таймеру, что делает анимацию динамичной и интерактивной.Такое управление задержкой в Snap.svg позволяет создавать сложные, динамичные и визуально привлекательные анимации, которые легко масштабировать и поддерживать, сохраняя чистоту кода.