GSAP ScrollTrigger

์˜›์Šฌยท2021๋…„ 12์›” 4์ผ
8

LIBRARY

๋ชฉ๋ก ๋ณด๊ธฐ
3/7
post-thumbnail

GSAP ScrollTrigger Property ๋ชจ์Œ๐Ÿ“
211202-211204 ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ

Start

  • ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ๋„ฃ์„ ์‹œ, viewport ๊ธฐ์ค€ ScrollTrigger์˜ ์‹œ์ž‘์ . ์˜ˆ์‹œ) 400px = ์Šคํฌ๋กค ์‹œ์ž‘ ํ›„ 400px ๋–จ์–ด์ง„ ์‹œ์ .
  • ๊ฐ’์„ ๋‘๊ฐœ ๋„ฃ์„ ์‹œ
    - ์ฒซ๋ฒˆ์งธ ๊ฐ’ : TOP | CENTER | BOTTOM - Trigger๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ธฐ์ค€ ์ 
    • ๋‘๋ฒˆ์งธ ๊ฐ’ : TOP | CENTER | BOTTOM - Viewport์—์„œ ์Šคํฌ๋กค์˜ ์œ„์น˜
    • ์˜ˆ์‹œ) start: top center = ํŠธ๋ฆฌ๊ฑฐ์˜ ์œ—๋ถ€๋ถ„์ด viewport๊ธฐ์ค€ ์ค‘๊ฐ„์— ๋‹ฟ์•˜์„ ๋•Œ ์‹œ์ž‘
  • function์œผ๋กœ๋„ ์ž‘์„ฑ ๊ฐ€๋Šฅ
scrollTrigger: {
	end: () => `+=${document.querySelector('.square').offsetHeight}`
}

End

  • start์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋จ. ๋๋‚˜๋Š” ์‹œ์ ์„ ์ž…๋ ฅํ•œ๋‹ค.

toggleClass

  • start ์‹œ์ ์—์„œ class๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  end์—์„œ class๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

Marker

  • ์Šคํฌ๋กค์ด ์‹œ์ž‘๋˜๊ณ  ๋๋‚˜๋Š” ์‹œ์ ์„ ๋งˆํ‚นํ•ด์ค€๋‹ค
  • markers: true ์ž…๋ ฅ ์‹œ, ๊ธฐ๋ณธ ์Šคํƒ€์ผ๋กœ ๋งˆ์ปค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ๋งˆ์ปค ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ์‹œ, ํ•˜๋‹จ์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
scrollTrigger: {
	markers: {
    	startColor: 'yellow',
        endColor: 'black',
        fontSize: '4rem',
        indent: 200
    }
}

Toggle Actions

  • ์Šคํฌ๋กค ํŠธ๋ฆฌ๊ฑฐ์˜ ์ด๋ฒคํŠธ ํ–‰๋™์„ ์ •์˜ํ•จ
  • toggleAction: "onEnter onLeave onEnterBack onLeaveBack"
  • play | restart | reverse | pause | resume (ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ๋ฅผ ์ด์–ดํ•จ) | reset (์ดˆ๊ธฐํ™”) | complete (์ด๋ฒคํŠธ์ข…๋ฃŒํ›„)
  • onEnter : scroll-start ~ scroll-end ์‚ฌ์ด
  • onLeave : scroll-end๋ถ€๋ถ„์„ ๋„˜์–ด๊ฐˆ ๋•Œ
  • onEnterBack : scroll-start ~ scroll-end ์‚ฌ์ด๋กœ ๋‹ค์‹œ ๋“ค์–ด๊ฐˆ ๋•Œ
  • onLeaveBack : scroll-end๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋„˜์–ด๊ฐˆ ๋•Œ

ScrollTrigger.saveStyles("selector")

  • ์ฃผ๋กœ responsive website๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ. resize๋ฅผ ํ•ด๋„ ๊ธฐ์กด ์Šคํƒ€์ผ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ

ScrollTrigger.matchMedia({})

  • responsible ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
ScrollTrigger.matchMedia({
  // mobile
  "(min-width: 320px) and (max-width: 767px)": function() {
     gsap.timeline({
      scrollTrigger: {
        trigger: '.about-section1',
        start: `top ${headerHeight}`,
        toggleActions: 'restart none none none'
      }
    }).from(".about-section1 img", {
      opacity: 0,
      y: -30,
    })
  }
})
  • ๋””๋ฐ”์ด์Šค ํ•ด์ƒ๋„์— ๋”ฐ๋ผ GSAP์„ ์ ์„ ์ˆ˜ ์žˆ๋‹ค.

Scrub

  • scrub์€ GSAP ScrollTrigger์˜ ์ด๋ฒคํŠธ๊ฐ€ ์Šคํฌ๋กค์ด ์‚ฌ์šฉ๋ ๋•Œ๋งŒ ์žฌ์ƒ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ์†์„ฑ์ด๋‹ค.
  • ์ฆ‰, ์Šคํฌ๋กค์„ ๋ฉˆ์ท„์„ ๋•Œ ์ด๋ฒคํŠธ๋„ ์ค‘๊ฐ„์— ๋ฉˆ์ถ˜๋‹ค.
  • scrub: true - ์Šคํฌ๋Ÿฝ์ด ์‹คํ–‰๋œ๋‹ค
  • scrub์— number์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค - ์ด๋ฒคํŠธ๊ฐ€ ๋” ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹คํ–‰๋˜๋„๋ก ๋„์™€์ค€๋‹ค scrub: 3

Pin

  • ํŠน์ • element๊ฐ€ ๊ณ ์ •๋˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ์†์„ฑ.
  • pin: true ์‹œ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๊ณ ์ •๋œ๋‹ค.
  • pin: '.selector'์‹œ ํŠน์ • ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๊ณ ์ •๋œ๋‹ค.
  • pinSpacing: true์‹œ ๊ณ ์ •๋˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ์•„๋ž˜์— padding์„ ์ค˜์„œ ์Šคํฌ๋กค์ด ๋๋‚œ ํ›„ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ด์–ด์„œ ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. pinSpacing: "margin" ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด padding ๋Œ€์‹  margin์„ ์ค€๋‹ค.

Timeline

  • ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์คŒ.
const tl = gsap.timeline();
tl.to('.box1', {x: 500, duration: 2})
  .to('.box2', {y: 200, duration: 3})

const tl2 = gsap.timeline({
	scrollTrigger: {
    	trigger: '.main',
        start: 'top 20%',
        end: 'top 80%'
    }
})

tl2.to('.div1', {x: 500, duration: 2})
   .to('.div2', {y: 200, duration: 3})

Standalone/Custom example

  • ScrollTrigger๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ทธ๋•Œ๋Š” ๋Œ€๋ฌธ์ž'S'๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค
ScrollTrigger.create({
  trigger: ".header",
  start: "top 5%",
  toggleClass: {targets: 'nav', className: 'active'}
});
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ๋Š” [ํ—ค๋”]์ด๊ณ , ํ—ค๋”์˜ ์œ—๋ถ€๋ถ„์ด viewport์˜ 5% ์ง€๋‚˜๊ฐ”์„ ๋•Œ
    nav๋Š” active ํด๋ž˜์Šค๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ nav์˜ ์ƒ‰์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
profile
์›น ํผ๋ธ”๋ฆฌ์…”์ž…๋‹ˆ๋‹ค๐Ÿ’“

0๊ฐœ์˜ ๋Œ“๊ธ€