В библиотеке anime.js управление анимацией
осуществляется через внутренний цикл рендеринга, который автоматически
обновляет свойства объектов на каждом кадре. Однако иногда требуется
полностью контролировать момент обновления анимации — например, при
интеграции с нестандартным рендерингом, игровыми циклами или при
оптимизации производительности. Для таких случаев используется функция
tick, позволяющая вручную прогонять
анимацию.
Каждая анимация в anime.js создаётся через вызов
anime(), который возвращает объект
анимации. Этот объект содержит метод
tick(elapsed), где elapsed —
количество миллисекунд, прошедших с начала анимации.
let animation = anime({
targets: '.box',
translateX: 250,
duration: 1000,
autoplay: false
});
// Прогон анимации на 500 мс
animation.tick(500);
Ключевые моменты:
autoplay: false обязателен для ручного
обновления, иначе анимация будет запускаться автоматически.tick позволяет обновить
состояние анимации на конкретный момент времени.tick не запускает внутренний
requestAnimationFrame, он только пересчитывает свойства и
применяет их к элементам.Метод tick использует
относительное время от начала анимации. Это значит, что
можно прокручивать анимацию как вперед, так и назад:
animation.tick(200); // Промотка к 200 мс
animation.tick(800); // Промотка к 800 мс
Если передать значение больше duration,
анимация достигнет конечного состояния:
animation.tick(1500); // Элемент будет на конечной позиции
В игровых движках часто используется цикл update с
фиксированным шагом. С помощью tick можно
синхронизировать анимацию anime.js с этим циклом:
let animation = anime({
targets: '.sprite',
translateY: 300,
duration: 2000,
easing: 'linear',
autoplay: false
});
let startTime = performance.now();
function gameLoop() {
let now = performance.now();
let elapsed = now - startTime;
animation.tick(elapsed);
requestAnimationFrame(gameLoop);
}
gameLoop();
Особенности такого подхода:
Для сложных эффектов, где значение анимации нужно получать для
расчётов или передачи в другие системы,
tick позволяет получить текущее
состояние:
let animation = anime({
targets: '.circle',
scale: [1, 2],
duration: 1000,
autoplay: false
});
animation.tick(400);
console.log(animation.animatables[0].target.style.transform);
// Выводит текущее значение transform после 400 мс
animatables содержит массив
всех элементов, участвующих в анимации.tick можно использовать для кастомных
вычислений, синхронизации с другими эффектами или логикой игры.anime.timeline также поддерживает ручное обновление
через tick. При этом передаваемое значение времени
учитывает все последовательные анимации внутри таймлайна:
let tl = anime.timeline({ autoplay: false });
tl
.add({
targets: '.box1',
translateX: 200,
duration: 1000
})
.add({
targets: '.box2',
translateY: 200,
duration: 1000
});
tl.tick(1500); // Перемещает box1 полностью и частично box2
autoplay: false для ручного контроля.tick идеально подходит для интеграции с
requestAnimationFrame, игровыми движками или таймлайнами
видео.tick можно напрямую работать с элементами через
animatables.tick можно
вызывать с меньшим временем, чтобы анимация шла в обратную сторону.Использование tick открывает
возможности точного контроля анимаций, делая anime.js гибким
инструментом для продвинутых интерфейсов, игровых эффектов и
синхронизации с внешними системами времени.