DNA Projecten

sealkimยท2023๋…„ 1์›” 22์ผ
0

Portfolio

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

๐Ÿ“š Overview

์‚ฌ์ดํŠธ๋ช…: DNA Projecten ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€
์ž‘์—… ๊ธฐ๊ฐ„: 7์ผ ์†Œ์š”
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: jquery, gsap
์œ ํ˜•: ๋ฐ˜์‘ํ˜•, ํด๋ก  ์ฝ”๋”ฉ
ํŠน์ง•: ๋ชจ๋ฐ”์ผ, ํƒœ๋ธ”๋ฆฟ, PC 3๊ฐ€์ง€ ๋ฒ„์ „์œผ๋กœ ์ œ์ž‘ํ•œ ๋ฐ˜์‘ํ˜• ์›น์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.

โœ”๏ธ What's the point?

  1. gsap.timeline์„ ํ™œ์šฉํ•œ ๋ผ์šด๋“œ ๋ชจ์…˜
  2. ๋ฐ˜์‘ํ˜•์„ ์œ„ํ•œ GSAP์˜ matchMedia์™€ saveStyle
    ใ…ค



1. gsap.timeline ์„ ํ™œ์šฉํ•œ ๋ผ์šด๋“œ ๋ชจ์…˜

๐Ÿ“‹ ํ™”๋ฉด์„ ์Šคํฌ๋กค ํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ผ์šด๋“œ๊ฐ€ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋ฉด์„œ ํ™”๋ฉด์„ ์ฑ„์šฐ๋Š” ๋ชจ์…˜์„ ๊ตฌํ˜„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์ฒ˜์Œ์—” scale์„ ์‚ฌ์šฉํ•ด ์‚ฌ์ด์ฆˆ๋ฅผ ํ‚ค์› ์œผ๋‚˜ ๋ผ์šด๋“œ์˜ ์œ„์น˜์™€ ๊ฒน์ณ์ง€๋Š” ๋ถ€๋ถ„๋“ค์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด width์™€ padding-bottom์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ๋กœ ์žฌ๊ตฌํ˜„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ—ป๏ธ HTML

<section class="sc_round r_top" aria-label="๋ผ์šด๋“œ ๋””์ž์ธ ์˜์—ญ">
	<div class="round_inner">
        <div class="round first"></div>
        <div class="round second"></div>
        <div class="round third"></div>
        <div class="round four"></div>
        <div class="round fifth"></div>
    </div>
</section>

โ—ป๏ธ CSS

.round_inner {
        position: absolute;
        left: 50%;
        transform: translateX(-50%);
        border-radius: 50%;
        background: #ebebea;
        width: 100%;
        .round {
            position: absolute;
            top: 1%;
            left: 1%;
            width: 98%;
            background: #0a0a0d;
            border-radius: 50%;
            padding-bottom: 98%;
            overflow: hidden;
        }
        .second {
            width: 70%;
            top: 15%;                
            left: 15%;
            background: #ebebea;
            padding: 0 0 70% 0;
            overflow: hidden;
        }
        .third {
            width: 68%;
            top: 16%;
            left: 16%;
            background: #0a0a0d;
            padding: 0 0 68% 0;
            overflow: hidden;
        }
        .four {
            width: 40%;
            top: 30%;
            left: 30%;
            background: #ebebea;
            padding: 0 0 40% 0;
            overflow: hidden;
        }
        .fifth {
            width: 38%;
            top: 31%;
            left: 31%;
            background: #0a0a0d;
            padding: 0 0 38%0;
            overflow: hidden;
        }
    }

โ—ป๏ธ JS

