Anime.js предоставляет мощные возможности для анимации не одного, а сразу нескольких элементов на странице. Работа с множественными элементами позволяет создавать сложные визуальные эффекты, синхронизированные анимации и динамические взаимодействия.
Для анимации группы элементов используется селектор CSS или массив DOM-элементов. Пример с использованием селектора:
anime({
targets: '.box',
translateX: 250,
duration: 1000,
easing: 'easeInOutQuad'
});
Здесь .box выбирает все элементы с классом
box. Анимация применяется ко всем выбранным элементам
одновременно.
Также можно использовать массив элементов:
const boxes = document.querySelectorAll('.box');
anime({
targets: boxes,
scale: 1.5,
duration: 800
});
В этом случае targets принимает NodeList или массив
элементов, что дает точный контроль над набором объектов.
Для создания эффекта последовательной анимации используется функция
stagger. Она позволяет задавать задержку между стартами
анимаций разных элементов. Например:
anime({
targets: '.box',
translateY: 100,
delay: anime.stagger(200), // задержка 200 мс между элементами
duration: 500
});
Можно комбинировать с направлением анимации:
anime({
targets: '.box',
translateX: anime.stagger(50, {start: 0, direction: 'reverse'}),
duration: 600
});
direction: 'reverse' запускает анимацию с последнего
элемента к первому.
Anime.js позволяет задавать разные значения для каждого элемента в группе с помощью функции в параметре свойства:
anime({
targets: '.box',
translateX: function(el, i) {
return i * 50; // каждый элемент сдвигается на 50px больше предыдущего
},
duration: 800
});
Аргументы функции: el — текущий элемент, i
— его индекс в выборке.
Для более сложных сценариев используется anime.timeline,
который позволяет объединять множественные анимации в
последовательность:
const tl = anime.timeline({
easing: 'easeOutExpo',
duration: 750
});
tl.add({
targets: '.box',
translateX: anime.stagger(100),
opacity: [0, 1]
})
.add({
targets: '.circle',
scale: [0, 1],
delay: anime.stagger(100, {start: 500})
});
Timeline обеспечивает точный контроль порядка и времени запуска анимаций нескольких групп элементов.
Для множественных элементов SVG можно анимировать атрибуты, такие как
strokeDashoffset, stroke,
fill:
anime({
targets: 'circle',
strokeDashoffset: [anime.setDashoffset, 0],
delay: anime.stagger(200),
duration: 1200,
easing: 'easeInOutSine'
});
Использование anime.setDashoffset позволяет динамически
рассчитывать длину пути для каждого элемента.
Anime.js поддерживает коллбэки для каждой группы:
begin — вызывается в начале всей анимации.complete — в конце всей анимации.update — на каждом кадре.change — при изменении конкретного свойства.loopBegin, loopComplete — при цикличной
анимации.Для множественных элементов коллбэки можно комбинировать с индексами элементов:
anime({
targets: '.box',
translateY: 150,
delay: anime.stagger(100),
complete: function(anim) {
console.log('Анимация завершена для всех элементов');
}
});
Используя stagger и функции для параметров, можно
создавать сложные визуальные эффекты, такие как волны, цепные реакции и
радиальные анимации. Пример радиального распределения:
const boxes = document.querySelectorAll('.box');
const radius = 100;
boxes.forEach((el, i) => {
const angle = (i / boxes.length) * 2 * Math.PI;
anime({
targets: el,
translateX: Math.cos(angle) * radius,
translateY: Math.sin(angle) * radius,
duration: 1000,
easing: 'easeInOutQuad'
});
});
Каждый элемент перемещается по круговой траектории, создавая эффект равномерного распределения.
Anime.js позволяет одновременно анимировать несколько свойств и
элементов без использования timeline, используя разные параметры
duration, delay и easing:
anime({
targets: '.box',
translateX: [0, 200],
rotate: [0, 360],
scale: [1, 1.5],
delay: anime.stagger(100),
duration: 1000,
easing: 'easeInOutCubic'
});
Это обеспечивает создание насыщенных динамических эффектов без потери синхронности.