В библиотеке anime.js управление временем анимации
реализуется через несколько ключевых свойств: duration,
delay, endDelay, loop,
direction и easing. Для создания более
динамичных и сложных анимаций важно понимать, как использовать
относительные значения времени, позволяющие задавать
задержки и длительность анимации не только в абсолютных миллисекундах,
но и относительно других свойств или текущего состояния анимации.
По умолчанию значения duration и delay
задаются в миллисекундах:
anime({
targets: '.box',
translateX: 250,
duration: 1000, // 1000 мс = 1 секунда
delay: 500 // задержка перед стартом анимации
});
Вместо конкретных чисел можно использовать функции, которые вычисляют значение в момент запуска анимации. Это основной способ задания относительных значений времени.
anime({
targets: '.box',
translateX: 250,
duration: (el, i, total) => 500 + i * 200, // увеличение длительности для каждого элемента
delay: (el, i, total) => i * 100 // смещение старта каждого элемента относительно предыдущего
});
Пояснение параметров функции:
el – DOM-элемент, к которому применяется анимация.i – индекс элемента в коллекции
targets.total – общее количество элементов в
targets.Такой подход позволяет создавать последовательные и каскадные анимации без ручного расчёта времени для каждого объекта.
Относительные задержки (delay) часто применяются для
каскадного запуска анимаций:
anime({
targets: '.item',
translateY: 50,
duration: 800,
delay: anime.stagger(100) // каждый последующий элемент запускается с задержкой 100 мс
});
anime.stagger() – встроенная функция для задания
равномерных и динамических промежутков между элементами. Она принимает
следующие варианты конфигурации:
anime.stagger(value, options)
value – базовое смещение (в мс или px для
трансформаций).
options:
start – начальная задержка для первого элемента.from – индекс стартового элемента (first,
last, center или число).grid – при работе с сетками, задаёт количество колонок
и рядов.axis – направление расчета смещения (x или
y).Пример с сеткой и центрального элемента:
anime({
targets: '.grid-item',
translateY: 50,
duration: 600,
delay: anime.stagger(100, { from: 'center', grid: [5, 5], axis: 'y' })
});
Каждый элемент получает задержку относительно центрального элемента сетки, создавая эффект “волн”.
Длительность анимации также можно задавать через функции, основываясь на индексе элемента, предыдущих анимациях или даже случайных значениях:
anime({
targets: '.circle',
scale: [0, 1],
duration: (el, i) => 500 + i * 100,
easing: 'easeOutElastic(1, .8)'
});
Можно комбинировать с delay, чтобы анимация элементов
была не только последовательной, но и изменяла скорость для каждого
элемента, создавая визуальный эффект нарастающей динамики.
+= и -= для относительного времениДля delay и duration поддерживаются
относительные арифметические выражения:
anime({
targets: '.box',
translateX: 300,
duration: '+=200', // добавляет 200 мс к базовой длительности
delay: '-=100' // уменьшает стартовую задержку на 100 мс
});
Такая запись позволяет легко корректировать время анимации без пересчета абсолютных значений, особенно при работе с группами анимаций или последовательными вызовами.
Timeline позволяет объединять несколько анимаций с относительными значениями времени:
let tl = anime.timeline({
easing: 'easeOutExpo',
duration: 750
});
tl.add({
targets: '.box1',
translateX: 250
})
.add({
targets: '.box2',
translateX: 250,
offset: '-=400' // стартует за 400 мс до окончания предыдущей анимации
})
.add({
targets: '.box3',
translateX: 250,
offset: '+=200' // стартует через 200 мс после предыдущей анимации
});
offset принимает:
500)'+=200',
'-=100')'first' или 'last' для
синхронизации с первой или последней анимацией в timelineЭто особенно удобно для сложных сцен с множественными объектами и динамическими задержками.
duration и
delay, если необходимо динамическое распределение
времени между элементами.anime.stagger ускоряет создание
каскадных и сеточных анимаций.offset позволяет точно управлять синхронизацией
анимаций.+=, -=) лучше использовать для
корректировок или постепенного наращивания эффекта.delay: () => Math.random() * 500
Это создаёт ощущение хаотичной, живой анимации.
Относительные значения времени в anime.js дают гибкость для
управления анимацией на уровне каждого элемента и всей
сцены, позволяя создавать плавные, каскадные,
синхронизированные и динамичные эффекты без сложных вычислений.
Комбинация функций, stagger, offset и
относительных выражений открывает практически безграничные возможности в
проектировании времени анимации.