В библиотеке anime.js под анимируемыми свойствами понимаются любые значения, которые могут изменяться во времени. Это включает CSS-свойства, атрибуты HTML и SVG, трансформации, числовые параметры объектов и даже пользовательские значения. Ключевая идея — интерполяция начального и конечного состояния с заданной функцией времени.
anime.js автоматически определяет тип свойства и способ его анимации, что позволяет работать с разнородными значениями в едином стиле.
Поддерживается большинство CSS-свойств, имеющих числовое или составное числовое значение:
width, heightmargin, paddingopacitybackgroundColorborderRadiusПример:
anime({
targets: '.box',
width: '300px',
opacity: 0.5
});
Особенности:
px,
%, em)anime.js предоставляет отдельный механизм для трансформаций:
translateX, translateY,
translateZscale, scaleX, scaleYrotate, rotateZskewX, skewYПример:
anime({
targets: '.box',
translateX: 250,
rotate: '1turn',
scale: 1.5
});
Преимущества:
transformАнимация атрибутов осуществляется через параметр
attr:
anime({
targets: 'circle',
attr: {
cx: 150,
r: 50
}
});
Поддерживаются:
cx, cy, r,
d, points)anime.js способен анимировать любые числовые свойства объектов:
const obj = { value: 0 };
anime({
targets: obj,
value: 100,
round: 1,
update: function() {
console.log(obj.value);
}
});
Применение:
Если начальное значение не указано, anime.js извлекает его из текущего состояния:
anime({
targets: '.box',
translateX: 200
});
anime({
targets: '.box',
translateX: [0, 200]
});
Формат:
[начальное, конечное]
Поддерживаются операторы:
+=-=*=Пример:
anime({
targets: '.box',
translateX: '+=100'
});
anime.js автоматически определяет и интерполирует единицы:
anime({
targets: '.box',
width: ['100px', '50%']
});
Если единицы не указаны, используется:
px)Поддерживаемые форматы:
#ff0000)rgb(255, 0, 0))Пример:
anime({
targets: '.box',
backgroundColor: ['#ff0000', '#00ff00']
});
Механизм:
Вместо статических значений можно использовать функции:
anime({
targets: '.box',
translateX: function(el, i) {
return i * 50;
}
});
Аргументы функции:
el — текущий элементi — индексl — общее количество элементовПозволяют задавать последовательность изменений:
anime({
targets: '.box',
translateX: [
{ value: 100, duration: 500 },
{ value: 200, duration: 500 },
{ value: 0, duration: 500 }
]
});
Каждый шаг может иметь:
valuedurationeasingdelayКаждое свойство может иметь собственные параметры:
anime({
targets: '.box',
translateX: {
value: 250,
duration: 1000
},
opacity: {
value: 0,
duration: 500
}
});
anime.js использует линейную интерполяцию с применением easing-функций.
Общий принцип:
value = start + (end - start) * progress
Где:
progress зависит от времени и easingПример:
anime({
targets: '.box',
translateX: 250,
easing: 'easeInOutQuad'
});
Типы easing:
linear)easeIn)easeOut)easeInOut)spring)Для числовых свойств:
anime({
targets: obj,
value: 100,
round: 1
});
Используется для:
anime.js умеет извлекать числа из строк:
anime({
targets: '.box',
boxShadow: '0px 0px 0px rgba(0,0,0,0) → 10px 10px 20px rgba(0,0,0,0.5)'
});
Механизм:
Каждое свойство может иметь задержку:
anime({
targets: '.box',
translateX: {
value: 200,
delay: 500
}
});
Можно анимировать:
anime({
targets: ['.box1', '.box2'],
translateY: 100
});
Наиболее эффективные свойства:
transformopacityМенее эффективные:
width, heighttop, leftПричина:
Пример комплексной анимации:
anime({
targets: '.box',
translateX: 250,
rotate: '1turn',
backgroundColor: '#00ff00',
opacity: 0.5,
duration: 2000
});
anime.js синхронизирует все изменения в одном таймлайне.
Свойства можно менять во время анимации через callbacks:
anime({
targets: obj,
value: 100,
update: function(anim) {
console.log(anim.progress);
}
});
Для корректной трансформации:
anime({
targets: '.box',
rotate: 180,
transformOrigin: '50% 50%'
});
Анимация пути:
anime({
targets: 'path',
d: [
{ value: 'M10 10 H 90 V 90 H 10 Z' },
{ value: 'M20 20 H 80 V 80 H 20 Z' }
]
});
Требования:
Можно управлять вручную:
const animation = anime({
targets: '.box',
translateX: 250,
autoplay: false
});
animation.seek(animation.duration * 0.5);