728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฒ์ฒํ ์คํฌ๋กคํ๋ฉด์ GIF ์บก์ฒ๋ฅผ ํด๋ณด์๋ค.
- ๊ฐ์ธ์ ์ผ๋ก ์๋์ ์์นํ๋ ๋ค์ ์ฌ์ง์ด ์ฌ๋ผ์ค๋ฉด์ ๊ธฐ์กด์ ์ฌ์ง์ด ํ๋ ค์ง๋ฉด์ ์์์ง๋ค ๋ค์ ์ฌ์ง์ ๊ฐ๋ ค์ง๋๋ฐ, ์ด ํจ๊ณผ๊ฐ ๋๋ฌด ์์๋ฐ ๋ง๋๋๋ฐ ๊ฝค๋ ํ๋ค์๋ ๊ฑฐ ๊ฐ๋ค.
๐ HTML
<div class="card-background">
<div class="card-box">
<img src="./img/card1.png">
</div>
<div class="card-box">
<img src="./img/card2.png">
</div>
<div class="card-box">
<img src="./img/card3.png">
</div>
</div>
- ์ผ๋จ ์นด๋์ด๋ฏธ์ง๋ฅผ 3๊ฐ ์ค๋นํด์, card-box ํด๋์ค์ ๊ฐ๊ฐ ๋ด์์ค๋ค.
๐ CSS
.card-background {
height: 3000px;
margin-top: 370px;
}
.card-box img {
display: block;
margin: auto;
max-width: 80%;
}
.card-box {
position: sticky;
top: 370px;
margin-top: 370px;
transition: all 0.3s;
}
- ์คํฌ๋กค์ ๊ฝค ํด์ผํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ฐฐ๊ฒฝ์ ๋์ด๋ 3000px ์ ๋๋ก ์ก์์ฃผ๊ณ ํ๋ฉด ๊ฐ์ด๋ฐ์ฏค ๋์ค๋๋ก margin-top ์ ์ ๋นํ ๊ฐ์ ๋ฃ์ด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ card-box ํด๋์ค์ position : sticky ์์ฑ์ ๋ฃ์ด์ค ํ, top ์ back-ground ์ margin-top ์ ๊ฐ๊ณผ ์ผ์นํ๋๋ก ํด์ฃผ์๋ค. (์คํฌ๋กค์ ๋๋์ ๋ ์จ์ ํ ์ด๋ฏธ์ง๊ฐ ๊ฒน์ณ์ง๋๋ก!)
- ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์ ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์์ ๋ณด์ด์ง ์๋๋ก margin-top ๋ ๋ฃ์ด์ฃผ์๋ค. css ๋ฅผ ๊ตฌ์ฑํ ๋ margin ๊ณผ margin-top ์ ๊ฐ์ ์ ๋นํ ๋ง์ถฐ์ฃผ๋ ๊ฒ ์ค์ํ๋ค. (๊ทธ๋์ผ ํ๋ฉด์์์์ ์์น๊ฐ ์ ๋นํ๊ณ ๋ค์ ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์์ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์..)
- ๊ทธ ๋ค์์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์์ํ ์ ๋๋ฉ์ด์ ํจ๊ณผ๊ฐ ์๊ธฐ๋๋ก transition ์์ฑ๋ ๋ฃ์ด์ฃผ์๋ค.
๐ JavaScript
$(window).scroll(function(){
var h = $(window).scrollTop(); // ์คํฌ๋กค ์์น
// 1. opacity ์กฐ์
// 700~1000๊น์ง ์คํฌ๋กค๋ฐ๋ฅผ ๋ด๋ฆฌ๋ฉด,
// ์ฒซ๋ฒ์งธ ์นด๋์ opacity ๋ฅผ 1~0 ์ผ๋ก ์์ํ ๋ณ๊ฒฝํ๋ค.
var y1 = (1/-300) * h + (1000/300);
var y2 = (1/-300) * h + (1950/300);
$('.card-box').eq(0).css('opacity', y1);
$('.card-box').eq(1).css('opacity', y2);
// 2. scale ์กฐ์
// 700~1000๊น์ง ์คํฌ๋กค๋ฐ๋ฅผ ๋ด๋ฆฌ๋ฉด,
// ์ฒซ๋ฒ์งธ ์นด๋์ scale ๋ฅผ 1~0.8 ์ผ๋ก ์์ํ ๋ณ๊ฒฝํ๋ค.
var s1 = (-2/3000) * h + (44/30);
var s2 = (-2/3000) * h + (630/300);
if(h >= 700 && h <= 1000) {
$('.card-box').eq(0).css('transform', `scale(${s1})`);
} else{
$('.card-box').eq(0).css('transform', `scale(1)`);
if(h >= 1650 && h <= 1950){
$('.card-box').eq(1).css('transform', `scale(${s2})`);
} else {
$('.card-box').eq(1).css('transform', `scale(1)`);
}
}
})
- JavaScript ์ฝ๋๋ฅผ ์ง๋ ๋ถ๋ถ์์ ์ ๊น ์ํ์๊ฐ์ด ๋์๋ค.
- ๋จผ์ , ์ด๋ฏธ์ง๊ฐ ํน์ ์์น์ ์์ ๋ ํ๋ ค์ง๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์คํฌ๋กค ์์น๊ฐ ์ด๋์ฏค ์์ ๋ opacity ๊ฐ 1์ด๊ณ , ์ด๋์ฏค ์์ ๋ 0์ด ๋๋์ง ๋๋ต์ ์ผ๋ก ์ ํด์ผ ํ๋ค.
(์ด ๋, ์ฝ์์๋ค๊ฐ scrollY ๋ $(window).scrollTop() ์ ์ฐ์ด๋ณด๋ฉด ๋์ถฉ ์์นํ์ ์ด ๊ฐ๋ฅํ๋ค.) - ๋ด๊ฐ ์ ํ ์์น๋ ์ฒซ๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆด ๋์๋ 700~1000, ๋๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆด ๋์๋ 1650~1950 ์ด์๋ค.
- ์ด์ ์ด ๊ฐ๋ค์ ์ด์ฉํด์ 1์ฐจ ํจ์ ๊ณต์(y=ax+b)์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค. (...์ด๊ฒ๊น์ง๋ ์ฌ๊ธฐ์ ์ค๋ช ์ ์ ๊ธด ํ๋ค๋ค.)
- ํจ์๊ฐ ์์ฑ๋๋ฉด jQuery ๋ฌธ๋ฒ์ ์ด์ฉํด์, ์คํฌ๋กค์ ๊ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ opacity ๊ฐ์ css ์ ์ ์ฉ๋๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
- ์คํฌ๋กค ์์น๊ฐ ์ด๋์ฏค ์์ ๋ opacity ๊ฐ 1์ด๊ณ , ์ด๋์ฏค ์์ ๋ 0์ด ๋๋์ง ๋๋ต์ ์ผ๋ก ์ ํด์ผ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ํ๋ ค์ง๋ ๋์์ ์ ์ ์์์ง๊ฒ ํ๊ณ ์ถ์๋๋ฐ ๋ฐฉ๋ฒ์ ํ๋ ค์ง๊ฒ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ฐ if-else ๋ฌธ์ด ์ข ๋ณต์กํ๋ค. (๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ ๋๋ฌด ํ๋ค์๋ค ใ
ใ
)
- ๊ธฐ๋ณธ์ ์ธ ํฌ๊ธฐ๊ฐ 1์ด๋ผ๋ฉด ์ต์ข ์ ์ผ๋ก ์์์ง ํฌ๊ธฐ๋ 0.8๋ก ์ ํ๊ณ , 1์ฐจ ํจ์ ๊ณต์์ ๋ง๋ค์ด์ฃผ์๋ค.
- ํจ์๊ฐ ์์ฑ๋๋ฉด jQuery ๋ฌธ๋ฒ์ ์ด์ฉํด์, ์คํฌ๋กค์ ๊ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ transform ์์ฑ์ scale ๊ฐ์ css ์ ์ ์ฉํด์ฃผ๋ฉด ๋๋ค.
- ๋ค๋ง, ์ด ๋ถ๋ถ์ด opacity ์ ๋ฌ๋ฆฌ if-else ๋ฌธ์ด ์ ์ฉ๋ ์ด์ ๋ opactiy ์ ๊ฒฝ์ฐ ์์ฑ๊ฐ์ด 0~1 ๋ก ํ์ ์ ์ด๋ผ ์ด ๊ฐ ์ฌ์ด๋ฅผ ๋ฒ์ด๋๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
- ๋ฐ๋ฉด, scale ์ ๊ฒฝ์ฐ์๋ 1, 2, 3, ๋ฑ๋ฑ ๊ฐ์ ๋ฒ์๊ฐ ํจ์ฌ ๋๊ณ ์ด์ ๋ง์ถฐ ๋ฐ์์ด ๋์ด๋ฒ๋ฆฐ๋ค.
- ๊ทธ๋์ ์ฒ์ ์๊ฐํ๋ ๊ฑด while ๋ฌธ์ ์ฌ์ฉํ์ฌ scale ์ ๋ฒ์๋ฅผ 0.8~1 ๋ก ์ง์ ํด์ฃผ๋ ๊ฒ์ด์๋๋ฐ ์ด ๋ฐฉ๋ฒ๋ณด๋ค๋ if-else ๋ฌธ์ด ์ฝ๋๋ฅผ ๋ ์ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
- ๊ทธ๋์ ์คํฌ๋กค์ ์์น๊ฐ 700~1000 ์ผ ๋๋ ์ฒซ๋ฒ์งธ ์นด๋ ์ด๋ฏธ์ง๋ง scale ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
- ์ด์ธ์ ์คํฌ๋กค ์์น์ผ ๋์๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋๋๋๋ฐ,
- ์ฒซ๋ฒ์งธ ์นด๋ ์ด๋ฏธ์ง๋ ํฌ๊ธฐ๊ฐ ๋ ์ปค์ง๊ฑฐ๋ ์์์ง์ง ์๊ฒ scale ๊ฐ์ 1๋ก ๊ณ ์ ํ๋ค. (๊ณ ์ ํด๋์ง ์์ผ๋ฉด ์คํฌ๋กคํ ๋ ํฌ๊ธฐ๊ฐ 0.8~1 ์ ๋ฒ์ด๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฏ๋ก..)
- ๋๋ฒ์งธ ์นด๋ ์ด๋ฏธ์ง๋ ์คํฌ๋กค ์์น๊ฐ 1650~1950 ์ผ ๋ scale ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ , ๊ทธ ์ด์ธ์ ๊ฒฝ์ฐ์๋ ์ฒซ๋ฒ์งธ ์นด๋ ์ด๋ฏธ์ง์ฒ๋ผ ํฌ๊ธฐ๊ฐ ๋ ์ปค์ง๊ฑฐ๋ ์์์ง์ง ์๊ฒ scale ๊ฐ์ 1๋ก ๊ณ ์ ํ๋ค.
- ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๋ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ค๊ฐ ์ฌ๋ ธ์ ๋์๋ ์ด์ํ๊ฒ ํฌ๊ธฐ๊ฐ ๋ฐ๋๋ ํ์์ด ์์ด์ก๋ค.
728x90
๋ฐ์ํ