const roundMotion = gsap.timeline({scrollTrigger: {
            trigger:".sc_round.r_top",
            start:"-20% 20%",
            end:"10% 30%",
            pin:true,
            scrub: 1,
        }});
        roundMotion
        .addLabel('d')
        .to(".sc_round.r_top .round_inner", {paddingBottom:"175%", width:"175%"},'d')
        .to(".sc_round.r_top .first",{paddingBottom:"69.9%", width:"69.9%", top:"15.1%", left:"15.1%"},'d')
        .to(".sc_round.r_top .third",{paddingBottom:"39.9%", width:"39.9%", top:"30.1%", left:"30.1%"},'d')
        .to(".sc_round.r_top .fifth",{paddingBottom:"9.9%", width:"9.9%", top:"45.1%", left:"45.1%"},'d')

โœ ์ฝ”๋“œ ๋ถ„์„

  • CSS
    ๋ชจ๋“  ์›์— ๊ณตํ†ต์ ์ธ ์š”์†Œ๋กœ padding-bottom: 98%, border-radius: 50%; ๋“ฑ์„ ์„ค์ •ํ•ด์ฃผ๊ณ , ๊ฐ ์›์„ position, width ๋“ฑ์„ ์žก์•„์ฃผ์–ด ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒน์ณ์žˆ๋Š” ์›์˜ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    ใ…ค
  • JS
    gsap๋ฅผ ํ™œ์šฉํ•ด ํŠน์ • ์ง€์ ๋ถ€ํ„ฐ ์›์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋Š” ๋ชจ์…˜์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ addlabel์†์„ฑ์„ ์ด์šฉํ•ด ์›์ด ๋‹ค๊ฐ™์ด ์ปค์ง€๋„๋ก ํ•˜์˜€๊ณ , ํ™”๋ฉด ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ๋„˜์น˜๋„๋ก .round_inner ์š”์†Œ์—๋Š” 175%์˜ padding-bottom๊ณผ width๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ padding-bottom๊ณผ width์„ ๊ฐ’์„ ๊ฐ™๊ฒŒ ์ฃผ์–ด์•ผ ๋™์ผํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง

๐Ÿ’ก ์Šคํฌ๋กค ํŠธ๋ฆฌ๊ฑฐ๋Š” ์‹œ์ž‘ ์ง€์ (์œ„์น˜) ์ค‘์š”! ํŽ˜์ด์ง€ ์ค‘๊ฐ„์— ์žˆ๋Š” ๊ฐ€๋กœ์Šคํฌ๋กค๋กœ ์ธํ•ด ๋ผ์šด๋“œ ๋ชจ์…˜์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ƒํ™ฉ ์žˆ์—ˆ์Œ.


2.๋ฐ˜์‘ํ˜•์„ ์œ„ํ•œ GSAP์˜ matchMedia์™€ saveStyle

๐Ÿ“ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

  • match media ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
ScrollTrigger.saveStyles(".mobile, .desktop");
ใ…ค
ScrollTrigger.matchMedia({
  // large
  "(min-width: 1025px)": function() {
  },
  // medium
  "(min-width: 768px) and (max-width: 1024px)": function() {
  },
  // small
  "(max-width: 767px)": function() 	
  },
  // all
  "all": function() {
  }
});
  • "all"์€ ๋ฏธ๋””์–ด์ฟผ๋ฆฌ์™€ ์ƒ๊ด€ ์—†์ด ๋ชจ๋‘ ์‹คํ–‰๋จ
  • saveStyles()์€ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ํ•ด๋‹น ์š”์†Œ์˜ css๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ

    ๐Ÿ’ก gsap ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋Š” ์ธ๋ผ์ธ ์Šคํƒ€์ผ ํƒœ๊ทธ๋กœ ์‚ฝ์ž…๋˜๊ธฐ ๋•Œ๋ฌธ์— cssํŒŒ์ผ๋ณด๋‹ค ์šฐ์„  ์ ์šฉ๋œ๋‹ค.
    ๋”ฐ๋ผ์„œ ํ™”๋ฉด์ด ๋ฆฌ์‚ฌ์ด์ฆˆ ๋  ๊ฒฝ์šฐ ๋ฐฉ๊ธˆ ์‹คํ–‰๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋•Œ๋ฌธ์— ์š”์†Œ์˜ ๊ธฐ์กด css๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด saveStyle๋กœ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ง€์›Œ์•ผ ๋ง๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

