GSAP (GreenSock Animation Platform) предоставляет мощный и гибкий инструментарий для создания анимаций в JavaScript, и правильная организация кода критически важна для поддержки масштабируемых проектов. Один из ключевых аспектов – возможность экспорта и повторного использования анимаций. Это позволяет создавать модульные, легко сопровождаемые компоненты, которые можно применять на разных страницах и проектах.
Наиболее удобный способ повторного использования анимации – обернуть её в функцию. Такой подход обеспечивает изоляцию анимационного кода и позволяет передавать параметры для настройки.
import gsap from "gsap";
export function fadeIn(element, duration = 1, delay = 0) {
return gsap.to(element, { opacity: 1, duration, delay });
}
Особенности подхода:
element – целевой DOM-элемент или селектор.duration и delay задаются по умолчанию, но
могут быть изменены при вызове.Tween), что
позволяет управлять её состоянием вне функции (пауза, повтор и т.
д.).Для более сложных анимационных компонентов удобно использовать классы, инкапсулируя анимацию вместе с логикой и состоянием.
export class CardAnimation {
constructor(cardElement) {
this.card = cardElement;
this.tween = null;
}
animateIn() {
this.tween = gsap.fromTo(
this.card,
{ y: 50, opacity: 0 },
{ y: 0, opacity: 1, duration: 0.5, ease: "power2.out" }
);
}
animateOut() {
if (this.tween) this.tween.reverse();
}
}
Преимущества:
play,
reverse, pause).GSAP предоставляет объект Timeline, который позволяет
объединять несколько анимаций в последовательность. Таймлайны можно
экспортировать для многократного применения.
export function createSlideInTimeline(element) {
const tl = gsap.timeline({ paused: true });
tl.from(element, { x: -200, opacity: 0, duration: 0.5 })
.to(element, { scale: 1.05, duration: 0.3 })
.to(element, { scale: 1, duration: 0.2 });
return tl;
}
Использование:
import { createSlideInTimeline } from './animations.js';
const myElement = document.querySelector('.my-card');
const tl = createSlideInTimeline(myElement);
tl.play();
Особенности:
paused: true позволяет контролировать начало
воспроизведения.Для максимальной универсальности экспортируемые функции или классы можно делать параметрическими, позволяя задавать скорость, направления, задержки и easing.
export function bounceIn(element, { duration = 1, ease = "bounce.out", scale = 0.5 } = {}) {
return gsap.fromTo(
element,
{ scale: scale, opacity: 0 },
{ scale: 1, opacity: 1, duration, ease }
);
}
Для масштабных проектов рекомендуется выносить анимации в отдельные модули:
/animations
fade.js
slide.js
bounce.js
Пример структуры:
// fade.js
import gsap from "gsap";
export const fadeIn = (el, duration = 0.5) => gsap.to(el, { opacity: 1, duration });
export const fadeOut = (el, duration = 0.5) => gsap.to(el, { opacity: 0, duration });
// slide.js
import gsap from "gsap";
export const slideIn = (el, x = 100) => gsap.from(el, { x, opacity: 0, duration: 0.5 });
export const slideOut = (el, x = 100) => gsap.to(el, { x, opacity: 0, duration: 0.5 });
Преимущества такой организации:
Повторно используемые анимации идеально подходят для React, Vue или Svelte, где можно вызывать экспортированные функции или классы внутри жизненного цикла компонента:
import { fadeIn } from './animations/fade.js';
import { useEffect, useRef } from 'react';
function Card() {
const ref = useRef(null);
useEffect(() => {
fadeIn(ref.current, 1);
}, []);
return <div ref={ref} className="card">Контент</div>;
}
Tween или Timeline для
управления анимацией вне функции.Модульность и экспортируемость анимаций делают GSAP не просто инструментом для визуальных эффектов, а полноценной частью архитектуры приложения, способной поддерживать масштабируемость, повторное использование и читаемость кода.