В anime.js анимации могут состоять из нескольких ключевых
кадров (keyframes), каждый из которых описывает отдельное
состояние анимируемого объекта в определённый момент времени. Управление
временем выполнения каждого ключевого кадра позволяет создавать более
сложные и динамичные эффекты. Параметр duration играет
ключевую роль в этом процессе.
Каждый элемент массива keyframes может содержать
собственный набор свойств анимации и индивидуальное время выполнения.
Стандартная структура ключевого кадра:
{
value: 100, // конечное значение свойства
duration: 500, // длительность перехода до этого значения (в миллисекундах)
easing: 'easeInOutQuad' // функция сглаживания для конкретного ключевого кадра
}
Если duration не указан для конкретного ключевого кадра,
anime.js использует общую длительность анимации,
заданную через duration на уровне всей анимации. Это
позволяет комбинировать длинные и короткие переходы внутри одной цепочки
keyframes.
duration для keyframesanime({
targets: '.box',
translateX: [
{ value: 100, duration: 500 }, // быстрый переход
{ value: 200, duration: 1500 }, // медленный переход
{ value: 50, duration: 800 } // средняя скорость
],
easing: 'linear'
});
В этом примере элемент .box сначала перемещается на
100px за 0.5 секунды, затем медленно до 200px за 1.5 секунды, и обратно
на 50px за 0.8 секунды. Каждое значение duration управляет
скоростью конкретного шага, независимо от других.
easingПараметр duration тесно связан с easing.
Разные кривые сглаживания могут изменять восприятие скорости:
anime({
targets: '.circle',
scale: [
{ value: 1.5, duration: 400, easing: 'easeOutElastic(1, .8)' },
{ value: 1, duration: 600, easing: 'easeInOutQuad' }
]
});
Здесь первый ключевой кадр длится 0.4 секунды и создаёт эффект резкого «выброса» с эластичной кривой, второй длится 0.6 секунды и возвращает объект к исходному размеру плавно.
Anime.js позволяет анимировать несколько свойств одновременно, каждый с собственной длительностью и easing:
anime({
targets: '.square',
keyframes: [
{ translateX: 200, scale: 1.5, duration: 1000 },
{ translateX: 0, scale: 1, duration: 500 }
],
easing: 'easeInOutSine'
});
Если необходимо более тонкое управление, для каждого свойства внутри keyframe можно использовать объект:
anime({
targets: '.square',
keyframes: [
{ translateX: { value: 200, duration: 1000 }, scale: { value: 1.5, duration: 1500 } },
{ translateX: { value: 0, duration: 500 }, scale: { value: 1, duration: 700 } }
]
});
В этом примере translateX и scale будут
изменяться с разными скоростями в рамках одного ключевого кадра.
durationДлительность ключевого кадра может быть задана функцией, возвращающей значение в миллисекундах. Это удобно для анимации нескольких элементов с разной скоростью:
anime({
targets: '.dot',
translateY: [
{ value: 100, duration: el => el.dataset.index * 200 },
{ value: 0, duration: el => el.dataset.index * 300 }
]
});
Каждый элемент .dot получает уникальное время перехода,
зависящее от его data-index.
duration на уровне keyframesduration в keyframe всегда имеет приоритет над глобальным
duration всей анимации.Для сложных анимаций с множеством keyframes лучше явно задавать
duration для каждого шага. Это делает поведение
предсказуемым и упрощает синхронизацию с другими эффектами, например,
звуковыми или пользовательскими событиями.
Использование отдельных длительностей превращает anime.js из простого инструмента анимации в мощный движок для сложных последовательных и параллельных эффектов.