GSAP (GreenSock Animation Platform) предоставляет мощный инструмент для создания сложных анимаций в JavaScript, но с ростом проекта важно грамотно структурировать код, чтобы он оставался поддерживаемым, масштабируемым и читаемым. Организация кода анимаций включает использование таймлайнов, модульного подхода, управления состояниями и переиспользуемых функций.
Timeline — ключевой инструмент для управления
последовательностью анимаций. GSAP предоставляет два типа таймлайнов:
gsap.timeline() и TimelineMax (устаревший,
используется в старых версиях).
const mainTimeline = gsap.timeline({ defaults: { duration: 1, ease: "power1.out" } });
mainTimeline
.to(".box", { x: 200 })
.to(".circle", { scale: 1.5 }, "-=0.5") // запускается на 0.5 секунды раньше
.from(".text", { opacity: 0, y: 50 });
Ключевые моменты:
"+=0.5" или
"-=0.5") управляет моментом запуска анимаций относительно
предыдущих.Разделение анимаций на отдельные функции повышает читаемость и облегчает поддержку. Каждая функция отвечает за конкретный элемент или блок интерфейса.
function animateHeader() {
return gsap.timeline()
.from(".header-title", { y: -50, opacity: 0 })
.from(".header-subtitle", { y: -20, opacity: 0 }, "-=0.3");
}
function animateCards() {
return gsap.timeline()
.from(".card", { opacity: 0, stagger: 0.2, y: 30 });
}
const masterTimeline = gsap.timeline();
masterTimeline
.add(animateHeader())
.add(animateCards(), "-=0.5");
Преимущества такого подхода:
Для интерактивных анимаций важно учитывать состояние элементов. GSAP позволяет управлять стартом, паузой и реверсом таймлайнов через методы:
const menuTimeline = gsap.timeline({ paused: true });
menuTimeline.to(".menu", { x: 0, duration: 0.5 });
menuTimeline.from(".menu-item", { opacity: 0, stagger: 0.1 }, "-=0.3");
document.querySelector(".menu-button").addEventListener("click", () => {
menuTimeline.reversed() ? menuTimeline.play() : menuTimeline.reverse();
});
Основные приёмы:
paused: true позволяет создавать таймлайн без
немедленного запуска.reversed() проверяет текущее направление
воспроизведения.Создание универсальных функций для часто повторяющихся анимаций упрощает поддержку кода:
function fadeIn(selector, delay = 0) {
return gsap.from(selector, { opacity: 0, y: 20, duration: 0.6, delay });
}
function slideIn(selector, distance = 50, delay = 0) {
return gsap.from(selector, { x: distance, opacity: 0, duration: 0.8, delay });
}
fadeIn(".intro-text");
slideIn(".feature-box", 100, 0.2);
Преимущества паттернов:
Для крупных проектов имеет смысл хранить анимации в отдельных модулях:
/animations
header.js
cards.js
menu.js
main.js
Пример импорта:
import { animateHeader } from "./animations/header.js";
import { animateCards } from "./animations/cards.js";
const masterTimeline = gsap.timeline();
masterTimeline.add(animateHeader()).add(animateCards());
Плюсы такого подхода:
GSAP хорошо сочетается с React, Vue, Angular и даже Vanilla JS. При работе с компонентными библиотеками:
useEffect
в React).refs или querySelector для
точного выбора элементов.Организация кода анимаций в GSAP требует продуманного использования таймлайнов, модульного подхода, управления состояниями и создания переиспользуемых функций. Четкая структура позволяет поддерживать масштабируемые проекты, уменьшает количество багов и упрощает работу с динамическими интерфейсами.