В GSAP (GreenSock Animation Platform) свойства анимации могут принимать не только статические значения, но и функции, что открывает возможности для динамического вычисления конечных значений на лету. Это особенно важно при работе с элементами, количество которых заранее неизвестно, или когда необходимо задать анимацию, зависящую от текущего состояния элемента.
Функция передаётся в качестве значения свойства. GSAP вызывает её для каждого анимируемого элемента, передавая следующие параметры:
gsap.to(".box", {
x: (i, target) => i * 100,
duration: 2
});
i — индекс элемента в выборке.target — сам DOM-элемент.В примере каждый элемент с классом .box будет смещён по
оси X на 0, 100, 200 пикселей и так далее, в зависимости от его
индекса.
Ключевой момент: функция вызывается для каждого элемента отдельно, что позволяет создавать индивидуальные анимации без дублирования кода.
Функция может возвращать значения, основанные на текущих стилях элемента:
gsap.to(".box", {
x: (i, target) => parseFloat(getComputedStyle(target).left) + 50,
duration: 1.5
});
Здесь новое смещение рассчитывается относительно текущей позиции элемента. Это особенно полезно при необходимости создавать анимации, зависимые от исходного состояния, которое может меняться динамически.
Функции можно использовать не только для числовых значений, но и для
сложных свойств CSS, таких как color,
rotation, scale и даже path для
SVG:
gsap.to(".circle", {
rotation: (i) => i * 45,
backgroundColor: (i) => `hsl(${i * 40}, 80%, 50%)`,
duration: 2
});
В этом примере каждый круг вращается на кратное 45° и получает уникальный цвет, вычисляемый по индексу.
Важно: использование функций для динамических значений повышает гибкость анимации и упрощает управление сложными эффектами.
GSAP позволяет генерировать случайные значения внутри функции для создания более органичных, естественных движений:
gsap.to(".star", {
x: () => Math.random() * 500,
y: () => Math.random() * 500,
rotation: () => Math.random() * 360,
duration: 3
});
Каждый элемент получает уникальные координаты и вращение, создавая эффект случайного распределения и движения.
Совет: при необходимости повторяемости лучше использовать генератор псевдослучайных чисел с фиксированным сидом.
thisВнутри функции можно использовать ключевое слово this,
которое ссылается на текущий анимируемый элемент:
gsap.to(".box", {
x: function() {
return this.offsetWidth * 2;
},
duration: 2
});
Такой подход удобен, когда нужно вычислить значение на основе размеров элемента или его атрибутов.
Функции особенно полезны при работе с массивами элементов или при необходимости создавать цепочки анимаций с уникальными параметрами для каждого объекта:
gsap.to(".card", {
x: (i) => i * 120,
y: (i) => Math.sin(i) * 50,
scale: (i) => 1 + i * 0.1,
duration: 1.5,
stagger: 0.1
});
Комбинация stagger с функциями позволяет создавать
волнообразные движения, эффекты последовательного появления или сложные
динамические трансформации.
x ожидает числовое значение
или строку с единицами ("50px"),
backgroundColor — строку цвета.GSAP.timeline().
Функции работают внутри временных линий точно так же, как и в одиночных
анимациях.Использование функций в качестве значений свойств является мощным инструментом для создания адаптивных, интерактивных и персонализированных анимаций. Они позволяют избавиться от дублирования кода, делают анимации зависимыми от текущего состояния элементов и открывают возможности для динамических эффектов, которые невозможно реализовать с помощью статических значений.