Anime.js позволяет создавать динамичные анимации с высоким уровнем контроля. Для переиспользуемых анимаций ключевым является подход с созданием функций и объектов конфигурации, которые можно применять к разным элементам без дублирования кода.
Конфигурация анимации в anime.js задается объектом с параметрами,
такими как targets, translateX,
rotate, duration, easing и
другими. Для переиспользования удобно хранить эти параметры в отдельной
переменной:
const fadeInConfig = {
opacity: [0, 1],
duration: 1000,
easing: 'easeOutQuad'
};
Теперь эту конфигурацию можно применять к любым элементам, изменяя
только свойство targets:
anime({ ...fadeInConfig, targets: '.box1' });
anime({ ...fadeInConfig, targets: '.box2' });
Использование оператора spread (...)
позволяет сохранять неизменность исходного объекта и адаптировать его
под конкретные элементы.
Более гибкий подход — оборачивать конфигурацию в функцию. Функция может принимать параметры, влияющие на анимацию, такие как элемент, задержка или длительность:
function createSlideAnimation(target, delay = 0, duration = 1000) {
return anime({
targets: target,
translateX: [0, 250],
opacity: [0, 1],
delay: delay,
duration: duration,
easing: 'easeOutExpo'
});
}
createSlideAnimation('.item1', 0, 800);
createSlideAnimation('.item2', 300, 1200);
Такая структура облегчает масштабирование анимаций на разных компонентах страницы и повышает читаемость кода.
Anime.js предоставляет объект anime.timeline, который
позволяет создавать цепочки анимаций, сохранять их
логику и повторно использовать как единое действие:
const fadeInSlideTimeline = anime.timeline({
easing: 'easeOutExpo',
duration: 800
});
fadeInSlideTimeline
.add({
targets: '.card1',
opacity: [0, 1],
translateY: [-50, 0]
})
.add({
targets: '.card2',
opacity: [0, 1],
translateY: [-50, 0]
}, '-=400'); // перекрытие по времени
Использование timeline делает анимации более структурированными и позволяет легко изменять порядок и время воспроизведения элементов.
Для гибкости переиспользуемых анимаций можно использовать функции внутри параметров. Например, задавая начальные и конечные значения в зависимости от индекса элемента:
anime({
targets: '.list-item',
translateX: el => el.dataset.offset || 100,
delay: (el, i) => i * 100,
duration: 600,
easing: 'easeInOutSine'
});
Функции позволяют создавать динамические анимации, где каждый элемент ведет себя индивидуально, при этом конфигурация остается общей.
Для сложных анимаций полезно создавать несколько конфигураций и комбинировать их через функции или timeline:
const fadeConfig = { opacity: [0, 1], duration: 500 };
const moveConfig = { translateY: [-20, 0], easing: 'easeOutQuad' };
function animateElement(target) {
return anime({
targets: target,
...fadeConfig,
...moveConfig
});
}
animateElement('.header');
animateElement('.footer');
Такой подход упрощает поддержание кода и добавление новых эффектов без переписывания существующих анимаций.
Иногда требуется, чтобы одна анимация запускала другую. Это можно
реализовать с помощью callback-функций complete или событий
timeline:
function animateCard(target) {
return anime({
targets: target,
scale: [0, 1],
duration: 600,
easing: 'spring(1, 80, 10, 0)',
complete: () => {
anime({
targets: target,
rotate: [0, 360],
duration: 800,
easing: 'easeInOutSine'
});
}
});
}
animateCard('.card');
Такой подход повышает модульность анимаций и позволяет строить сложные цепочки без дублирования кода.
Эти методы позволяют строить гибкие, легко модифицируемые и переиспользуемые анимации, что особенно важно при работе с большими веб-проектами.