OUTFIT7

OOOYยท2023๋…„ 10์›” 5์ผ
0

Portfolio

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

๐ŸŽฎ OUTFIT7

๊ฐœ์ธํ”„๋กœ์ ํŠธ

์‚ฌ์ดํŠธ๋ช…: OUTFIT7

์ž‘์—… ๊ธฐ๊ฐ„: 7์ผ ์†Œ์š”

#gsap #canvas

์œ ํ˜•: ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ pc ์‚ฌ์ดํŠธ

ํŠน์ง•: canvas ์™€ gsap์„ ์‚ฌ์šฉํ•œ ๋ชจ์…˜ ์ ์šฉ

โ€ผ๏ธ์ž‘์—… ๋ชฉํ‘œ

  • ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ! ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ! ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ!

๐Ÿ“POINT

  1. :not ์„ ํƒ์ž
  2. canvas๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝํ•˜๊ธฐ
  3. Text split
  4. Gsap ์Šคํฌ๋กค ์ด๋ฒคํŠธ

๐Ÿ’กHow to study?

GSAP ์‚ฌ์šฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ


1. :not ์„ ํƒ์ž

hover ์‹œ, ์„ ํƒํ•˜๊ณ  ์‹ถ์€ ํ•ญ๋ชฉ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€์˜ ์ƒ‰์ƒ์„ ์œ ์ง€.

header .gnb-item:hover a{color: #fff;}

//์„ ํƒํ•ญ๋ชฉ์— :hover ๋ฅผ ์ ์šฉํ•ด ์ฃผ๊ณ //

header .gnb-list:hover .gnb-item:not(:hover){color: rgba(242, 242, 242, 50%);}

//์ƒ์œ„ ํด๋ž˜์Šค์— :hover ์ ์šฉ ํ›„, ๋น„์„ ํƒ ํ•ญ๋ชฉ์— :not ์„ ํƒ์ž๋ฅผ ์ ์šฉ์‹œ์ผœ :hover ๋ฅผ ์ œ์™ธํ•ด ์ค€๋‹ค.

2. canvas๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝํ•˜๊ธฐ

๋’ท ๋ฐฐ๊ฒฝ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์Šคํฌ๋กค์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ ์  ๋ณ€๊ฒฝ๋˜๋Š” ํšจ๊ณผ๋ฅผ ์ฃผ๊ณ  ์‹ถ์—ˆ๋‹ค!

๋‹คํ–‰ํžˆ outfit ํŽ˜์ด์ง€์˜ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ๋ถ„๋ฆฌ๋œ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
(์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์ชผ๊ฐœ์ง„ ์ด๋ฏธ์ง€๊ฐ€ 240์žฅ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค...!)


    const canvas = document.querySelector('#downloads-bg'); 
	//์บ”๋ฒ„์Šค ์˜์—ญ ์„ ํƒ
    const ctx = canvas.getContext('2d');
	// 2d๋กœ ์ง€์ •

    canvas.width = 1440;
    canvas.height = 1181;

    const frameCount = 240; //์ด๋ฏธ์ง€ ์ด๊ฐœ์ˆ˜


   
	//padStart (3 = ์„ธ์ž๋ฆฌ (240) ,
    const currentFrame = (idx) => {
      return `https://outfit7.com/img-sequence/desktop/desktop_${idx.toString().padStart(3, '0')}.png`;  
    }; // ๋ฆฌํ„ด ํ•„์ˆ˜

    const images = [];
    const card = {
      frame: 0,
    };
	
	// ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
	// i < frameCount ์ผ ๋•Œ i ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ
 	//์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฉฐ ๊นœ๋นก์ด๋Š” ํšจ๊ณผ๊ฐ€ ์—†๊ฒŒ๋”)
    for (let i = 0; i < frameCount; i++) {
      const img = new Image();
      img.src = currentFrame(i + 1);
      images.push(img);
    }

	//Gsap ์Šคํฌ๋กคํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค ์˜์—ญ ์žก์•„์ฃผ๊ธฐ
    gsap.to(card, {
      frame: frameCount - 1,
      snap: 'frame',
      ease: 'none',
      scrollTrigger: {
        trigger: '.sc-downloads .sticky-area',
        scrub: 1,
        start: '0% 0%', 
        end: '100% 100%',
        // markers:true,
      },
      onUpdate: render,
    });

    images[0].onload = render;

    function render() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.drawImage(images[card.frame], 0, 0);
    }
    

