В библиотеке anime.js анимации управляются через
объекты анимации, создаваемые функцией anime(). Каждая
анимация имеет собственное состояние, но для сложных интерфейсов часто
требуется глобальное управление всеми анимациями
одновременно. Для этого используются встроенные свойства и
методы, которые позволяют управлять временем, паузами, проигрыванием и
цикличностью на уровне всей анимации или группы анимаций.
Каждая анимация в anime.js имеет следующие ключевые свойства состояния:
Пример получения прогресса:
const animation = anime({
targets: '.box',
translateX: 250,
duration: 2000
});
console.log(animation.progress); // 0 изначально
Можно изменять текущее время глобально через свойство
seek:
animation.seek(1000); // Перемотка на 1000 мс
Для комплексных интерфейсов часто создают массив анимаций и управляют ими как единым объектом:
const animations = [
anime({ targets: '.box1', translateX: 100, duration: 1000, autoplay: false }),
anime({ targets: '.box2', translateY: 150, duration: 1500, autoplay: false }),
anime({ targets: '.box3', scale: 2, duration: 1200, autoplay: false })
];
// Старт всех анимаций одновременно
animations.forEach(anim => anim.play());
// Пауза всех анимаций
animations.forEach(anim => anim.pause());
Использование массива анимаций позволяет централизованно управлять их состоянием без необходимости обращаться к каждой отдельно.
anime.js предоставляет несколько методов для работы с состоянием анимаций:
Пример динамического изменения состояния:
const anim = anime({
targets: '.circle',
translateX: 300,
duration: 2000,
loop: true,
autoplay: false
});
anim.play();
setTimeout(() => anim.reverse(), 1000); // Меняем направление через 1 секунду
setTimeout(() => anim.pause(), 1500); // Пауза через 1.5 секунды
anime.timeline для централизованного контроляTimeline — мощный инструмент для объединения нескольких анимаций в единую последовательность. Он позволяет управлять глобальным состоянием всех анимаций внутри таймлайна.
const tl = anime.timeline({
autoplay: false
});
tl
.add({
targets: '.box1',
translateX: 250,
duration: 1000
})
.add({
targets: '.box2',
translateY: 150,
duration: 1000
}, '-=500'); // Запуск второй анимации на 500 мс раньше конца первой
tl.play(); // Глобальный старт всех анимаций таймлайна
tl.pause(); // Пауза всей последовательности
tl.seek(750); // Перемотка всех анимаций на 750 мс
Использование таймлайнов обеспечивает синхронизацию нескольких анимаций и упрощает глобальное управление состоянием.
С помощью параметров loop и методов
reverse() можно управлять повторениями и изменением
направления анимации:
const anim = anime({
targets: '.square',
rotate: 360,
duration: 2000,
loop: true,
autoplay: false
});
anim.play();
// Через 3 секунды меняем направление для всех повторений
setTimeout(() => anim.reverse(), 3000);
Это позволяет создавать бесконечные и интерактивные анимации с динамическим управлением прогрессом и направлением.
Глобальное управление анимациями часто интегрируют с внешними событиями, например, скроллингом или кликами:
const anim = anime({
targets: '.panel',
translateY: 500,
duration: 2000,
autoplay: false
});
window.addEventListener('scroll', () => {
const scrollPos = window.scrollY;
anim.seek(scrollPos); // Связывание анимации с прокруткой
});
Таким образом, глобальное состояние анимации может быть привязано к любым внешним факторам, что делает anime.js гибким инструментом для сложных интерфейсов.
Для глобального контроля состояния важно использовать колбэки событий:
begin – при запуске анимации.update – на каждом кадре анимации.complete – при завершении анимации.loopBegin / loopComplete – при начале и
завершении цикла.Пример:
const anim = anime({
targets: '.dot',
translateX: 400,
duration: 2000,
loop: true,
update: anim => {
console.log(`Прогресс: ${anim.progress}%`);
},
complete: () => {
console.log('Анимация завершена');
}
});
anim.play();
Использование этих колбэков позволяет мониторить глобальное состояние и выполнять действия при изменении прогресса или завершении анимации.
Для масштабных проектов можно объединять несколько таймлайнов, управляя ими через единый объект:
const mainTimeline = anime.timeline({ autoplay: false });
const secondaryTimeline = anime.timeline({ autoplay: false });
mainTimeline.add({ targets: '.box1', translateX: 200, duration: 1000 });
secondaryTimeline.add({ targets: '.box2', translateY: 150, duration: 1000 });
// Глобальный старт всех таймлайнов
[mainTimeline, secondaryTimeline].forEach(tl => tl.play());
Это обеспечивает единый контроль над всеми анимациями в проекте, сохраняя гибкость управления прогрессом, паузами и направлением.