Anime.js предоставляет гибкий способ связывать анимацию с HTML-элементами, используя data-атрибуты. Это позволяет хранить параметры анимации непосредственно в разметке, что делает код более читаемым и масштабируемым.
Пример базового синтаксиса с data-атрибутами:
<div class="box" data-translate-x="250" data-rotate="360"></div>
const boxes = document.querySelectorAll('.box');
boxes.forEach(box => {
anime({
targets: box,
translateX: box.dataset.translateX,
rotate: box.dataset.rotate,
duration: 2000,
easing: 'easeInOutQuad'
});
});
В этом примере значения translateX и rotate
берутся прямо из атрибутов data-translate-x и
data-rotate. Использование dataset
обеспечивает простое считывание любых кастомных данных элемента.
Data-атрибуты позволяют изменять параметры анимации без редактирования JavaScript-кода. Для этого можно использовать универсальные функции, которые считывают все данные элемента и автоматически применяют их к анимации.
Пример динамической генерации анимации:
<div class="circle"
data-scale="1.5"
data-duration="1500"
data-easing="easeOutElastic(1, .5)">
</div>
const circles = document.querySelectorAll('.circle');
circles.forEach(circle => {
const { scale, duration, easing } = circle.dataset;
anime({
targets: circle,
scale: scale,
duration: parseInt(duration),
easing: easing
});
});
Ключевые моменты:
element.dataset.parseInt или
parseFloat.easeOutElastic(1, .5), и использовать их напрямую.Иногда удобно хранить несколько значений в одном атрибуте, разделяя их запятыми. Это особенно полезно для анимаций с последовательными ключевыми кадрами.
Пример:
<div class="square" data-keyframes="0:0,50:100,100:0"></div>
const squares = document.querySelectorAll('.square');
squares.forEach(square => {
const keyframes = square.dataset.keyframes
.split(',')
.map(frame => frame.split(':').map(Number));
anime({
targets: square,
translateY: keyframes.map(kf => kf[1]),
duration: 2000,
easing: 'linear'
});
});
Здесь каждый элемент keyframes разбивается на массив
чисел, который затем используется для построения анимации.
Data-атрибуты можно применять не только для параметров анимации, но и для условий запуска. Например, можно хранить событие, на которое должна реагировать анимация.
<button class="btn" data-action="hover">Hover me</button>
<div class="ball" data-translate-x="200"></div>
const btns = document.querySelectorAll('.btn');
btns.forEach(btn => {
const action = btn.dataset.action;
const ball = document.querySelector('.ball');
if (action === 'hover') {
btn.addEventListener('mouseenter', () => {
anime({
targets: ball,
translateX: ball.dataset.translateX,
duration: 1000,
easing: 'easeOutExpo'
});
});
}
});
Это позволяет создавать модульные анимации, которые легко конфигурировать через HTML, без необходимости менять JavaScript.
Для более сложных случаев можно хранить JSON-структуры в data-атрибутах. Это полезно, если один элемент управляет множеством свойств одновременно.
<div class="star" data-animation='{"translateX":300,"rotate":720,"scale":1.5,"duration":2000}'></div>
const stars = document.querySelectorAll('.star');
stars.forEach(star => {
const animationData = JSON.parse(star.dataset.animation);
anime({
targets: star,
...animationData,
easing: 'easeInOutSine'
});
});
Преимущества:
data-animate-*.Для анимаций групп элементов можно использовать
querySelectorAll и массивное считывание data-атрибутов.
<div class="dot" data-delay="0"></div>
<div class="dot" data-delay="200"></div>
<div class="dot" data-delay="400"></div>
const dots = document.querySelectorAll('.dot');
anime({
targets: dots,
translateY: 50,
delay: el => parseInt(el.dataset.delay),
duration: 1000,
easing: 'easeInOutQuad'
});
Это позволяет создавать эффекты последовательного появления или движения без ручного задания каждой анимации в JS.
Использование data-атрибутов в anime.js делает код чистым, гибким и легко настраиваемым, а также позволяет отделять логику анимации от структуры HTML. Такой подход особенно эффективен при работе с большими проектами, где необходимо централизованно управлять анимацией множества элементов.