์ฌ์ดํธ๋ช
: iPad Apple (PCํ, renewal)
์์
๊ธฐ๊ฐ : 23.03.01 ~ 23.03.03 (3์ผ ์์)
๋ผ์ด๋ธ๋ฌ๋ฆฌ : gsap, jquery
์ ํ : PC ์ ์ํ, ๋ฆฌ๋ด์ผ
ํน์ง : gsap๋ฅผ ํ์ฉํด ๋ค์ํ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ๊ตฌํํ ๋์ ์ธ ํ์ด์ง์
๋๋ค.
$(function(){
mainVis = gsap.timeline({
scrollTrigger:{
trigger:".main-visual",
start:"10% 10%",
end : "100% 0%",
scrub : 1 //์คํฌ๋กค ์๋ค๊ฐ๋ค ํ ๋๋ง๋ค ํจ๊ณผ์ฃผ๊ธฐ
},
})
mainVis
.to('.main-visual .text-area > *',{
y: -100, opacity : 0, //y์ถ์ผ๋ก ์ฌ๋ฆฌ๊ธฐ , ํฌ๋ช
ํ๊ฒ
stagger:0.1 //์์ฐจ์ ์ผ๋ก ํจ๊ณผ์ฃผ๊ธฐ
})
- gsap.timeline : ์์ฐจ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ ์ฉ๋ ์ ์๋๋ก ๋ง๋ค์ด ์ค
- scrollTrigger : gsap์์ ํ์๋ ํ๋ฌ๊ทธ์ธ. gsap ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ด์ผ ์ธ ์ ์๋ค.
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/ScrollTrigger.min.js"></script>
- scrub : ์คํฌ๋กค์ ์์๋๋ก ์์ง์ผ ๋์๋ ๋ชจ์ ์ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ
- stagger : text-area์ ์์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ์ฌ์ฉ
๐ ๋ช๊ฐ์ง์ ํค์๋๋ฅผ ๊ฐ์ง๊ณ , ์ฐ์ธก์์๋ถํฐ ์๋์ผ๋ก ๋์๊ฐ๋ ํจ๊ณผ๋ฅผ ์ฃผ์์ต๋๋ค.
<ul class="first-wrap">
<li><span>Magic Keyboard Folio</span></li>
<li><span> iPadOS</span></li>
<li><span>A14 Bionic Chip</span></li>
<li><span>12MP Wide Camera</span></li>
<li><span>Magic Keyboard Folio</span></li>
<li><span> iPadOS</span></li>
<li><span>A14 Bionic Chip</span></li>
<li><span>12MP Wide Camera</span></li>
<li><span>Magic Keyboard Folio</span></li>
<li><span> iPadOS</span></li>
<li><span>A14 Bionic Chip</span></li>
<li><span>12MP Wide Camera</span></li>
<li><span>Magic Keyboard Folio</span></li>
<li><span> iPadOS</span></li>
<li><span>A14 Bionic Chip</span></li>
<li><span>12MP Wide Camera</span></li>
<li><span>Magic Keyboard Folio</span></li>
<li><span> iPadOS</span></li>
<li><span>A14 Bionic Chip</span></li>
<li><span>12MP Wide Camera</span></li>
</ul>
<ul class="last-wrap">
</ul>
/* main-roll */
.main-roll { overflow: hidden; }
.main-roll .group-roll { display: flex; }
.main-roll .group-roll ul {
display: flex; animation: roll 30s linear infinite; }
@keyframes roll {
0% { transform: translateX(0%); }
/* x์ถ์ผ๋ก -100๋งํผ */
100% { transform: translateX(-100%); }
}
- 1๋ฒ ๋ผ์ธ ๊ธธ๊ฒ ๋ง๋ค์ด์ฃผ๊ธฐ (์ฒ์์ ๋์์๋ ํ ์คํธ์ ๊ธธ์ด๊ฐ์ด ๊ธธ์ด์ผํจ)
- 1๋ฒ์ ๋ผ์ธ์ ์๋๋ฉ์ด์ ์ด ๋๋ฌ์๋์ ์ง์ ์ด ์๊น
- 1๋ฒ ๋ผ์ธ๋ง ์๋ค๋ฉด ๋๋์ง์ ์์๋ถํฐ ๋ผ์ธ์ด ๋ณด์ด์ง ์๊ธฐ๋๋ฌธ์
๋ผ์ธ์ ํ ๊ฐ ๋ ๋ง๋ค์ด์ค๋ค.- 1๋ฒ์ ์๋๋ฉ์ด์ ์ด ๋๋ ์์ ์ 2๋ฒ๋ผ์ธ์ ํ ์คํธ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ผ๋ก ๊ณ์ ๋์๊ฐ๋ ์๋๋ฉ์ด์ ์ ๋ง๋ค์ด์ค ์ ์๋ค.
- ์ ์ฒด ์์ญ์ธ
main-roll
์๋ค๊ฐ, ์์ ๋กค๋ค์ด ๋์น์ง ์๋๋กoverflow:hidden
์ ์ค๋ค.@Keyframes
์ผ๋ก ์ผ์ชฝ์ผ๋ก ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์ด ์ค๋ค.- ๊ฐ ํ์ํ ๋กค๋ง์ ๋ง๋ค์ด๋์๋ ์ ๋๋ฉ์ด์ ์ ์ ์ฉ์ํจ๋ค.
- ์ ๋๋ฉ์ด์
infinite
๋ก ๋ฐ๋ณต ์คํํด์ค๋ค.
position:sticky
์คํฌ๋กค/* .main-card css */
.main-card .card-inner { position: relative; height: 350vh; }
.main-card .group-card { height: 100vh; padding: 50px; font-size: 90px; }
.main-card .group-card.card01 { position: sticky; top:0; }
.main-card .group-card.card01 .content-area { background: #f6a1d6; }
.main-card .group-card.card02 { position: sticky; top:4vh; }
.main-card .group-card.card02 .content-area { background: #f9f385; }
.main-card .group-card.card03 { position: sticky; top:8vh; }
.main-card .group-card.card03 .content-area { background: #96c6f5; }
// * main-card
//each(function(index,element) : ํ๋๋ก ์ค์ผ ์ ์๋ ์์ค
$('.main-card .group-card').each(function(index,element){
//๋ณ์๊ฐ ๋จผ์ ์ฝํ์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด๋ฌธ ๋จผ์ ์จ์ฃผ๊ธฐ
op = (index == 2)? 1 : 0.5;
gsap.to(element,{
scrollTrigger:{
trigger:element,
start:"0% 10%",
end : "100% 0%",
scrub : 1
},
opacity: op,
scale : 0.97
})
})
if(index == 2 ){
op = 1;
}else{
op = 0.5;
}
// - ๋ณ์๋ฅผ ๋จผ์ ์ฐ๊ณ ์กฐ๊ฑด์ฐ๊ธฐ
op = (index == 2)? 1 : 0.5;
// if : else
- ์ ์ฒด์์ญ์ ํจ๋ฉ๊ฐ๋ง ์กฐ์ ํด์ค๋ค.
- ์คํฌ๋กคํ๋ฉด์ ์ฌ๋ผ์ฌ ์์ญ์
Position: sticky
๋ก ์คํฌ๋กคํ ๋๋ง๋ค ํด๋น ์์ญ์ผ๋ก ์ฌ๋ผ์ค๋๋ก ์ค์ ํด์ค๋ค..group-card
3๊ฐ๊ฐ ๋ค ํผ์ณ์ง ๋์ด๊ฐ์ ์ ์ฉํด์ฃผ๊ธฐ ์ํด.card-inner
์ ๋์ด๋ฅผ300vh
+sticky
์ ๋ชจ์ ์ ์ฌ์ ์๊ฒ ๋ณด์ด๊ธฐ ์ํด ๋์ด๋ฅผ'350vh'
๋ก ์ค์ class
๋ฅผ ์ด์ฉํด ํฌ๊ฒ div๋ฅผ 3๊ทธ๋ฃน์ผ๋ก ๋๋์๊ณ ,.card-inner
์ 3์นธ
๊ฐ๊ฒฉ์ผ๋กsticky
๋ชจ์ ํจ๊ณผ์ ์์น๋ฅผ ๊ฐ๊ฐ ๋ฌ๋ฆฌ ์ฃผ๊ธฐ ์ํด top์ ๊ฐ์0vh, 4vh, 8vh
๋ก ์ค์
- ๋ฐ๋ณต๋ฌธ์ ์ฐ๋ ์ด์ !
์์ค๊ฐ ์ค๋ณต๋๋ ์ฝ๋๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ์์ฝํ ์ ์๋ค.index
:.group-card
์ ์์ (0-1-2)
๐ ์คํฌ๋กค ํธ๋ฆฌ๊ฑฐ์ pin์ผ๋ก ์๋์ ๋ชฉ์ ์ ๊ฐ์ง ์ ๋๋ฉ์ด์
์ ๊ตฌํํด์ฃผ์๋ค.
ํน์ ์์ญ์ ๋ฉ์ท๋ค๊ฐ ๊ฐ๋ก์คํฌ๋กค๋ก ๋ณ๊ฒฝ
๊ฐ๋ก์คํฌ๋กค ์คํ ํ, ํ ์์ญ์ ์ฌ๋ผ์ง๋ฉด์ ๋ฐฐ๊ฒฝ์ปฌ๋ฌ ๋ณ๊ฒฝ
๋ฉ์ธ๋ด์ฉ ๋๊น์ง ๊ฐ๋ก์คํฌ๋กค ์ ์ง ํ, ๋ค์ ์์ญ์ผ๋ก ์ธ๋ก์คํฌ๋กค ์งํ
// main-overview
//timeline : ์๊ฐ ์์๋๋ก ๊ฐ๊ฐ ์์๋ค ๋ชจ์
์ฃผ๊ธฐ
overview = gsap.timeline({
scrollTrigger:{
trigger:".main-overview .contents_wrap",
start:"0% 0%",
end : "300% 0%",// 300% : ๊ธฐ๋ณธ 100% ์ ์ฃผ๋ฉด ๋ชจ์
์ด ๋๋ฌด ๋นจ๋ฆฌ๋๋๊ธฐ ๋๋ฌธ์ 300%๋ก ๋๋ ค์ค (์คํฌ๋กค 3๋ฐฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ ๋ก ์ค ์ ์์)
scrub : 1,
// pin : ์คํฌ๋กค๋ด๋ฆฌ๋ค๊ฐ ๊ฐ์ด๋ฐ์์ ๊ณ ์ ํ๊ณ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์ด๊ฐ, ( = sticky)
pin : true
},
})
overview
// addLabel : ๋์์ ํจ๊ณผ ์ฃผ๊ธฐ ์ํด labeling
.addLabel('a')
.to('.main-overview .container_wrap',{
xPercent:-50, // ๋ดํ๋ฉด์ ์ ๋ฐ๋งํผ ์ผ์ชฝ์ผ๋ก ์ด๋
yPercent:-25 // ์๋ก -25๋งํผ ์ด๋์์ผ์ฃผ๊ธฐ
},'a')
.to('.main-overview',{
background : '#444' // ์์น ์ด๋๊ณผ ๋์์ ๋ฐฐ๊ฒฝ์ ๋ณํ์ฃผ๊ธฐ
},'a')
.to('.main-overview .column-left, .main-overview .desc-wrap',{
opacity : 0
},'a') // ์ผ์ชฝ ์์ญ๊ณผ ์ค๋ช
๊ธ ์ฌ๋ผ์ง๊ฒ ํ๊ธฐ
// addlable์ด ๋๋๊ณ ๋ชจ์
์คํ๋
.to('.main-overview .container_wrap .slide-list',{
xPercent: -50, //๋ด ์์ญ์์ ์ ๋ฐ๋งํผ ์ผ์ชฝ์ผ๋ก ์ด๋
delay : 1, // ์คํฌ๋กค ์ ๊น ๋ฉ์ถค
})
.to('.main-overview',{
background : '#fff'
})
// main-overview
overview = gsap.timeline({
defaults:{
ease: "none", // <-- ์ด๊ฑธ๋ฃ์ด์ผ ํก์คํฌ๋กค ์ขํ๊ฐ ์๋ฐ๋ฆผ!
},
scrollTrigger:{
trigger:".main-overview .group-contents",
start:"0% 0%",
end : "300%",
scrub : 1,
invalidateOnRefresh: true, //ํ๋ฉด ๋ฆฌ์ฌ์ด์ง
pin : true,
},
})
overview
.addLabel('a')
.to('.main-overview .container-area .left-wrap',{
xPercent:-100,
yPercent:-50
},'a')
.to('.main-overview .container-area .right-wrap',{
x:-$('.main-overview .container-area .left-wrap').outerWidth() //left-wrap์ outerWidth๋งํผ x์ถ์ผ๋ก ๋นผ์ฃผ์๋ค.
yPercent:-25
// // xPercent:-100,
// // x:-700,
},'a')
.to('.main-overview .container-area .slide-box',{
xPercent: -100,
x:function(){
return window.innerWidth; // ์ฐฝ์ ํฌ๊ธฐ๋งํผ๋ ์ด๋์์ผ์ฃผ๊ธฐ
},
// delay : 1,
})
- ์ ์ฒด ์์ญ์์ ๊ณ ์ ๋์ด์ผํ ๋ถ๋ถ์ ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ค๋ค.
- ํด๋น ํ๊ทธ
.main-overview .group-contents
๋ฅผ ๊ธฐ์ค์ผ๋กtimeline
scrollTrigger
๋ฅผ ์ ์ฉ์ํจ๋ค.- ๋ง๋ค์ด์ง ํ์๋ผ์ธ์
overview
๋ผ๋ ์์๋ก ๋ด๋๋ค.overview
์ ๊ธฐ์ค์ผ๋กgsap.to
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์์ญ๋ง๋ค์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉ์ํจ๋ค.
window.innerWidth;
๋ฅผ ๊ทธ๋ฅ ์ฐ๋ฉด ์๋๊ณ ํจ์๋ฅผ ์คํํด์ ์จ์ผํจfunction(){ return window.innerWidth;
.outerWidth()
: ์์์ width ๊ฐ๊ณผ padding ๊ฐ๊ณผ border ๊ฐ์ ๋ํ ๊ฐ.
<div class="icons_area">
<div class="icon icon-01" data-y="150">
<img src="./assets/images/icon/floationg-icon01.png" alt>
</div>
<div class="icon icon-02" data-y="-150">
<img src="./assets/images/icon/floationg-icon02.png" alt>
</div>
<div class="icon icon-03" data-y="150">
<img src="./assets/images/icon/floationg-icon03.png" alt>
</div>
<div class="icon icon-04" data-y="-150">
<img src="./assets/images/icon/floationg-icon04.png" alt>
</div>
<div class="icon icon-05" data-y="150">
<img src="./assets/images/icon/floationg-icon05.png" alt>
</div>
<div class="icon icon-06" data-y="-150">
<img src="./assets/images/icon/floationg-icon06.png" alt>
</div>
<div class="icon icon-07" data-y="150">
<img src="./assets/images/icon/floationg-icon07.png" alt>
</div>
<div class="icon icon-08" data-y="-150">
<img src="./assets/images/icon/floationg-icon08.png" alt>
</div>
</div>
// main-floating
$('.main-floating .group-icon .icon').each(function(index,element){
gsap.to(element,{
scrollTrigger:{
trigger:'.main-floating',
start : "0% 100%",
end : "100% 0%",
scrub : 1,
},
y:element.dataset.y
})
})
- ์คํฌ๋กค ์์ ๊ฐ๊ฐ์ ์์ด์ฝ์ด ์ด๋ค ๊ฒ์ ์๋ก, ์ด๋ค ๊ฒ์ ์๋๋ก ์ด๋๋๋ ๋ชจ์ ์ ์ฃผ๊ธฐ ์ํด ๊ฐ๊ฐ์ element ์์์ ๋ฐ์ดํฐ๊ฐ์ ๋ค๋ฅด๊ฒ ์ฃผ์ ํ์์ต๋๋ค.
data-y="150"
- index :
.group-icon
์ ์์- element :
.group-icon
๊ฐ๊ฐ์ ์์y:element.dataset.y
: ๊ฐ๊ฐ ์์์ data y๊ฐ๋งํผ y๊ฐ์ ์์ง์ธ๋ค.