31.GSAP 플러그인
GSAP의 핵심 기능과 주요 플러그인을 배우고, 실전 예제를 직접 작성해본다.
코드 블록의 Try it Yourself 버튼으로 직접 실행할 수 있다.
구문
텍스트 애니메이션
결과가 눈에 즉시 보이는 단계다.
SplitText — 글자 분해 등장
GSAP SplitText.create()를 사용해서 h1 제목 텍스트를 글자 단위로 분해하고, 각 글자가 아래에서 위로 순차적으로 페이드인하는 애니메이션을 만들어줘. stagger 0.03초, ease는 power3.out으로 설정하고, 애니메이션 완료 후 revert()로 DOM을 복구해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 SplitText.create()로 h1 제목 텍스트를 글자 단위로 분해하고, 각 글자가 아래에서 위로 순차적으로 페이드인하는 컴포넌트를 만들어줘. stagger 0.03초, ease는 power3.out으로 설정하고, gsap.context()로 클린업을 처리해줘.
텍스트를 chars / words / lines 단위 span으로 분해해 개별 요소에 애니메이션을 건다.
revert()로 원본 DOM을 복구하는 습관이 필수다.
핵심 API
| API | 설명 |
|---|---|
SplitText.create(target, vars) | 인스턴스 생성 (3.13+ 권장). type:'chars,words,lines' 조합 가능 |
.chars / .words / .lines | 분해된 요소 배열 반환 |
.revert() | DOM을 원래 텍스트 상태로 복구 |
autoSplit: true | 리사이즈·폰트 로드 시 자동 재분할 (3.13+) |
mask: 'lines' | 줄 단위 클리핑 래퍼 생성 — 마스크 효과용 (3.13+) |
// 1. SplitText.create()로 인스턴스 생성 (3.13+ 권장)
const split = SplitText.create(".title", {
type: "chars,words"
});
// 2. 분해된 글자에 stagger 적용
gsap.from(split.chars, {
opacity: 0,
y: 40,
duration: 0.6,
stagger: 0.03,
ease: "power3.out",
onComplete: () => split.revert() // 3. 완료 후 DOM 복구
});
ScrambleText — 타이핑 해독 효과
GSAP ScrambleTextPlugin을 사용해서 ".code-display" 요소에 해킹 터미널 느낌의 텍스트 해독 애니메이션을 만들어줘. 0과 1로 이루어진 이진수 문자가 섞이다가 2초 후 "ACCESS GRANTED"로 확정되는 효과야. speed 0.4, revealDelay 0.5로 설정해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 ScrambleTextPlugin으로 해킹 터미널 느낌의 텍스트 해독 컴포넌트를 만들어줘. 0과 1로 이루어진 이진수 문자가 섞이다가 2초 후 "ACCESS GRANTED"로 확정되는 효과야. useRef로 대상 요소를 참조해줘.
트위닝 도중 문자가 랜덤 글자로 섞이다가 목표 텍스트로 수렴한다.
chars 옵션으로 사용할 문자 셋을 지정한다.
핵심 API
| API | 설명 |
|---|---|
scrambleText: {text} | 목표 텍스트 지정 (필수) |
chars: 'upperCase' | 랜덤 문자셋. 'lowerCase' / '0123456789' / 커스텀 문자열 |
speed: 0.3 | 스크램블 속도 (0~1) |
revealDelay: 0.5 | 각 글자 확정 전 지연 시간 |
gsap.to(".code-display", {
duration: 2,
scrambleText: {
text: "ACCESS GRANTED",
chars: "01", // 0과 1로만 섞임
speed: 0.4,
revealDelay: 0.5
}
});
Text — innerHTML 순차 타이핑
GSAP TextPlugin을 사용해서 ".terminal" 요소에 "Hello, world! 타이핑 완료." 텍스트가 한 글자씩 타이핑되는 애니메이션을 만들어줘. 3초 동안 글자 단위로 타이핑하고, 새로 추가되는 글자에는 "new-char" 클래스를 붙여줘. ease는 none으로.
React + @gsap/react의 useGSAP 훅을 사용해서 TextPlugin으로 터미널 타이핑 효과 컴포넌트를 만들어줘. "Hello, world! 타이핑 완료." 텍스트가 한 글자씩 3초 동안 타이핑되고, useRef로 대상 요소를 참조해줘.
innerHTML을 타이핑하듯 순서대로 채운다.
delimiter로 글자 단위 vs 단어 단위를 선택한다.
핵심 API
| API | 설명 |
|---|---|
text: {value} | 표시할 텍스트 (필수) |
delimiter: '' | '' = 글자 단위, ' ' = 단어 단위 |
speed: 1 | 타이핑 속도 배율 |
newClass: 'typed' | 새로 추가된 글자에 붙일 CSS 클래스 |
gsap.to(".terminal", {
duration: 3,
text: {
value: "Hello, world! 타이핑 완료.",
delimiter: "", // 글자 단위 타이핑
newClass: "new-char"
},
ease: "none"
});
SVG 드로잉 & 모핑
path 개념을 순서대로 쌓아가는 단계다. DrawSVG → MorphSVG → MotionPath 순서로 진행하면 자연스럽게 연결된다.
DrawSVG — 선 그리기 애니메이션
GSAP DrawSVGPlugin을 사용해서 SVG path 요소가 처음에는 보이지 않다가 2초 동안 0%에서 100%까지 선이 그려지는 애니메이션을 만들어줘. ease는 power2.inOut으로 설정해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 DrawSVGPlugin으로 SVG path가 0%에서 100%까지 2초 동안 선이 그려지는 컴포넌트를 만들어줘. useRef로 SVG path를 참조하고, gsap.context()로 클린업해줘.
stroke-dashoffset 원리를 추상화해 path · circle · line을 비율(%) 또는 픽셀로 그린다.
핵심 API
| API | 설명 |
|---|---|
drawSVG: '0%' | 시작값 (숨김). '0% 0%' 형태도 가능 |
drawSVG: '100%' | 전체 표시 |
drawSVG: '20% 80%' | 구간 지정 — 20%~80% 부분만 표시 |
DrawSVG.getLength(el) | path 총 길이 반환 유틸 |
// 숨김 상태에서 시작
gsap.set(".path", { drawSVG: "0%" });
// 전체 그리기
gsap.to(".path", {
drawSVG: "100%",
duration: 2,
ease: "power2.inOut"
});
// 구간 이동 애니메이션 (20%~80% → 80%~100%)
gsap.to(".path", {
drawSVG: "80% 100%",
duration: 1.5
});
MorphSVG — 도형 변형 트랜지션
GSAP MorphSVGPlugin을 사용해서 원(circle) → 별(star) → 하트(heart) 순서로 SVG 도형이 무한 순환하며 변형되는 애니메이션을 만들어줘. rotational 보간 방식을 사용하고, 각 변형은 1초, ease는 power2.inOut으로 설정해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 MorphSVGPlugin으로 원 → 별 → 하트 순서로 SVG 도형이 무한 순환 변형되는 컴포넌트를 만들어줘. rotational 보간, 각 변형 1초, useRef로 shape 요소를 참조해줘.
SVG path 간 형태를 보간한다. 포인트 수가 달라도 자동 보정한다.
핵심 API
| API | 설명 |
|---|---|
morphSVG: '#target-path' | 목표 path의 id 또는 d 값 직접 입력 |
type: 'rotational' | 회전 보간 방식 — 더 자연스러운 변형 |
shapeIndex: 0 | 보간 시작점 인덱스. 'auto' 추천 |
MorphSVG.convertToPath(el) | circle · rect 등을 path로 자동 변환 |
// circle → star → heart 순환
const shapes = ["#circle", "#star", "#heart"];
let idx = 0;
function morph() {
idx = (idx + 1) % shapes.length;
gsap.to("#shape", {
morphSVG: {
shape: shapes[idx],
type: "rotational" // 자연스러운 회전 보간
},
duration: 1,
ease: "power2.inOut",
onComplete: morph
});
}
morph();
MotionPath — SVG 경로 따라 이동
GSAP MotionPathPlugin을 사용해서 ".rocket" 요소가 "#orbit-path" SVG 경로를 따라 무한 반복으로 이동하는 애니메이션을 만들어줘. autoRotate를 켜서 진행 방향으로 자동 회전하고, 요소 중심 기준으로 정렬해줘. 4초 동안 등속(ease: none)으로 움직여야 해.
React + @gsap/react의 useGSAP 훅을 사용해서 MotionPathPlugin으로 로켓 이모지가 SVG 타원 궤도를 따라 무한 반복 이동하는 컴포넌트를 만들어줘. autoRotate, alignOrigin: [0.5, 0.5], 4초 등속으로 설정하고, useRef로 요소를 참조해줘.
요소를 SVG path 위에서 이동시킨다. autoRotate로 진행 방향에 맞게 자동 회전한다.
핵심 API
| API | 설명 |
|---|---|
motionPath: {path} | 경로 selector 또는 d 값 |
autoRotate: true | 이동 방향으로 자동 회전 |
align: '#path' | path 좌표계에 맞게 위치 자동 정렬 |
start / end | 경로의 시작·끝 비율 (0~1) |
gsap.to(".rocket", {
motionPath: {
path: "#orbit-path",
align: "#orbit-path",
autoRotate: true,
alignOrigin: [0.5, 0.5], // 요소 중심 기준 정렬
start: 0,
end: 1
},
duration: 4,
repeat: -1,
ease: "none"
});
MotionPathHelper — 경로 시각 편집
GSAP MotionPathHelper를 사용해서 ".rocket" 요소에 "#orbit-path" 경로를 연결한 시각 편집 도구를 브라우저에 띄워줘. 생성 즉시 편집 모드(selected: true)로 열리게 해줘. 이건 개발 전용이니까 배포 전에 반드시 제거해야 해.
React + @gsap/react의 useGSAP 훅을 사용해서 MotionPathHelper로 경로 시각 편집 도구를 브라우저에 띄우는 개발 전용 컴포넌트를 만들어줘. selected: true로 즉시 편집 모드를 열고, 프로덕션 빌드에서는 조건부로 제외해줘.
브라우저에서 path를 드래그로 편집하고 좌표를 복사하는 개발 전용 도구다.
배포 전 반드시 제거한다.
핵심 API
| API | 설명 |
|---|---|
MotionPathHelper.create(el) | 대상 요소에 편집 핸들 생성 |
selected: true | 생성 즉시 편집 모드 활성화 |
path: '#existing-path' | 기존 path를 기반으로 편집 시작 |
[Copy SVG] 버튼 | 편집 완료 후 d 값을 클립보드에 복사 |
// 개발 시에만 사용 — 배포 전 제거
import { MotionPathHelper } from "gsap/MotionPathHelper";
gsap.registerPlugin(MotionPathHelper);
MotionPathHelper.create(".rocket", {
path: "#orbit-path",
selected: true
});
// 편집 후 [Copy SVG] 클릭 → d 값 복사해 코드에 붙여넣기
MotionPathHelper는 개발 환경에서만 사용한다. 프로덕션 번들에 포함되면 불필요한 용량이 늘어난다.
스크롤 & 드래그 인터랙션
실제 서비스에서 가장 자주 쓰이는 패턴이다. ScrollTo → Observer → Draggable → Inertia 순서로 진행한다.
ScrollTo — 부드러운 앵커 이동
GSAP ScrollToPlugin을 사용해서 페이지 내 모든 앵커 링크(a[href^='#'])를 클릭하면 해당 섹션으로 부드럽게 스크롤되는 기능을 만들어줘. 고정 헤더 80px 오프셋을 보정하고, 사용자가 직접 스크롤하면 트윈을 즉시 중단(autoKill)해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 ScrollToPlugin으로 내비게이션 앵커 링크 클릭 시 해당 섹션으로 부드럽게 스크롤되는 컴포넌트를 만들어줘. offsetY 60px 헤더 보정, autoKill 적용하고, useRef로 섹션들을 참조해줘.
window 또는 스크롤 컨테이너를 특정 y 위치나 요소로 부드럽게 이동시킨다.
핵심 API
| API | 설명 |
|---|---|
scrollTo: '#section' | 요소 selector로 이동 |
scrollTo: {y: 400} | px 값으로 이동 |
offsetY: 80 | 헤더 높이만큼 오프셋 보정 |
autoKill: true | 사용자 스크롤 시 트윈 즉시 중단 |
// 앵커 버튼 전체에 부드러운 스크롤 적용
document.querySelectorAll("a[href^='#']").forEach(a => {
a.addEventListener("click", e => {
e.preventDefault();
gsap.to(window, {
duration: 1,
scrollTo: {
y: a.getAttribute("href"),
offsetY: 80 // 고정 헤더 높이만큼 보정
},
ease: "power2.inOut",
autoKill: true // 사용자 스크롤 시 중단
});
});
});
Observer — 스크롤 방향 감지 UI
GSAP Observer를 사용해서 풀페이지 섹션 전환 UI를 만들어줘. 휠과 터치 이벤트를 감지하고, 아래로 스크롤하면 다음 섹션이 올라오고 위로 스크롤하면 이전 섹션이 내려가는 방식이야. tolerance 10px로 설정하고, 전환 시간은 0.9초, ease는 power2.inOut으로 해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 Observer로 풀페이지 섹션 전환 컴포넌트를 만들어줘. 휠과 터치로 섹션을 위아래로 전환하고, tolerance 10px, 전환 0.9초, useState로 현재 섹션 인덱스를 관리해줘.
스크롤 · 휠 · 터치 · 포인터 방향을 통합 감지한다. 풀페이지 전환, 수평 스크롤 섹션에 활용한다.
핵심 API
| API | 설명 |
|---|---|
type: 'wheel,touch,pointer' | 감지할 이벤트 종류 |
onDown / onUp | 스크롤 방향별 콜백 |
tolerance: 10 | px 단위 최소 이동 임계값 |
.kill() | 옵저버 해제 |
let current = 0;
const sections = gsap.utils.toArray(".section");
Observer.create({
type: "wheel,touch",
tolerance: 10,
onDown: () => {
if (current < sections.length - 1) {
gsap.to(sections[++current], {
yPercent: 0,
duration: 0.9,
ease: "power2.inOut"
});
}
},
onUp: () => {
if (current > 0) {
gsap.to(sections[current--], {
yPercent: 100,
duration: 0.9,
ease: "power2.inOut"
});
}
}
});
Draggable — 드래그 앤 드롭 카드
GSAP Draggable을 사용해서 ".card" 요소를 ".board" 영역 안에서만 드래그할 수 있는 칸반 보드를 만들어줘. 120px 단위 격자에 흡착(snap)되고, edgeResistance 0.65로 설정해줘. 드래그가 끝나면 콘솔에 x, y 좌표를 출력해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 Draggable로 카드를 드래그할 수 있는 칸반 보드 컴포넌트를 만들어줘. bounds는 부모 컨테이너, 120px 격자 snap, edgeResistance 0.65로 설정하고, useRef로 카드를 참조해줘.
요소를 드래그 가능하게 만든다.
bounds로 영역 제한, snap으로 격자 흡착을 구현한다.
핵심 API
| API | 설명 |
|---|---|
type: 'x,y' | 드래그 축. 'x' / 'y' / 'rotation' 가능 |
bounds: '.container' | 드래그 가능 영역 제한 |
snap: {x: 100} | 100px 단위 격자 흡착 |
onDragEnd | 드래그 종료 콜백 |
Draggable.create(".card", {
type: "x,y",
bounds: ".board",
edgeResistance: 0.65,
snap: {
x: v => Math.round(v / 120) * 120, // 120px 격자 흡착
y: v => Math.round(v / 120) * 120
},
onDragEnd() {
console.log("x:", this.x, "y:", this.y);
}
});
Inertia — 드래그 관성 슬라이더
GSAP Draggable + InertiaPlugin을 조합해서 ".carousel-item" 요소를 x축으로만 드래그할 수 있는 캐러셀을 만들어줘. 손을 떼면 관성으로 미끄러지다가 300px 단위로 흡착되게 해줘. 이동 범위는 minX: -800, maxX: 0으로 제한해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 Draggable + InertiaPlugin으로 x축 드래그 캐러셀 컴포넌트를 만들어줘. 관성으로 미끄러지다가 300px 단위 snap, bounds는 minX: -800, maxX: 0으로 제한하고, useRef로 트랙을 참조해줘.
Draggable과 조합해 손을 뗐을 때 관성으로 감속하는 효과를 준다.
단독으로 gsap.to에서도 사용 가능하다.
핵심 API
| API | 설명 |
|---|---|
inertia: true | Draggable에서 관성 활성화 (InertiaPlugin 필요) |
resistance: 200 | 감속 강도. 클수록 빨리 멈춤 |
max / min | 관성 종료 후 클램핑 범위 |
gsap.to(el, {inertia}) | 직접 트윈에서 관성 사용 |
// Draggable + Inertia 조합 캐러셀
Draggable.create(".carousel-item", {
type: "x",
inertia: true,
bounds: { minX: -800, maxX: 0 },
snap: x => Math.round(x / 300) * 300 // 300px 단위 슬라이드 흡착
});
// 단독 사용 예시
gsap.to(".ball", {
inertia: {
x: { velocity: 1200, resistance: 300, min: 0, max: 600 }
}
});
물리 · 레이아웃 · 고급
JS/DOM 이해도가 충분히 쌓인 뒤 도전하는 단계다. 코드 양이 적은데 결과가 극적이다.
Physics2D — 중력 파티클 효과
GSAP Physics2DPlugin을 사용해서 화면을 클릭하면 클릭 지점에서 30개의 파티클이 터지는 컨페티 이펙트를 만들어줘. 각 파티클은 랜덤 속도(400900)와 랜덤 각도(-130-50)로 발사되고, gravity 1200으로 떨어지며 페이드아웃 후 DOM에서 제거해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 Physics2DPlugin으로 클릭 지점에서 30개 파티클이 터지는 컨페티 컴포넌트를 만들어줘. 랜덤 속도(400900), 랜덤 각도(-130-50), gravity 1200으로 설정하고, onClick 핸들러로 구현해줘.
gravity · velocity · angle · friction으로 2D 물리 운동을 정의한다.
컨페티 이펙트 구현에 활용한다.
핵심 API
| API | 설명 |
|---|---|
velocity: 800 | 초기 속도 (px/s) |
angle: -70 | 발사 각도 (도 단위, 위쪽이 음수) |
gravity: 1000 | 중력 가속도 (px/s²) |
friction: 0.1 | 마찰 계수 (0=없음, 1=즉시 정지) |
function burst(x, y) {
for (let i = 0; i < 30; i++) {
const dot = document.createElement("div");
dot.className = "dot";
document.body.appendChild(dot);
gsap.set(dot, { x, y });
gsap.to(dot, {
duration: 1.5,
physics2D: {
velocity: gsap.utils.random(400, 900),
angle: gsap.utils.random(-130, -50),
gravity: 1200,
friction: 0.05
},
opacity: 0,
onComplete: () => dot.remove()
});
}
}
document.addEventListener("click", e => burst(e.clientX, e.clientY));
PhysicsProps — 속도 기반 속성 애니메이션
GSAP PhysicsPropsPlugin을 사용해서 카드를 pointerup 했을 때 x축으로 속도 600, 회전 속도 180으로 날아가면서 페이드아웃되는 스와이프 효과를 만들어줘. friction은 x: 0.15, rotation: 0.1로 설정해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 PhysicsPropsPlugin으로 카드 클릭 시 x축 속도 600, 회전 속도 180으로 날아가며 페이드아웃되는 스와이프 컴포넌트를 만들어줘. useRef로 카드를 참조하고, 리셋 버튼도 추가해줘.
velocity · friction으로 CSS 속성을 물리 법칙처럼 감속시킨다.
튕기는 카드, 스핀 효과에 활용한다.
핵심 API
| API | 설명 |
|---|---|
physicsProps: {x: {velocity}} | 속성별 물리값 지정 |
velocity | 초기 속도 |
friction | 마찰 계수 (0~1) |
acceleration | 가속도 (음수=감속) |
// 스와이프 후 카드가 날아가는 효과
card.addEventListener("pointerup", () => {
gsap.to(card, {
duration: 1.5,
physicsProps: {
x: { velocity: 600, friction: 0.15 },
rotation: { velocity: 180, friction: 0.1 }
},
opacity: 0
});
});
Flip — 레이아웃 전환 애니메이션
GSAP Flip 플러그인을 사용해서 ".item" 요소들이 그리드 뷰 ↔ 리스트 뷰로 전환될 때 자연스럽게 위치가 이동하는 레이아웃 애니메이션을 만들어줘. Flip.getState()로 변경 전 상태를 저장하고, 클래스 토글 후 Flip.from()으로 0.6초 동안 전환해줘. absolute: true, stagger 0.04로 설정해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 Flip으로 그리드 ↔ 리스트 레이아웃 전환 컴포넌트를 만들어줘. useState로 뷰 모드를 관리하고, Flip.getState() → 클래스 변경 → Flip.from()으로 0.6초 전환, absolute: true, stagger 0.04로 설정해줘.
DOM 변경 전후의 위치 · 크기 차이를 계산해 자연스러운 레이아웃 전환을 만든다. FLIP(First, Last, Invert, Play) 패턴을 자동화한 플러그인이다.
핵심 API
| API | 설명 |
|---|---|
Flip.getState(targets) | 변경 전 상태 스냅샷 저장 |
Flip.from(state, vars) | 스냅샷 기준으로 애니메이션 역재생 |
absolute: true | 애니메이션 중 position:absolute로 전환 |
onEnter / onLeave | 추가 · 제거되는 요소 콜백 |
const items = document.querySelectorAll(".item");
// 1. 변경 전 상태 저장
const state = Flip.getState(items);
// 2. DOM / 클래스 변경 (그리드 ↔ 리스트 전환)
container.classList.toggle("grid-view");
// 3. 변경 전 위치에서 현재 위치로 애니메이션
Flip.from(state, {
duration: 0.6,
ease: "power2.inOut",
stagger: 0.04,
absolute: true
});
CSSRule — 전역 스타일 트위닝 (deprecated)
CSSRulePlugin은 공식적으로 지원 중단(deprecated) 상태다. CSS 변수 애니메이션으로 대체하는 것을 권장한다. 아래 대체 예시를 참고한다.
GSAP로 CSS 변수를 직접 트위닝해서 테마 전환 애니메이션을 만들어줘. html 요소의 --accent 변수를 "#534AB7"로 0.8초 동안 변경해줘. CSSRulePlugin은 deprecated이니까 사용하지 말고 CSS 변수 직접 트위닝 방식으로 만들어줘.
React + @gsap/react의 useGSAP 훅을 사용해서 CSS 변수를 직접 트위닝하는 테마 전환 컴포넌트를 만들어줘. 버튼 클릭 시 html 요소의 --accent 변수를 선택한 색상으로 0.8초 동안 변경해줘. CSSRulePlugin은 deprecated이니까 사용하지 마.
개별 요소가 아닌 CSS 규칙 자체를 트위닝한다.
:hover 스타일이나 CSS 변수 값을 코드로 애니메이션할 때 사용했다.
핵심 API
| API | 설명 |
|---|---|
CSSRulePlugin.getRule('.cls') | 대상 CSS 규칙 객체 반환 |
cssRule: {color} | 트위닝할 속성 지정 |
var(--color) | CSS 변수도 트위닝 가능 |
| 전역 효과 | 한 규칙 수정 → 해당 클래스 전체에 즉시 반영 |
// ❌ deprecated — CSSRulePlugin 방식
const rule = CSSRulePlugin.getRule(".btn:hover");
gsap.to(rule, {
duration: 1,
cssRule: { backgroundColor: "#7F77DD" }
});
// ✅ 권장 — CSS 변수 직접 트위닝
gsap.to("html", {
"--accent": "#534AB7",
duration: 0.8
});
Pixi + Easel — 캔버스 렌더러 연동
GSAP PixiPlugin을 사용해서 Pixi.js Sprite에 alpha, tint, blur, x 속성을 한 번에 트위닝하는 애니메이션을 만들어줘. PixiPlugin.registerPIXI(PIXI)로 등록 후, alpha 0.3, tint 0x534AB7, blur 8, x 400으로 1.5초 동안 변경해줘.
React + @gsap/react의 useGSAP 훅을 사용해서 PixiPlugin으로 Pixi.js Sprite의 alpha, tint, blur, x를 트위닝하는 컴포넌트를 만들어줘. useEffect에서 PIXI.Application을 생성하고, PixiPlugin.registerPIXI(PIXI) 등록 후 useGSAP으로 애니메이션해줘.
PixiPlugin은 Pixi.js DisplayObject 속성을, EaselPlugin은 EaselJS 속성을 GSAP 트윈으로 제어한다.
핵심 API
| API | 설명 |
|---|---|
PixiPlugin.registerPIXI(PIXI) | PIXI 객체를 플러그인에 등록 (필수) |
pixi: {alpha, tint} | Pixi 전용 속성 트위닝 |
pixi: {blur, brightness} | 필터 효과도 직접 트위닝 |
easel: {alpha, brightness} | EaselJS DisplayObject 속성 |
import * as PIXI from "pixi.js";
PixiPlugin.registerPIXI(PIXI); // 반드시 먼저 등록
const sprite = new PIXI.Sprite(texture);
app.stage.addChild(sprite);
gsap.to(sprite, {
duration: 1.5,
pixi: {
alpha: 0.3,
tint: 0x534AB7,
blur: 8,
x: 400
},
ease: "power2.out"
});
GSDevTools — 타임라인 디버거
GSAP GSDevTools를 사용해서 "intro" 타임라인에 디버그 컨트롤러를 연결해줘. 키보드 단축키(스페이스바, 화살표)를 활성화하고, 미니멀 모드는 끈 상태로 설정해줘. 이건 개발 전용이니까 배포 전에 반드시 제거해야 해.
React + @gsap/react의 useGSAP 훅을 사용해서 GSDevTools로 타임라인 디버그 컨트롤러를 연결하는 개발 전용 컴포넌트를 만들어줘. process.env.NODE_ENV === 'development' 조건으로 GSDevTools.create()를 호출하고, keyboard: true로 설정해줘.
타임라인에 재생 · 일시정지 · 속도 조절 UI를 붙인다. 복잡한 애니메이션 디버깅 시 필수 도구다.
핵심 API
| API | 설명 |
|---|---|
GSDevTools.create() | 전역 컨트롤러 생성 |
animation: tl | 특정 타임라인에 연결 |
minimal: true | 미니멀 UI 모드 |
keyboard: true | 스페이스바 · 화살표 단축키 활성화 |
const tl = gsap.timeline({ id: "intro" });
tl.from(".hero", { opacity: 0, y: 60, duration: 1 })
.from(".subtitle", { opacity: 0, duration: 0.8 }, "-=0.3")
.from(".cta", { opacity: 0, scale: 0.8 }, "-=0.2");
// 개발 시에만 추가 — 배포 전 제거
GSDevTools.create({
animation: "intro", // timeline id로 연결
keyboard: true,
minimal: false
});
GSDevTools와 MotionPathHelper는 개발 전용이다. 프로덕션 빌드에서는 반드시 제거한다.
GSAP 3.13 이전에는 일부 플러그인이 Club GreenSock 유료 회원 전용이었다. 3.13 이상으로 업그레이드하면 모든 플러그인을 공개 npm에서 바로 설치할 수 있다.
npm install gsap@latest
기존에 비공개 레포지토리 토큰을 사용했다면, 공개 npm으로 전환한다.