GSAP (GreenSock Animation Platform) предоставляет мощный механизм для
управления анимацией через easing-функции,
определяющие, как значения свойства изменяются во времени. Встроенные
easing-функции, такие как Power1, Power2,
Elastic или Bounce, покрывают большинство
стандартных случаев, однако для создания уникальных анимационных
эффектов часто требуется кастомное поведение, которое
реализуется через собственные easing-функции.
В GSAP каждая easing-функция должна быть функцией, принимающей
один аргумент t, который варьируется от 0
до 1, и возвращающей значение, также лежащее в диапазоне от 0 до 1,
отражающее прогресс анимации в данный момент времени.
const customEase = t => t * t; // Простейший пример: квадратичное ускорение
gsap.to(".box", { duration: 2, x: 300, ease: customEase });
Линейная основа Основной принцип любой easing-функции — преобразование линейного времени в нелинейное смещение:
function linearEase(t) {
return t; // Простое линейное движение
}Ускорение и замедление Для создания эффекта ускорения используют функции с экспоненциальным ростом или квадратичными/кубическими формулами:
function easeInQuad(t) {
return t * t;
}
function easeOutQuad(t) {
return t * (2 - t);
}
function easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}Сложные кривые с overshoot и bounce Для имитации «отскока» или выхода за пределы целевой позиции используют функции с тригонометрическими или полиномиальными компонентами:
function bounceOut(t) {
if (t < 1/2.75) {
return 7.5625*t*t;
} else if (t < 2/2.75) {
return 7.5625*(t-=1.5/2.75)*t + 0.75;
} else if (t < 2.5/2.75) {
return 7.5625*(t-=2.25/2.75)*t + 0.9375;
} else {
return 7.5625*(t-=2.625/2.75)*t + 0.984375;
}
}GSAP предоставляет встроенный инструмент CustomEase, который позволяет создавать кривые с точным управлением через графический редактор или код:
gsap.registerPlugin(CustomEase);
// Создание кривой через строку cubic-bezier
const myEase = CustomEase.create("custom", "M0,0 C0.25,0.1 0.25,1 1,1");
gsap.to(".circle", {
duration: 2,
x: 400,
ease: myEase
});
CustomEase.create принимает два аргумента:
Для динамических эффектов удобно генерировать easing-функции через математические формулы или массивы ключевых точек:
function generateEase(points) {
return t => {
let i = 0;
while (i < points.length - 1 && t > points[i + 1].x) i++;
const p0 = points[i];
const p1 = points[i + 1];
const ratio = (t - p0.x) / (p1.x - p0.x);
return p0.y + ratio * (p1.y - p0.y);
};
}
const points = [
{ x: 0, y: 0 },
{ x: 0.3, y: 0.6 },
{ x: 0.7, y: 0.4 },
{ x: 1, y: 1 }
];
const dynamicEase = generateEase(points);
gsap.to(".square", { duration: 2, x: 500, ease: dynamicEase });
Этот метод позволяет создавать абсолютно произвольные кривые движения, которые невозможно выразить через стандартные easing-функции.
GSAP поддерживает композицию easing через
Ease объекты, что позволяет комбинировать разные
эффекты:
const firstHalf = t => t * t; // easeInQuad
const secondHalf = t => t*(2-t); // easeOutQuad
const combinedEase = t => t < 0.5 ? firstHalf(t*2)/2 : 0.5 + secondHalf((t-0.5)*2)/2;
gsap.to(".triangle", { duration: 3, x: 400, ease: combinedEase });
Комбинирование easing-функций позволяет создавать плавные, нелинейные переходы, которые включают ускорение, замедление и отскок в одной анимации.
CustomEase с
графическим редактором, это облегчает визуальное моделирование
движения.Эти методы позволяют создавать анимации любой сложности, от плавного ускорения до сложных, нестандартных движений, полностью контролируемых через кастомные easing-функции.