์ฌ์ดํธ๋ช
: DNA Projecten ๊ณต์ ํํ์ด์ง
์์
๊ธฐ๊ฐ: 7์ผ ์์
๋ผ์ด๋ธ๋ฌ๋ฆฌ: jquery, gsap
์ ํ: ๋ฐ์ํ, ํด๋ก ์ฝ๋ฉ
ํน์ง: ๋ชจ๋ฐ์ผ, ํ๋ธ๋ฆฟ, PC 3๊ฐ์ง ๋ฒ์ ์ผ๋ก ์ ์ํ ๋ฐ์ํ ์น์ฌ์ดํธ์
๋๋ค.
gsap.timeline
์ ํ์ฉํ ๋ผ์ด๋ ๋ชจ์
GSAP์ matchMedia์ saveStyle
๐ ํ๋ฉด์ ์คํฌ๋กค ํ๋ฉด ์ฌ๋ฌ๊ฐ์ ๋ผ์ด๋๊ฐ ์ค์ฌ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋ฉด์ ํ๋ฉด์ ์ฑ์ฐ๋ ๋ชจ์
์ ๊ตฌํํด ๋ณด์์ต๋๋ค.
์ฒ์์ scale
์ ์ฌ์ฉํด ์ฌ์ด์ฆ๋ฅผ ํค์ ์ผ๋ ๋ผ์ด๋์ ์์น์ ๊ฒน์ณ์ง๋ ๋ถ๋ถ๋ค์ ์ค๋ฅ๋ก ์ธํด width์ padding-bottom
์ ํ์ฉํ ์ฝ๋๋ก ์ฌ๊ตฌํ ํ์์ต๋๋ค.
<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>
.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;
}
}
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์ ๊ฐ์ ๊ฐ๊ฒ ์ฃผ์ด์ผ ๋์ผํ ๊ฐ๊ฒฉ์ผ๋ก ์ฌ์ด์ฆ๊ฐ ์ปค์ง
๐ก ์คํฌ๋กค ํธ๋ฆฌ๊ฑฐ๋ ์์ ์ง์ (์์น) ์ค์! ํ์ด์ง ์ค๊ฐ์ ์๋ ๊ฐ๋ก์คํฌ๋กค๋ก ์ธํด ๋ผ์ด๋ ๋ชจ์
์ ์ํฅ์ ๋ฐ๋ ์ํฉ ์์์.
- 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"
์ ๋ฏธ๋์ด์ฟผ๋ฆฌ์ ์๊ด ์์ด ๋ชจ๋ ์คํ๋จ๐ก gsap ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ ์ธ๋ผ์ธ ์คํ์ผ ํ๊ทธ๋ก ์ฝ์ ๋๊ธฐ ๋๋ฌธ์ cssํ์ผ๋ณด๋ค ์ฐ์ ์ ์ฉ๋๋ค.
saveStyles()
์ ํ์ด์ง๊ฐ ๋ก๋๋๊ณ ํด๋น ์์์ css๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฅ
๋ฐ๋ผ์ ํ๋ฉด์ด ๋ฆฌ์ฌ์ด์ฆ ๋ ๊ฒฝ์ฐ ๋ฐฉ๊ธ ์คํ๋ ์ ๋๋ฉ์ด์ ๋๋ฌธ์ ์์์ ๊ธฐ์กด css๊ฐ ๊นจ์ง ์ ์์ด saveStyle๋ก ์ธ๋ผ์ธ ์คํ์ผ์ ์ง์์ผ ๋ง๊ฐ์ง์ง ์๋๋ค.
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()์ ์์ฑํด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.