Anime.js предоставляет гибкий и мощный инструмент для создания сложных анимаций в браузере. Композиция анимационных элементов позволяет объединять отдельные анимации в последовательности, параллельные группы или циклические цепочки, обеспечивая точный контроль над временем и поведением анимации.
Для начала важно понимать структуру анимации в anime.js. Основной
метод — anime() — принимает объект конфигурации:
anime({
targets: '.box',
translateX: 250,
duration: 1000,
easing: 'easeInOutQuad'
});
Для сложной композиции используется anime.timeline().
Этот метод позволяет объединять несколько анимаций в одну цепочку с
управлением временем старта каждого шага.
const tl = anime.timeline({
easing: 'easeOutExpo',
duration: 750
});
tl.add({
targets: '.box1',
translateX: 250
})
.add({
targets: '.box2',
translateY: 150
}, '-=500') // начнется на 500мс раньше завершения предыдущей анимации
.add({
targets: '.box3',
scale: 1.5
});
Ключевые моменты timeline:
offset: 500) или относительного
('-=500').loop или direction.Функции easing определяют динамику движения. В комбинации с timeline можно добиться сложных эффектов:
easeInOutQuad — плавное ускорение и замедление.easeOutElastic — эффект «отскока».linear — постоянная скорость.delay задает индивидуальную задержку перед запуском
анимации.offset управляет стартом анимации относительно
timeline.anime({
targets: '.box',
translateX: 200,
delay: (el, i) => i * 100
});
Один объект анимации может включать несколько свойств одновременно:
anime({
targets: '.circle',
translateX: 250,
translateY: 100,
rotate: '1turn',
scale: 1.2,
duration: 1200,
easing: 'easeInOutSine'
});
Особенности:
'+=50') и
абсолютные (250).loop: true.Keyframes позволяют создавать сложные, многосоставные движения без использования timeline:
anime({
targets: '.star',
keyframes: [
{ translateX: 100 },
{ translateY: 50 },
{ rotate: 180 },
{ scale: 2 }
],
duration: 2000,
easing: 'easeInOutSine'
});
offset для точной синхронизации
отдельных шагов.add().Для композиции анимаций важна возможность реагировать на события:
anime({
targets: '.box',
translateX: 300,
duration: 1000,
complete: () => console.log('Анимация завершена')
});
Можно использовать функции для вычисления значений на лету:
anime({
targets: '.box',
translateX: el => el.getAttribute('data-x') || 0,
duration: 1000
});
true для
бесконечного цикла).'normal',
'reverse', 'alternate' для обратного
движения.anime({
targets: '.circle',
translateY: 200,
loop: true,
direction: 'alternate',
easing: 'easeInOutQuad'
});
Это позволяет создавать непрерывные эффекты, синхронизированные между несколькими объектами.
Такой подход обеспечивает полное управление сложными анимациями, позволяя объединять простые движения в динамичные, многослойные композиции.