GSAP 3.15 · INK GREEN
한 섹션에 한 가지만 담았어요. 화면에서 움직이는 데모와 그 아래 코드는 같은 함수예요 — 코드 칸은 실행 중인 함수를 그대로 찍어 보여 주기 때문에 설명과 동작이 어긋날 수 없어요.
00 · 공통 뼈대
예제마다 따로 챙기면 반드시 하나쯤 빠져요. 그래서 화면 밖이면 멈추기 · 모션 줄이기 설정 존중 · 이벤트 정리는
아래 mount()가 한곳에서 맡고, 각 예제는 애니메이션만 만들어 넘겨요.
x y scale rotation autoAlpha — width·top·margin은 매 프레임 레이아웃을 다시 계산해요.play(), 벗어나면 pause() 해요. 무한 반복 20개가 동시에 돌지 않아요.gsap.matchMedia()로 나눠, 모션 줄이기를 켠 사람에게는 완성된 모습만 보여 줘요.lagSmoothing(500, 33) — 0.5초 넘게 멈춘 프레임은 33ms만 흐른 것으로 쳐요..stage)는 contain: layout paint로 가뒀어요.?lite=1로 강제로 켤 수 있어요.01 · CORE
모든 GSAP 애니메이션의 출발점이에요. to()는 현재 → 목표, from()은 목표 → 현재(등장 연출),
fromTo()는 시작과 끝을 둘 다 못박아요.
xPercent: 100 — 화면 크기가 바뀌어도 다시 잴 필요가 없어요02 · EASE
거리와 시간이 같아도 이징이 느낌을 만들어요. 기본은 power2.out, 통통 튀는 느낌은 back·elastic,
기계적인 진행은 none이에요.
03 · STAGGER
stagger 하나로 수십 개 요소에 시간차를 줘요. grid: 'auto'가 행과 열을 알아서 읽고,
from으로 파동이 시작되는 곳을 정해요.
04 · TIMELINE
순서가 있는 연출은 delay를 쌓지 말고 타임라인으로 짜요. 위치 인자('<' '-=0.2')와 라벨로 흐름을 만들고,
play · pause · reverse · progress로 조종해요.
progress()만 호출해요 — 새 트윈을 만들지 않아요05 · KEYFRAMES
여러 단계를 keyframes 배열 하나에 담았어요. 올라갈 땐 느려지고, 내려올 땐 빨라지고,
바닥에 닿는 순간 납작해졌다가(squash) 탄성으로 돌아와요.
06 · REPEAT · YOYO
repeat: -1과 yoyo로 끝없이 도는 로더를 만들어요.
repeat를 stagger 객체 안에 넣으면 점마다 따로 반복해요.
07 · SPLITTEXT
SplitText가 문장을 줄과 단어로 쪼개고, mask: 'lines'가 줄마다 가림막을 씌워요.
단어는 가림막 아래에서 올라와요.
autoSplit은 폰트 로딩이나 폭 변화로 줄바꿈이 달라질 때만 다시 쪼개요작은 기기에서도
문장은 부드럽게
떠오른다
08 · SCRAMBLETEXT · TEXTPLUGIN
ScrambleText는 무작위 글자를 거쳐 문장을 드러내고, TextPlugin은 한 글자씩 타이핑해요. 섞는 글자로 한글도 쓸 수 있어요.
contain으로 가둬서, 글자가 바뀌어도 그 줄 밖으로 레이아웃이 번지지 않아요steps(1) — 중간 투명도 프레임을 그리지 않아요09 · COUNTER
DOM이 아니라 평범한 객체의 숫자를 트윈하고, onUpdate에서 글자로 옮겨요. 천 단위 쉼표도, 소수점도 자유롭게 표시할 수 있어요.
tabular-nums로 숫자 폭을 고정해서, 값이 바뀌어도 주변이 흔들리지 않아요10 · DRAWSVG
DrawSVG는 stroke가 보이는 구간을 트윈해요. 눈금이 깔리고, 추세선이 그어지고, 데이터 점이 올라온 뒤 체크 표시로 마무리돼요.
11 · MORPHSVG
점 개수가 달라도 MorphSVG가 알아서 맞춰 줘요. 원 → 둥근 사각형 → 별 → 하트 → 원으로 이어져요.
precompile로 계산을 미리 해 둬요12 · MOTIONPATH
곡선 경로를 따라 종이비행기가 날고, autoRotate가 기수를 진행 방향으로 돌려요. 지나간 자리에는 DrawSVG로 궤적이 남아요.
13 · MARQUEE · TIMESCALE
로고 띠나 공지 띠처럼 끝없이 흐르는 줄이에요. 같은 묶음을 두 벌 이어 붙이고 xPercent: -50까지 옮긴 뒤 반복하면 이음새 없이 돌아요.
마우스를 올리면 느려지고, 위로 스크롤하면 거꾸로 흘러요.
timeScale만 바꿔요 — 트윈을 새로 만들거나 위치를 다시 재지 않아요14 · SCRUB
scrub은 애니메이션 진행도를 스크롤 위치에 묶어요. 레이어마다 움직이는 양을 다르게 주면 깊이감이 생겨요.
스크롤하면서 보세요.
scrub: 0.6처럼 숫자를 주면, 뚝뚝 끊겨 들어오는 스크롤 이벤트 사이를 부드럽게 이어 줘요15 · PIN · SNAP
pin으로 무대를 붙잡아 두고 스크롤한 거리만큼 타임라인이 진행돼요. 스크롤을 멈추면 snap: 'labels'가 가장 가까운 단계로 맞춰 줘요.
고정은 무대 하나만 하고, 움직이는 건 그 안의 카드뿐이에요.
무엇이 느린지 모르면 고칠 수 없어요. 개발자 도구 Performance 탭에서 저사양 CPU(4× slowdown)로 녹화해요.
보라색(Layout)·초록색(Paint)이 길면 속성이 문제고, 노란색(Script)이 길면 트윈 수나 콜백이 문제예요.
top·width를 x·scale로, 매번 만드는 트윈을 quickTo로, 화면 밖 애니메이션은 pause로 바꿔요.
16 · HORIZONTAL · CONTAINERANIMATION
세로 스크롤로 가로 트랙을 밀어요. 트랙을 움직이는 트윈을 containerAnimation에 넘기면, 각 패널이 가로로 들어오는 순간에 따로 반응할 수 있어요.
트랙 이동에는 반드시 ease: 'none'을 써야 스크롤과 위치가 1:1로 맞아요.
프레임당 16.7ms. 이 안에 계산·레이아웃·페인트·합성이 다 끝나야 해요.
transform·opacity는 합성 단계만 거쳐요. GPU가 맡고 메인 스레드는 쉬어요.
stagger·quickTo·timeline으로 만드는 트윈의 수를 줄여요.
보이지 않는 애니메이션은 비용만 들어요. 화면 밖이면 멈춰요.
모션 줄이기를 켠 사람에게는 완성된 화면만 보여 줘요.
17 · FLIP
Flip은 바뀌기 전 상태를 기록 → DOM을 바꾸고 → 그 차이를 transform으로 메워요. 그리드 ↔ 리스트 전환이나 필터링이 끊기지 않고 이어져요.
18 · DRAGGABLE · INERTIA
Draggable로 끌고 InertiaPlugin으로 던지면, 관성으로 미끄러지다가 snap이 정한 가장 가까운 카드에 멈춰요.
19 · QUICKTO
마우스를 따라오는 원과 끌려오는 버튼이에요. 움직일 때마다 트윈을 새로 만들지 않고, gsap.quickTo()로 만든 함수에 값만 넘겨요.
20 · OBSERVER
Observer는 마우스와 터치 입력을 하나로 정리해 줘요. 카드를 좌우로 밀면 넘어가고, 끄는 동안에는 손을 살짝 따라와요.
CHECKLIST