:
GSAP(GreenSock Animation Platform)ì ìë°ì€í¬ëŠœížë¡ ì ìŽíë íìëŒìž êž°ë°ì ì ëë©ìŽì ëŒìŽëžë¬ëЬìŽë€.(í¬ë¡ì€ëžëŒì°ì§ ì§ìíš)
GSAP
CDNì¬ì©ë²
gsap.ë©ìë(íê²ìì, ìê°, ìµì )
: Tweenì ì ëë©ìŽì
ì ìží
íë Ʞ볞 ëšì!
+)ð£
Tweeningì ì ëë©ìŽì
í€íë ì ììì ìŽë¯žì§ë¥Œ ë§ëë 곌ì ì ë»íŽ
cssë¡ë transition ì€ê±°ëŒê³ ìŽíŽí멎 ì¬ìžê±°ìŒ ëë ìŽë žì ë ììì
ìŒë¡ ë§ë ì ëë©ìŽì
ì ìê°íŽ
ìŽë€ ê°ì transitionì 죌멎 ììí ë³íìì? ê·ž ììí ë³ê³Œë 곌ì ìŽ Tweening!
ê·žëŠ¬ê³ ê·ž 결곌 íëíëì ë³íë ì°ìì ìž ìŽë¯žì§ë¥Œ TweenìŽëŒê³ íê³ !
ð gsap.to("ìì",ìê°,{ìì±}) : ì ëë©ìŽì
ì ë ê°ì ì§ì íë ë©ìë
ð gsap.from({"ìì",ìê°,{ìì±}}) : ì ëë©ìŽì
ì ìì ê°ì ì§ì íë ë©ìë
ð gsap.fromTo(ìì,ìê°,{ìììì±},{ëìì±}) : ì ëë©ìŽì
ì ìì ë° ë ê°ì ì§ì íë ë©ìë
ð gsap.Timeline() : ììëë¡ ì ëë©ìŽì
ìŽ ëëë¡ ì ìŽí ì ìë ë©ìë
+)ð£
ìë°ì€í¬ëŠœížì ê°ìŽ ì
ë ¥í멎 ë°ë¡ ì ëë©ìŽì
ìŽ ì€ííŽ
A,B,C tweenì ë§ë€ë©Ž íë²ì A,B,C ì ëë©ìŽì
ìŽ ì€ííëê±°ì§
AâBâC ììŒë¡ ì ëë©ìŽì
ì ì€ííê³ ì¶ìë delayê°ì 죌멎 ê°ë¥íì§ë§
ìì delayê°ì ìì í멎 ë€ì ê°ë ìì íŽì ìŒìŒìŽ ë§ì¶°ìŒ íìì
ê·žë° ë²ê±°ë¡ìì ì€ìŒ ì ìê² ì
ë ¥í ììëë¡ ì€íëëê² gsap.Timeline()ìŽìŒ!
ì«ì | % 륌 ë£ìŒë©Ž íìëŒìž êž°ì€ìŒë¡ë¶í° ì«ìë§íŒ ì /í ì€íëë€.-= : ìŽì ì ëë©ìŽì
ì ì¢
ë£ ì ì€í(ì€ë³µ ì€í)+= : ìŽì ì ëë©ìŽì
ì¢
ë£ í ì§í(ìŽì íìëŒìžê³Œ ê° ë°ì)"<" : ìŽì ì ëë©ìŽì
ì ìì ì ì§í(ì€ë³µ ì€í)">" : ìŽì ì ëë©ìŽì
ì ì¢
ë£ ì ì§í(ì€ë³µ ì€í)ð«¡ ê·žëì ìŽê±° ìžì ì ì°ëê±°ìŒ?
+)ð£
ì°ëа ìŽì gsap.Timeline()ìŒë¡ ìì°šì ìŒë¡ ì ëë©ìŽì
ì ì§€ ì ìì§...!
AâBâCâDììŒë¡ ì§€ ì ìì§ë§ AâB=CâD륌 íŽìŒí ëë ììì~
ê·žë ì¬ì©í멎 ížíë€!
const tl = gsap.timeline({
defaults: {duration:1} // tlì ì ëë©ìŽì
ì ë€ 1ìŽì© ì€ì !
})
tl.to(".box",{y:100})
tl.to(".box",{x:100},"-=0.5") // ì íìëŒìžìŽ ëëêž°0.5ìŽ ì ì€í
tl.to(".box",{rotate: 180, borderRadius: "50%"})
tl.to("body",{background:"#aaa"},"<") // ì íìëŒìžê³Œ ê°ìŽ ì€í
tl.to(".box",{border:"2px solid white"})
tl.to(".box",{scale:1.5})
tl.to(".box",{background:"tomato"},2) // ì 첎 ì ëë©ìŽì
2ìŽì ë°ë¡ ì€í
x : transform:translateXY : transform:translateYrotation : transform:rotate(deg)skew : transform: skew(deg)scale : transform: scaleXPercent : transform: translateX(%)YPercent : transform: translateY(%)delay : ì ëë©ìŽì
ìŽ ììëêž° ì ì§ì°ìê°repeat : ì ëë©ìŽì
ì ë°ë³µ íì(Ʞ볞 1í / repeat:1:2í / repeat:-1:묎íë°ë³µ)repeatDelay : ê° ì ëë©ìŽì
ë°ë³µ ì¬ìŽì ì§ì° ìê° yoyo : ì ëë©ìŽì
ìŽ ìë£ë í ì¬ì ë°©ë²false : Ʞ볞ê°(ìì-ë-ìì-ë ì¬ì)true : ë°ë ì¬ì(ìì-ë-ë-ìì ì¬ì)ease : ì ëë©ìŽì
ìŽ ì¬ìë ëì ìë ì€ì ease: ease.type ìŒë¡ ì¬ì©) DAMOstagger : ëšìŒ ì ëë©ìŽì
ìì ì¬ë¬ ëìì ìì ìê°ì ì€ì , ê°ì²Žë¥Œ í¬íší ì ìë€.each : ê° ì ëë©ìŽì
ì ìì ì¬ìŽê°(Ʞ볞ê°)amount : 몚ë ì ëë©ìŽì
ì ì¬ììê° ê°from : ì ëë©ìŽì
ì ììíë ììcenter : ê°ìŽë°ìì ìì(3-2-1-2-3)end : ë€ììë¶í° ìì(5-4-3-2-1)edges : ì ì¬ìŽëë¶í° ìì(1-2-3-2-1)defaults : ì ëë©ìŽì
ìŽ ê³µíµìŒë¡ ê°ì§ë ìì±// 몚ë .ex ë°ì€ë 1ìŽ ììŒë¡ ë· ììë¶í° xì¶ìŒë¡ 500 ìŽëíë ì ëë©ìŽì
gsap.to(".ex",{x:500, stagger:{amount:1,from:"end"}})
const tl = gsap.timeline({
repeat: 1, // ë°ë³µíì ìŽ 2ë²
repeatDelay: 3, // ë°ë³µí ëë§ë€ì ëë ìŽ 3ìŽ
yoyo: true, // ì¬ììí ëë ëë¶í° ìì
defaults: {duration: 2}, // timelineìŽ ê³µíµìŒë¡ ê°ì§ë ìì±
paused: true})
// ì 첎 ë°ì€ë€ì!
tl.to(".box", {x: 20});
tl.to(".box", {backgroundColor:'white'})
tl.to(".box", {y: 20},'-=1'); // ì íìëŒìž 1ìŽì ì§í(ìì ì ëë©ìŽì
곌 겹칚)
tl.to(".box", {backgroundColor:'tomato'},4) // íìëŒìžìŽ ììíê³ 4ìŽ í ìì
tl.to(".box", {opacity: 0, stagger: 0.3}); // ììë€ìŽ 0.3ìŽì© ëë ìŽíŽì ë³ê²œ
tl.to(".box", {opacity: 1 ,stagger: 0.3});
tl.to(".box", {x: -10});
tl.to(".box", {rotation:360},"<"); // ìì ìì ììí ë ê°ìŽ ì§í
tl.to(".box", {y: -10});
tl.to(".box", {scale:.5},"+=4"); // ì íìëŒìž ì¢
ë£ í 4ìŽ í ì§í
tl.to(".box", {y: 10});
: ì€íìŒìŽ ì§ì ëìŽ ìì§ ìì ììë€ìŽ í멎ì ë ëë§ ë ê²œì° ìœí ìž ì ê¹ë¹¡ìŽë íëì íšê³Œë¥Œ ëíëŽë ì©ìŽ
+)ð£
ì¹í°ížê° ë¡ëëêž° ì íìŽì§ ë ëë§ ìíìì Ʞ볞 êžêŒŽìŽ ëì€ê³ ì¹í°ížë¡ ë³ê²œëë 몚ìµì ììíŽëŽ=^ã
^=)
ìŠ gsapì¬ì©ì ì ëë©ìŽì
ìŽ ë¡ë©ëêž° ì ê¹ë°íë FOUC íììŽ ëíëë€!
ìŽ íìì ì ê±°íêž° ìíŽ 3ê°ì§ íŽê²°ì±
ì ì€ë¹íìŽ~
DOMContentLoaded ìŽë²€ížë¥Œ ì€ì íë€.visibility:hidden ìì± ë¶ì¬íêž°visibility:visible ìì± ì¶ê°íŽ ì€ìŒ íë€.)autoAlpha:0 ì€ì íêž°: GSAPì ìì±ìŽë€.(CSS NO!)
autoAplha:0ì ì€ì í멎 opacity:0,visibility:hidden
autoAplha:1ì ì€ì í멎 opacity:1,visibility:inherit
//autoAlphaë¡ visibility:hidden ì€ì !
gsap.to(element, {duration: 2, autoAlpha: 0});
// 2ìŽ íì 볎ìžë€!
gsap.to(element, {duration: 2, autoAlpha: 1, delay: 2});
ScrollTo
: window ëë DOM ììì ì€í¬ë¡€ ìì¹ ì ëë©ìŽì
!죌ì! CSSìì íšê» ì¬ì©í멎 scroll-behavior: smoothì¶©ëìŽ ë°ì.
ScrollToìì
// ìëšìŒë¡ ì€í¬ë¡€ ë²íŒì íŽëŠí멎, toTopEl.addEventListener('click', function () { // íìŽì§ ìì¹ë¥Œ ìµìëšìŒë¡ 0.7ìŽ ëì ìŽë. gsap.to(window, .7, { scrollTo: 0 }) })
ScrollTrigger
: í¹ì ìì ëë í¹ì ìì¹ ì€í¬ë¡€ êž°ë° ì ëë©ìŽì
scrollTriggerë¡ ìŽë²€íž ìë ìì± ì€ì ,triggerë¡ ìì§ìŽê³ ì¶ì ìì ì€ì ,start/endë¡ ìì§ìŽê³ ì¶ì ì§ì ì€ì
ScrollTriggerìì
let ex = gsap.timeline({ // scrollTriggerë íìëŒìžì ì¶ê°í ì ìë€! scrollTrigger: { trigger: ".container", // trigger ëì pin: true, // trigger ê³ ì start: "top top", // triggerê° viewport ìëšì ë¿ìë ìì end: "+=500", // ììì§ì ìì 500px륌 ì€í¬ë¡€í í ë scrub: 1, // ì ëë©ìŽì ë¶ëëœê² ì§í snap: { snapTo: "labels", // íìëŒìžìì ê°ì¥ ê°ê¹ìŽ ëŒë²šì ì€ë duration: {min: 0.2, max: 3}, // ìµì 0.2 ìµë 3ìŽ ëì delay: 0.2, // ì€ë ì íêž° ì 0.2ìŽëì ì§ì° ease: "power1.inOut" // ë³íìë } } });
: ScrollTriggerì ì¬ì©í ë ìì§ìŽê³ ì¶ì ìì륌 ì§ì íë€.
: ììì ì€í¬ë¡€ì ìì, ë ì§ì ì íìží ì ìë€.
markers:ture : êž°ë³žê° (startColor: "green", endColor: "red")

markers: true,
id: 'gsapê³µë¶ì€'

: ììê° ìì§ìŒ ìì곌 ëì ì€ì íë€.
ìì±:"ìì(trigger)ì ìì¹ | ë·°í¬íž(viewport)ì ì€í¬ë¡€ ìì¹" ëê°ì§ ê°ì ë°ëë€.
start : ì ëë©ìŽì
ì ììíêž° ìí ìì(trigger)ì ë·°í¬íž(viewport)ì ì€í¬ë¡€ ìì ìì¹
end : ì ëë©ìŽì
ì ì¢
ë£íêž° ìí ìì(trigger)ì ë·°í¬íž(viewport)ì ì€í¬ë¡€ ë ìì¹
start: "100px" // ììì ìëšìŽ ë·°í¬íž ì€í¬ë¡€ 100pxì ì§ë ìì
start: "top 20%" // ììì ìëšìŽ ì€í¬ë¡€ìŽ 80%ì ë¿ìŒë©Ž ìì
start: "top bottom-=100px" // ììì ìëšìŽ ì€í¬ë¡€ë¬ íëšìì 100pxìì ëë¬í ë
start: ()=>window.innerHeight // ë·°í¬ížì ëìŽì ë¿ì ë ìì
end: "bottom center" // ììì íëšìŽ ì€í¬ë¡€ì ì€ìì 볎ìŽë©Ž ì¢
ë£
end: "+=300" // ììì ìëšìŽ ì€í¬ë¡€ì 300px ë ê° í ì¢
ë£
: ììì ìì¹ì ë°ë¥ž ì ëë©ìŽì
ì ìŽ ë°©ì ì€ì íë€.
toggleActions: "onEnter-onLeave-onEnterBack-onLeaveBack" ì ììë¡ ì€ì íë©° Ʞ볞ê°ì play none none none ìŽë€.
onEnter : ì ëë©ìŽì
ìŽ ììíì ë
(triggerì scrollìŽ ë§ë¬ì ë = ììê° ììŒì ë€ìŽì¬ ë)
onLeave : ì ëë©ìŽì
ìŽ ëë¬ì ë
(triggerê° scrollì ì§ëì³€ì ë = ììê° ììŒìì ë²ìŽë ë)
onEnterBack : ì ëë©ìŽì
ìŽ ììíê³ í멎ì ë€ì ë³ŽìŒ ë
(triggerê° scrollì ì§ëì³€ë€ê° ë€ì ë§ë¬ì ë)
onLeaveBack : ì ëë©ìŽì
ìŽ ëëê³ í멎ì ë€ì 볎ìŽì§ ìì ë
(triggerê° scrollì ì§ëì³€ë€ê° ë€ì ì§ëì³€ì ë ìŠ, ì€í¬ë¡€ì ëŽëŠ¬ê³ ì¬ë €ì ë€ì ì§ëì³€ì ë)
play: ì¬ìpause: ìŒìì€ì§resume: ë€ì ì¬ìreset: ìŽêž°írestart: ì²ìë¶í° ì¬ììcomplete: ì ëë©ìŽì
ëê¹ì§ ìë£reverse: ë°ënone: ììtoggleActions: "play pause resume reset"
// ììê° ììŒì ë€ìŽì¬ ë ììíê³ | ììŒìì ëê°ë©Ž ë©ì¶ê³
// ë€ì ììŒì ë€ìŽì€ë©Ž ë€ì ììíê³ | ë€ì ì§ëê°ë©Ž ì²ììŒë¡ ìŽêž°í
: ì ëë©ìŽì
ìŽ startìŒ ë classì¶ê° endìŒ ë classì ê±°í ì ìë€.
toggleClass:'active'
// ììê° startì ë€ìŽì¬ë active íŽëì€ ì¶ê°, endë¡ ëìŽê°ë©Ž active íŽëì€ ì ê±°
: scrollì ì ëë©ìŽì
ì§íë¥ ì ì°ê²°íë€.
ìì±ê°ìŒë¡ scrub: true ëë Number(ì ì)(=ìê°)륌 ì¬ì©í ì ìë€.
ð«¡scrubì ìê°ì í° ê°ìŒë¡ ë£ì ìë¡ ì§íìŽ ë¶ëë¬ìì§ë€.
ðì«ìê°ì ë£ìŒë©Ž ì ëë©ìŽì
ì§íìŽ ì€í¬ë¡€ì ë°ëŒì¡ë ìê°ì ì€ì íëê±°ëŒ ì«ìê° íŽìë¡ ì€ë¬Žë©ìŽ ê±žëŠ°ë€!
scrub: true // ì ëë©ìŽì
ì§íë¥ ì scrollì ì°ê²°
scrub: 1 // ì ëë©ìŽì
ì§íë¥ ì scrollì ì°ê²°íê³
// + ì ëë©ìŽì
ì§íë¥ ìŽ ì€í¬ë¡€ ë§ë ì§íë¥ ì ë°ëŒì¡ëë° 1ìŽê° 걞늌
: ì€í¬ë¡€ìŽ ëë ëì ìì륌 ê³ ì ìíšë€.
pin:true : tirggerê° ê³ ì ëë€.
pin:'ìì' : í¹ì ììê° ê³ ì ëë€.
: ì ëë©ìŽì ìŽ ììëêž° ë°ë¡ ì ì íšì륌 ížì¶íë€.(onStartë³Žë€ ë¹šëŠ¬ ížì¶)
gsap.to(.box,3,{
x: 20
onInit:initFn
})
function initFn(){
console.log('ì ëë©ìŽì
ììì !')
}
: ì ëë©ìŽì
ìŽ ììë ë íšì륌 ížì¶íë€.
(ìê°ìŽ 0ìì ë€ë¥žê°ìŒë¡ ë³ê²œ, ížììŽ ì¬ë¬ë² ììë멎 ëë² ìŽì ë°ìí ì ìë€.)
: ì ëë©ìŽì ìŽ ìë£ë멎 íšì륌 ížì¶íë€.
: ì ëë©ìŽì ìŽ ì ë°ìŽíž ë ëë§ë€ ížì¶íë€.
: ì ëë©ìŽì ìŽ ìë¡ê² ë°ë³µë ëë§ë€ ížì¶íë€.
: ìŽë²€íž ížì¶í ë paramsê°ì ì ë¬í ì ìë€.
ëš, ë°°ìŽ ííë¡ ë겚죌ìŽìŒ íë€.
gsap.to(".class",{
x:100,
onStart:myFunction,
onstartParams:["ìì","í ë"]
onComplete:myFunction,
onCompleteParams:["ëë ", "ë"]
});
function myFunction(param1,param2){
console.log(param1 , param2)
}