Чейнинг анимаций в anime.js позволяет создавать последовательные или параллельные эффекты, управляя временем и порядком исполнения анимаций. В отличие от простого запуска одной анимации, чейнинг даёт возможность комбинировать несколько анимаций в единую цепочку, улучшая контроль над сложными визуальными эффектами.
anime({
targets: '.box',
translateX: 250,
duration: 1000,
easing: 'easeInOutQuad',
complete: function() {
anime({
targets: '.box',
translateY: 150,
duration: 800,
easing: 'easeOutBounce'
});
}
});
В приведённом примере анимация по оси X выполняется первой, после
чего запускается анимация по оси Y. Такой подход через
callback complete работает, но усложняет
код при большом количестве последовательностей. Anime.js предоставляет
более элегантное решение — использование объекта
timeline.
Timeline — это объект, позволяющий объединять несколько анимаций в единую цепочку с точным контролем времени запуска каждого шага.
const tl = anime.timeline({
easing: 'easeOutExpo',
duration: 750
});
tl.add({
targets: '.box',
translateX: 250
})
.add({
targets: '.box',
translateY: 150
})
.add({
targets: '.box',
rotate: '1turn'
});
Каждое добавление через метод .add() выполняется
после предыдущего шага по умолчанию, что облегчает
создание последовательных анимаций. При этом Timeline
позволяет:
offset.Параметр offset позволяет запускать анимации
одновременно или с заданной задержкой относительно начала таймлайна или
предыдущего шага:
tl.add({
targets: '.box',
translateX: 300,
duration: 1000
})
.add({
targets: '.circle',
scale: 2,
duration: 500
}, '-=500'); // запуск на 500 мс раньше окончания предыдущей анимации
Здесь '-=500' означает, что анимация элемента
.circle начнётся за 500 мс до конца
предыдущей. Можно использовать положительные значения
('+=300') для явной задержки после предыдущей анимации или
абсолютное число (500) для запуска в конкретное время
относительно начала таймлайна.
Для создания эффекта синхронизированных анимаций достаточно
использовать один timeline и задавать одинаковые offset или
не указывать его вовсе:
tl.add({
targets: '.box',
translateX: 200,
duration: 1000
})
.add({
targets: '.circle',
translateY: 200,
duration: 1000
}, 0); // запуск с начала таймлайна
Оба элемента начнут движение одновременно, но могут иметь разные параметры easing и duration, что позволяет создавать сложные визуальные эффекты без использования нескольких независимых анимаций.
Timeline поддерживает параметры:
loop — повтор всей цепочки заданное количество раз или
бесконечно (true).direction — задаёт направление: 'normal',
'reverse' или 'alternate'.const tl = anime.timeline({
loop: 2,
direction: 'alternate'
});
tl.add({
targets: '.box',
translateX: 300,
duration: 1000
})
.add({
targets: '.box',
translateY: 150,
duration: 800
});
При direction: 'alternate' анимация будет
воспроизводиться в обратном порядке после каждого цикла.
Anime.js позволяет комбинировать timeline с функциями
begin, update, complete для
каждого шага:
tl.add({
targets: '.box',
translateX: 300,
duration: 1000,
begin: () => console.log('Начало анимации X'),
complete: () => console.log('Конец анимации X')
})
.add({
targets: '.box',
translateY: 150,
duration: 800,
update: anim => console.log(`Текущее значение: ${anim.animatables[0].target.style.transform}`)
});
Это удобно для интеграции анимаций с логикой приложения, например для запуска событий или синхронизации с другими эффектами.
Параметры анимации можно задавать функциями, что особенно полезно при работе с таймлайном:
tl.add({
targets: '.box',
translateX: () => Math.random() * 300,
duration: 1000
})
.add({
targets: '.circle',
scale: el => el.dataset.factor || 1,
duration: 800
});
Таким образом можно создавать анимации, зависящие от данных элементов, без ручного расчёта каждого значения.
offset даёт полный контроль над
синхронизацией шагов.loop и direction упрощают создание
циклических анимаций.begin,
update, complete позволяет интегрировать
анимации с логикой интерфейса.Чейнинг анимаций в anime.js — это инструмент, который превращает простой визуальный эффект в сложную, управляемую последовательность, легко настраиваемую под любые задачи.