โ—ป๏ธ JS

ScrollTrigger.saveStyles(".sc_home .group_main,.sc_home");

ScrollTrigger.matchMedia({
    "(min-width: 1300px)": function() {
      
        //hmoe ๋ชจ์…˜
        const homeMotion = gsap.timeline({
            scrollTrigger: {
            trigger:".sc_home",
            start:"0% top",
            end:"70% top",
            scrub: 1,
            },
        
        });
        homeMotion
        .set(".sc_home .group_main", {height:"100vh"})
        .to(".sc_home .group_main",{width:"49%",height:"30%"});
    },
  
    "(max-width: 767px)": function() {
		//..
        //group_bottom ํ”„๋กœ์ ํŠธ stagger
        gsap.to(".sc_work .project_inner", {
            opacity:1,
            y:0,
            stagger: false,
            scrollTrigger: {
                trigger:".sc_work .group_bottom",
                start:"0% 70%",
                end:"25% 60%",
                markers:true,
            }
        });
            
    },
    // all
    "all": function() {
         //..
      	//hmoe ๋ชจ์…˜
        const homeMotion = gsap.timeline({
            scrollTrigger: {
            trigger:".sc_home",
            start:"0% top",
            end:"70% top",
            scrub: 1,
            },
        });
        homeMotion
        .addLabel('a')
        .to(".sc_home .group_main", {width:"49%"},'a')
        .to(".sc_home .group_sub1", {y:"-80%"},'a')
        .to(".sc_home .group_sub1 .home_bg", {opacity:0.4},'a')
        .addLabel('b')
        .fromTo(".sc_home .group_sub2", {y:"30%"},{y:"-30%"},'b-=0.3')
        .to(".sc_home .group_sub2 .home_bg", {opacity:0.4},'b-=0.3')
        .addLabel('c')
        .fromTo(".sc_home .group_sub3", {y:"30%"},{y:"-30%"},'c-=0.3')
        .to(".sc_home .group_sub3 .home_bg", {opacity:0.4},'c-=0.3');

        //group_bottom ํ”„๋กœ์ ํŠธ stagger
        gsap.to(".sc_work .project_inner", {
            opacity:1,
            y:0,
            stagger: true,
            scrollTrigger: {
                trigger:".sc_work .group_bottom",
                start:"0% 70%",
                end:"25% 60%",
                markers:true,
            }
        });
    }
});

โœ ์ฝ”๋“œ ๋ถ„์„

  • ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์—์„  stagger ์†์„ฑ์ด ์ž‘๋™๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด matchMedia()๋ฅผ ํ™œ์šฉํ•ด 768px ์ด์ƒ์˜ ํ™”๋ฉด์—์„œ๋งŒ ๋ชจ์…˜์ด ์ž‘๋™๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • home ๋ถ€๋ถ„์˜ ์Šคํฌ๋กค ๋ชจ์…˜์„ pc์—์„  width๊ฐ’๋งŒ, ๋ชจ๋ฐ”์ผ์—์„  width์™€ height๊ฐ’์„ ์ฃผ๋Š” ๋ฐ˜์‘ํ˜• ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
    .to(".sc_home .group_main", {width:"49%"},'a')
    -> .to(".sc_home .group_main",{width:"49%",height:"30%"});

๐Ÿ“ ์ด๋•Œ ํ™”๋ฉด์„ ๋ฆฌ์‚ฌ์ด์ฆˆํ•˜๋ฉด .group_main์˜ ๊ธฐ์กด css ์‚ฌ์ด์ฆˆ๊ฐ€ ๊นจ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ด ์ƒ๋‹จ์— saveStyles()์„ ์ž‘์„ฑํ•ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.


profile
๐Ÿ“š Coding Notes

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