Gonshiro

CHOI-syยท2024๋…„ 1์›” 14์ผ
0

ํ”„๋กœ์ ํŠธ

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

๐Ÿ’ป Gonshiro

  • ์‚ฌ์ดํŠธ๋ช…: Gonshiro
  • ์‚ฌ์šฉ์–ธ์–ด: HTML, CSS, JavaScript
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: jQuery, GSAP, ScrollTrigger, Lenis
  • ์œ ํ˜•: ๋ฐ˜์‘ํ˜•
  • ๐Ÿ“ฐ https://hallowmang.github.io/gonshiro/

โœ… Check Point

โœ” Shrink Logo
โœ” GSAP์˜ toggleActions
โœ” scrollTrigger์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ
โœ” ์Šคํฌ๋กค์œ„์น˜์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ๋ณ€๊ฒฝ


awwwards๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋Š” ๋„์ค‘์— ๊ตฌ์ฐŒ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐ€ ๋ณด๋‹ˆ ๋กœ๊ณ ๊ฐ€ ์Šคํฌ๋กค์„ ํ•˜๋ฉด ์ค„์–ด๋“ค๊ฑฐ๋‚˜ ์ปค์ง€๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋‚˜์™”๋‹ค.
๊ทธ๋ž˜์„œ ์ด ํ”„๋กœ์ ํŠธ์—๋„ ๊ตฌ์ฐŒ์ฒ˜๋Ÿผ ๋กœ๊ณ ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฃผ๊ณ  ์‹ถ์—ˆ๋‹ค.

๋˜ํ•œ, ํ•ด๋‹น ์Šคํฌ๋กค์— ๋“ค์–ด๊ฐ€๋ฉด ๋กœ๊ณ ์˜ ๊ธ€์ž์ƒ‰์ƒ๋„ ๋ณ€๊ฒฝ์ด ๋˜๊ฒŒ ํ•ด๋ณด์•˜๋‹ค.

const trigger = ScrollTrigger.create({
  animation: gsap.from(".logo", {
    y: "9vh",        // ์ดˆ๊ธฐ ์œ„์น˜: y์ถ•์œผ๋กœ 9vh ์ด๋™
    scale: 13,        // ์ดˆ๊ธฐ ํฌ๊ธฐ: 13๋ฐฐ๋กœ ํ™•๋Œ€
    yPercent: -50,    // ์ดˆ๊ธฐ ์œ„์น˜: y์ถ• ๋ฐฉํ–ฅ์œผ๋กœ -50% ์ด๋™
  }),
  scrub: 0.5,
  trigger: ".sc-visual",  
  start: "center center", 
  endTrigger: ".sc-about", 
  end: "40% center",      
});

// ๋กœ๊ณ ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜
function changeColor(progress) {
  gsap.to(".logo", {
    color: progress >= 0.7 ? "#333" : "#fff", 
    duration: 0.3, // ๋ณ€๊ฒฝ๋˜๋Š” ์ƒ‰์ƒ์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜์„ ์œ„ํ•œ duration ์†์„ฑ
  });
}

// ScrollTrigger์˜ onUpdate ์ฝœ๋ฐฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊ณ ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
trigger.animation.eventCallback("onUpdate", function () {
  const triggerPosition = trigger.progress; // ํ˜„์žฌ ScrollTrigger์˜ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™€ ์ €์žฅ
  changeColor(triggerPosition); // ์ง„ํ–‰ ์ƒํƒœ์— ๋”ฐ๋ผ ๋กœ๊ณ ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
});

๐Ÿค”progress??โญโญโญโญ

forner studio ๋ฆฌ๋‰ด์–ผ์„ ์ •๋ฆฌํ•  ๋•Œ ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ๋‹ค์‹œ ์ •๋ฆฌ~~~
์ž์ฃผ ์“ฐ์ด๋Š”๋“ฏ

progress๋Š” GSAP์˜ ScrollTrigger์—์„œ ์ œ๊ณตํ•˜๋Š” ์†์„ฑ ์ค‘ ํ•˜๋‚˜
ํ˜„์žฌ ScrollTrigger์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ๊ฐ’์€ 0์—์„œ 1 ์‚ฌ์ด์˜ ์‹ค์ˆ˜๋กœ ํ‘œํ˜„๋˜๊ณ ,
์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ผ ์–ด๋Š ์ •๋„ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์˜ˆ์‹œ

ScrollTrigger.create({
  trigger: ".trigger",
  start: "top center",
  end: "+=500",
  onUpdate: (self) => console.log("progress:", self.progress),
});

self๋Š” GSAP์˜ ScrollTrigger ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ, ํ•ด๋‹น ScrollTrigger ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
์ฆ‰, self๋ฅผ ํ†ตํ•ด ScrollTrigger์˜ ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

self.progress๋Š” ํ˜„์žฌ ScrollTrigger์˜ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์œผ๋กœ, ์Šคํฌ๋กค ์ง„ํ–‰์— ๋”ฐ๋ฅธ ๊ฐ’์ด 0์—์„œ 1๊นŒ์ง€ ๋ณ€ํ•œ๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ์Šคํฌ๋กค ์ง„ํ–‰ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์— ํ˜„์žฌ progress ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋„๋ก ์„ค์ •.

