В библиотеке anime.js ключевые кадры
(keyframes) позволяют создавать сложные анимации, объединяя
изменения нескольких свойств объекта в единой временной шкале. Каждое
свойство может изменяться независимо, а ключевые кадры задаются в виде
массива объектов с указанием значений и времени их достижения.
Простейший синтаксис выглядит так:
anime({
targets: '.box',
keyframes: [
{ translateX: 250 },
{ translateY: 150 },
{ rotate: '1turn' }
],
duration: 2000,
easing: 'easeInOutSine'
});
В этом примере объект сначала перемещается по оси X, затем по оси Y, и в конце выполняется полный поворот. Важно понимать, что каждый объект в массиве keyframes представляет собой отдельный шаг анимации, который может влиять на одно или несколько свойств одновременно.
Каждый ключевой кадр может содержать сразу несколько свойств:
anime({
targets: '.circle',
keyframes: [
{ translateX: 100, scale: 1.5 },
{ translateY: 80, rotate: '45deg' },
{ scale: 1, rotate: '0deg' }
],
duration: 3000,
easing: 'easeInOutQuad'
});
В этом примере в первом ключевом кадре одновременно изменяются
позиция по X и масштаб. Во втором
кадре одновременно сдвигается объект по Y и вращается на 45°. Такой
подход позволяет создавать синхронные эффекты без необходимости отдельно
комбинировать несколько анимаций через anime.timeline.
Каждый ключевой кадр может содержать свои параметры времени, такие
как duration, delay и easing. Это
позволяет гибко управлять траекторией анимации и скоростью изменения
отдельных свойств:
anime({
targets: '.square',
keyframes: [
{ translateX: 200, duration: 800 },
{ translateY: 100, duration: 600, delay: 200, easing: 'easeOutElastic(1, .8)' },
{ rotate: '180deg', scale: 0.5, duration: 1000 }
]
});
В данном примере первый ключевой кадр длится 800 мс, второй стартует с задержкой 200 мс и использует индивидуальный тип easing. Каждое свойство может иметь свои настройки, если указать их непосредственно внутри объекта keyframe.
Для сложных анимаций часто используют timeline, который позволяет объединять несколько keyframes и синхронизировать их с другими анимациями:
let tl = anime.timeline({
easing: 'easeInOutSine',
duration: 1000
});
tl.add({
targets: '.box1',
keyframes: [
{ translateX: 100, scale: 1.2 },
{ translateY: 50, scale: 0.8 }
]
})
.add({
targets: '.box2',
keyframes: [
{ translateY: 150, rotate: '90deg' },
{ translateX: 200, rotate: '180deg' }
], offset: '-=500'
});
Здесь первый блок keyframes начинает анимацию для .box1,
второй блок для .box2 запускается с пересечением на 500 мс.
Такой подход позволяет комбинировать анимации нескольких
объектов и свойств одновременно, создавая сложные эффекты
движения и трансформаций.
Для каждого свойства keyframe можно задавать функцию, которая возвращает значение на основе индекса или других параметров:
anime({
targets: '.dot',
keyframes: [
{ translateX: el => el.getAttribute('data-x'), scale: el => el.dataset.scale },
{ translateY: 200, rotate: el => el.dataset.rotate }
],
duration: 1500,
easing: 'easeInOutCubic'
});
Это позволяет динамически управлять каждым свойством в зависимости от конкретного элемента, что делает keyframes особенно мощным инструментом при работе с множественными объектами.
Для точной координации нескольких изменений свойств можно
использовать параметр offset, который задает момент начала
ключевого кадра относительно начала всей анимации:
anime({
targets: '.triangle',
keyframes: [
{ translateX: 150, offset: 0 },
{ translateY: 100, scale: 1.2, offset: 0.5 },
{ rotate: '360deg', offset: 0.75 }
],
duration: 2000
});
В этом примере translateX начинается сразу,
translateY и scale запускаются в середине
анимации, а вращение — ближе к концу. Использование offset
позволяет точно расставлять моменты изменения каждого свойства,
делая анимацию более контролируемой и предсказуемой.
Эти подходы позволяют создавать сложные, плавные и настраиваемые анимации, используя весь потенциал anime.js без избыточного кода.