3. Text split

์Šคํฌ๋กค์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ…์ŠคํŠธ ์ƒ‰์ƒ์ด ํ•˜๋‚˜์”ฉ ์ฑ„์›Œ์ง€๋Š” ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋‹ค!


	//SplitType.js ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€ ๊ธ€์ž๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ชผ๊ฐœ์ฃผ์—ˆ๋‹ค
    const downloadsText = new SplitType('.sc-downloads .slide-text .text-box span', { types: 'words, chars', });


    // timeline -> ์‹œ๊ฐ„์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š”๊ฒƒ ๋ชจ์…˜์„ ๋‹คํ•จ๊ป˜ ์จ์ค„์ˆ˜์žˆ๋‹ค.
	//ํƒ€์ž„๋ผ์ธ์„ ํ†ตํ•ด ์Šคํฌ๋กค์— ๋”ฐ๋ฅธ ํ…์ŠคํŠธ์˜ ์œ„์น˜ ์„ค์ •๊ณผ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์ ์šฉ!

    const textMotion = gsap.timeline({
      scrollTrigger:{
        trigger: '.sc-downloads .sticky-area',
        start:"0% 0%",
        end:"100% 100%",
        // markers:true,
        scrub: 1,
      },
    })

    textMotion.addLabel('a')
    textMotion.to('.sc-downloads .slide-text',{ 'padding-top':73, },'a')
    textMotion.to('.sc-downloads .slide-text .text-box .char',{color:'#fff', stagger:0.1 },'a') 
	// stagger๋ฅผ ํ†ตํ•ด ๊ธ€์”จ ์ƒ‰์ƒ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ์ผœ์ฃผ๊ธฐ
    textMotion.to('.sc-downloads .bg-color',{yPercent:-100},'a')

4. Gsap ์Šคํฌ๋กค ์ด๋ฒคํŠธ

์Šคํฌ๋กค์— ๋งž์ถฐ ์ƒค๋ผ๋ฝ ์ปค์ง€๊ณ  ๋“ฑ์žฅํ•˜๋Š” ์—ญ๋™์ ์ธ ๋ชจ์…˜!

gsap ์Šคํฌ๋กค ํŠธ๋ฆฌ๊ฑฐ + ํƒ€์ž„๋ผ์ธ์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ๋ชจ์…˜.

์ถ”๊ฐ€ ๊ณต๋ถ€ ์ž๋ฃŒ :
https://velog.io/@oneuya/GSAP-์‚ฌ์šฉ๋ฒ•-์•Œ์•„๋ณด๊ธฐ

    const hyperdotMotion =  gsap.timeline({
      scrollTrigger:{
        trigger: '.sc-hyperdot .hyper-inner',
        start:"0% 0%",
        end:"80% 100%",
        // markers:true,
        scrub: 1,
      },
    })

    hyperdotMotion.to('.sc-hyperdot .bg-blue',{
      scale:6
    }) //ํŒŒ๋ž‘์ƒ‰ ๋™๊ทธ๋ผ๋ฏธ๊ฐ€ ๋ฐฐ๊ฒฝ์„ ๊ฝ‰ ์ฑ„์šฐ๊ฒŒ ์Šค์ผ€์ผ ํ‚ค์šฐ๊ธฐ
    hyperdotMotion.to('.sc-hyperdot .card-list',0.4,{
      scale:1,
      opacity:1,
    }) //์•„๋ž˜์˜ ์นด๋“œ ๋‰ด์Šค์˜ ๋ถˆํˆฌ๋ช…๋„๊ฐ€ ์กฐ์ ˆ๋˜๋ฉฐ ์˜ฌ๋ผ์˜ค๊ธฐ
profile
์ผ๋‹จ ํ•ด ๋ณด์ž๊ตฌ~! ๐Ÿคธ

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด