- **GSAP (GreenSock Animation Platform)**μ JavaScript κΈ°λ°μ κ³ μ±λ₯ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬
- DOM μμλΏ μλλΌ μ΄λ€ κ°μ²΄μ μ΄λ€ μμ±μ΄λ μ λλ©μ΄μ ν μ μλ λ²μ© νλ‘νΌν° μΈν°
- Tween(λ¨μΌ μ λλ©μ΄μ )κ³Ό Timeline(μνμ± μ»¨ν μ΄λ)μΌλ‘ ꡬμ±λλ 2-λ 벨 μ λλ©μ΄μ μμ€ν
ν΄λΉ κ°λ μ΄ νμν μ΄μ
- Hyperframesμμ μ λλ©μ΄μ
μ GSAP νμλΌμΈμΌλ‘ μ μνκ³ , νλ μμν¬κ°
seekFrame()μ ν΅ν΄ μ€ν¬λ¬λΉνλ€ - GSAP νμλΌμΈμ
{ paused: true }λ‘ λ§λ€κ³window.__timelinesμ λ±λ‘νλ ν¨ν΄μ΄ Hyperframesμ ν΅μ¬ κ·μ½ - CSS μ λλ©μ΄μ
λ§μΌλ‘λ νλ μ λ¨μ νμ(seek)μ΄ μ΄λ ΅μ§λ§, GSAPμ
timeline.totalTime(seconds)λ‘ μ νν νλ μ νμμ΄ κ°λ₯
AS-IS β λλ μ΄ κΈ°λ° μλ νμ΄λ°
// κ° μ λλ©μ΄μ
μ μμ μμ μ μλμΌλ‘ κ³μ°ν΄μΌ ν¨
gsap.to("#a", { x: 100, duration: 1, delay: 0 });
gsap.to("#b", { y: 50, duration: 1, delay: 1 }); // #a λλ ν
gsap.to("#c", { opacity: 0, duration: 0.5, delay: 2 }); // #b λλ ν
// μ€κ°μ νλ λ°λλ©΄ μ΄ν λͺ¨λ delayλ₯Ό μμ ν΄μΌ ν¨TO-BE β Timeline μνμ±
const tl = gsap.timeline({ paused: true });
tl.to("#a", { x: 100, duration: 1 }) // 0μ΄λΆν° μλ
.to("#b", { y: 50, duration: 1 }) // #a λλλ©΄ μλ
.to("#c", { opacity: 0, duration: 0.5 }); // #b λλλ©΄ μλ
// νλλ₯Ό μμ ν΄λ μ΄ν νμ΄λ°μ΄ μλμΌλ‘ μ‘°μ λ¨Tween β μ λλ©μ΄μ μ μ΅μ λ¨μ
Tweenμ βλμ κ°μ²΄μ μμ± κ°μ μΌμ μκ°μ κ±Έμ³ λ³νμν€λ λ¨μβλ€.
3κ°μ§ μμ± λ°©μ
| λ©μλ | μλ―Έ | μμ |
|---|---|---|
gsap.to() | νμ¬ κ° β λͺ©ν κ° | gsap.to("#box", { x: 100, duration: 1 }) |
gsap.from() | μ§μ κ° β νμ¬ κ° | gsap.from("#box", { opacity: 0, duration: 1 }) |
gsap.fromTo() | μμ κ° β λ κ° λͺ¨λ μ§μ | gsap.fromTo("#box", { x: 0 }, { x: 100 }) |
μ£Όμ μμ±
| μμ± | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
duration | μ λλ©μ΄μ κΈΈμ΄(μ΄) | 0.5 |
delay | μμ μ λκΈ° μκ°(μ΄) | 0 |
ease | κ°κ°μ 곑μ | "power1.out" |
repeat | λ°λ³΅ νμ (-1 = 무ν) | 0 |
yoyo | λ°λ³΅ μ μλ°©ν₯ μ¬μ | false |
Timeline β μνμ± μ»¨ν μ΄λ
Timelineμ μ¬λ¬ Tweenμ νλλ‘ λ¬Άμ΄ μ μ΄νλ 컨ν μ΄λλ€.
Position Parameter β λ°°μΉμ ν΅μ¬
μΈ λ²μ§Έ μΈμλ‘ νμλΌμΈ λ΄ μ νν λ°°μΉλ₯Ό μ§μ νλ€:
const tl = gsap.timeline();
// μ λ μκ°
tl.to("#a", { x: 100 }, 3); // 3μ΄ μ§μ μ λ°°μΉ
// μλ μκ°
tl.to("#b", { y: 50 }, "+=1"); // μ΄μ λ + 1μ΄
tl.to("#c", { opacity: 0 }, "-=0.5"); // μ΄μ λ - 0.5μ΄ (μ€λ²λ©)
// μ΄μ μ λλ©μ΄μ
κΈ°μ€
tl.to("#d", { scale: 2 }, "<"); // μ΄μ μμκ³Ό λμμ
tl.to("#e", { rotation: 90 }, ">"); // μ΄μ λκ³Ό λμμνλ‘κ·Έλλ§€ν± μ μ΄
tl.play(); // μ¬μ
tl.pause(); // μΌμμ μ§
tl.seek(1.5); // 1.5μ΄ μ§μ μΌλ‘ μ ν
tl.totalTime(3); // 3μ΄ μ§μ μΌλ‘ μ΄λ (repeat ν¬ν¨)
tl.progress(0.5); // 50% μ§μ μΌλ‘ μ΄λ
tl.reverse(); // μλ°©ν₯ μ¬μ
tl.duration(); // μ 체 κΈΈμ΄ λ°νHyperframesμμμ GSAP μ¬μ© ν¨ν΄
// 1. λ°λμ paused: true
const tl = gsap.timeline({ paused: true });
// 2. μ λ μμΉ νλΌλ―Έν°λ‘ μ νν νμ΄λ° μ§μ
tl.from("#title", { opacity: 0, y: -50, duration: 1 }, 0);
tl.to("#subtitle", { opacity: 1, duration: 0.5 }, 1.5);
// 3. composition-idμ λ§€μΉνμ¬ λ±λ‘
window.__timelines = window.__timelines || {};
window.__timelines["my-video"] = tl;
// β νλ μμν¬κ° tl.totalTime(frame/fps)λ‘ κ° νλ μμ μ€ν¬λ¬λΉ