self๋ฅผ ์ด์šฉํ•˜๋ฉด ScrollTrigger ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, self.start ๋ฐ self.end๋ฅผ ํ†ตํ•ด ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ง€์ ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, self.trigger๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ๊ฑฐ ์š”์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์Šคํฌ๋กค ๊ฐ’์— ๋”ฐ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ธฐ~!!!
forner studio ๋ฆฌ๋‰ด์–ผ


2. scrollTrigger์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ ์ฝœ๋ฐฑโญโญโญ

์™ผ์ชฝ์˜ ๋ฐฐ๊ฒฝ์ด ์Šคํฌ๋กค ์‹œ ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝํ™”๋ฉด๊ณผ ๊ธ€์ž์ƒ‰์ƒ์ด ๋ณ€๊ฒฝ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.
GSAP์˜ scrollTrigger์—์„œ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ ์ค‘์— onToggle์„ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น์˜์—ญ์— ํ† ๊ธ€์ด ๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ด ๋˜๊ฒŒํ•˜์˜€๋‹ค.

const infos = document.querySelectorAll(".info"); // ๋ชจ๋“  .info ์š”์†Œ ์„ ํƒ

infos.forEach((info, index) => {
  ScrollTrigger.create({
    trigger: info,
    start: "top center",
    end: "bottom center",
    // markers:true,
    onToggle: (self) => {
      const { isActive } = self; // ScrollTrigger์˜ ํ™œ์„ฑํ™” ์ƒํƒœ ํ™•์ธ
      let styles;

      // ๊ฐ .info ์š”์†Œ์— ๋”ฐ๋ผ ์Šคํƒ€์ผ ์ง€์ •
      switch (index) {
          // index๊ฐ€ 1์ธ ๊ฒฝ์šฐ
        case 1:
          styles = isActive
            ? { backgroundColor: "#e6e6e3", color: "#333" }
            : { backgroundColor: "rgb(197, 37, 53)", color: "#fff" };
          break;
          // index๊ฐ€ 2์ธ ๊ฒฝ์šฐ
        case 2:
          styles = isActive
            ? { backgroundColor: "#c2a395", color: "#fff" }
            : { backgroundColor: "rgb(197, 37, 53)", color: "#fff" };
          break;
          // index๊ฐ€ 3์ธ ๊ฒฝ์šฐ
        case 3:
          styles = isActive
            ? { backgroundColor: "#333333", color: "#fff" }
            : { backgroundColor: "rgb(197, 37, 53)", color: "#fff" };
          break;
          // ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ
        default:
          styles = { backgroundColor: "#c52535", color: "#fff" };
          break;
      }

      gsap.to(".info", {
        backgroundColor: styles.backgroundColor,
        color: styles.color,
        duration: 0.5,
        ease: "power2.out",
      });
    },
  });
});

.info ์š”์†Œ์— ๋Œ€ํ•ด ScrollTrigger๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์š”์†Œ๊ฐ€ ํŠน์ • ์ธ๋ฑ์Šค ์Šคํฌ๋กค ์œ„์น˜์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋– ๋‚  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” onToggle ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ์š”์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉ.

๐Ÿค”์ด๋ฒคํŠธ์ฝœ๋ฐฑ??โญโญ

์ด๋ฒคํŠธ์ฝœ๋ฐฑ์ด ๋ฌด์—‡์ผ๊นŒ? ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž~

  1. onEnter:
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ : ์Šคํฌ๋กค ์š”์†Œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ์˜์—ญ์— ์ง„์ž…ํ•  ๋•Œ ๋ฐœ์ƒ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์š”์†Œ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹œ์ž‘.
onEnter: (self) => console.log("entered")
  1. onLeave:
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ : ์Šคํฌ๋กค ์š”์†Œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ์˜์—ญ์„ ๋– ๋‚  ๋•Œ ๋ฐœ์ƒ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์š”์†Œ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€.
onLeave: (self) => console.log("left")
  1. onEnterBack:
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ : ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐ ์˜์—ญ์— ์ง„์ž…ํ•  ๋•Œ ๋ฐœ์ƒ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์—ญ๋ฐฉํ–ฅ ์Šคํฌ๋กค ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€.
onEnterBack: (self) => console.log("entered back")
  1. onLeaveBack:
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ : ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ์š”์†Œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ์˜์—ญ์„ ๋– ๋‚  ๋•Œ ๋ฐœ์ƒ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์—ญ๋ฐฉํ–ฅ ์Šคํฌ๋กค ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€.
onLeaveBack: (self) => console.log("left back")

โญ5. onToggle:

  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ : ScrollTrigger์˜ ํ† ๊ธ€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ScrollTrigger์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰.
onToggle: (self) => console.log("toggled, isActive:", self.isActive)
profile
์•ˆ๋…•ํ•˜์„ธ์š”.

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