Библиотека anime.js предоставляет мощные средства для анимации DOM-элементов, SVG и JavaScript-объектов. Одним из ключевых приёмов является искажение, которое позволяет создавать динамические деформации объектов, варьируя их размеры, форму или положение в пространстве с течением времени. В анимациях искажение часто используется для создания эффектов «пульсации», «растяжения» или «волнообразного движения».
Для реализации искажения чаще всего применяются следующие параметры:
Пример базового искажения элемента:
anime({
targets: '.box',
scaleX: [1, 1.5, 1],
scaleY: [1, 0.5, 1],
skewX: [0, 25, 0],
duration: 2000,
easing: 'easeInOutSine',
loop: true
});
В этом примере объект .box сначала растягивается по горизонтали и сжимается по вертикали, затем возвращается в исходное состояние с эффектом наклона.
Keyframes позволяют задавать сложные последовательные трансформации:
anime({
targets: '.circle',
keyframes: [
{ scale: 1.2, rotate: 15 },
{ scale: 0.8, rotate: -15 },
{ scale: 1, rotate: 0 }
],
duration: 1800,
easing: 'easeInOutQuad',
loop: true
});
Для SVG-объектов искажение часто достигается через изменение атрибутов points, d, path и использование anime.path() для анимации вдоль кривой.
Пример анимации кривой:
const path = anime.path('path#motionPath');
anime({
targets: 'circle',
translateX: path('x'),
translateY: path('y'),
rotate: path('angle'),
duration: 4000,
loop: true,
easing: 'linear'
});
Здесь элемент circle движется по заданной кривой, одновременно вращаясь по касательной, создавая плавное искажение траектории.
Функции easing определяют скорость и ритм искажения:
easeInSine, easeOutSine – плавное
ускорение и замедление.easeInOutElastic – эффект «резинки» при растяжении и
сжатии.easeInOutBounce – имитация отскока при деформации.Пример с эластичным искажением:
anime({
targets: '.elastic-box',
scale: [1, 1.5],
duration: 1200,
easing: 'easeInOutElastic(1, .5)',
loop: true
});
Для более выразительных анимаций можно комбинировать scale, skew, translate и rotate:
anime({
targets: '.complex-box',
scaleX: [1, 1.3, 1],
scaleY: [1, 0.7, 1],
skewX: [0, 20, -10, 0],
translateY: [0, -30, 10, 0],
rotate: [0, 15, -10, 0],
duration: 2500,
easing: 'easeInOutQuart',
loop: true
});
Такое сочетание создает эффект живого, динамически изменяющегося объекта, который выглядит органично и интересно.
Timeline позволяет управлять сложными анимациями с множеством искажений:
const tl = anime.timeline({
easing: 'easeInOutSine',
duration: 1000,
loop: true
});
tl.add({
targets: '.box',
scaleX: 1.5
}).add({
targets: '.box',
skewY: 20
}, '-=500').add({
targets: '.box',
rotate: 45
}, '-=300');
'-=500' и '-=300' – перекрытие анимаций
для плавного перехода.Эти подходы позволяют создавать живые, динамичные анимации с искажениями, подходящие как для интерфейсов, так и для визуальных эффектов в веб-приложениях.