๐ฑ ํ๋ด๋ ์ค ํจ๊ณผ : ํ ์คํธ ํจ๊ณผ ๐ฑ
ํ๋ด๋์ค(parallax)๋ ์๋ฏธ๋ก ์ฌ์ฉ์๊ฐ ์คํฌ๋กค๋ง์ ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ(๋ฐฐ๊ฒฝ๊ณผ ์์๋ง๋ค ์๋ ๋ฐ ํฌ๊ธฐ์ ์ฐจ์ด๋ฅผ ์ฃผ์ด ์
์ฒด์ ์ผ๋ก ๋๊ปด์ง๊ฒ ํ๋ ํจ๊ณผ ๋ฑ)๋ฅผ ๋งํฉ๋๋ค.
์ด๋ฒ ์๊ฐ์๋ ์คํฌ๋กค์ ๋ด๋ฆด ๋ ํ
์คํธ๋ฅผ ์ชผ๊ฐ์ด ๊ฐ๊ฐ ํ๋์ ์์๋ก ๋ง๋ค์ด ์ค ๋ค css์ ๋๋ ์ด ์์ฑ์ ํตํด ๊ธ์จ๊ฐ ํ๋์ฉ ์์ง์ด๋๋ก ์ค์ตํด๋ณด๊ฒ ์ต๋๋ค! ๐ซ ๐ซ ๐ซ
#1. HTML / CSS ์ค์ ํ๊ธฐ
โ๏ธ HTML ๋ณด๊ธฐ
<main id="parallax__cont">
<div id="contents">
<section id="section1" class="content__item">
<span class="content__item__num">01</span>
<h1 class="content__item__title">section1</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
๋ฏธ๋๋ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ๋๊ฐ์ ๋ฌ๋ ค ์๋ค.
</p>
</section>
<!-- //section1 -->
<section id="section2" class="content__item">
<span class="content__item__num">02</span>
<h1 class="content__item__title">section2</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
์ด์ ๋ก ๋์๊ฐ ์ ์๋ค. ์๋ํ๋ฉด ๋๋ ์ด์ ์๋ ๋ค๋ฅธ ์ฌ๋์ด ๋์๊ธฐ
๋๋ฌธ์ด๋ค.
</p>
</section>
<!-- //section2 -->
<section id="section3" class="content__item">
<span class="content__item__num">03</span>
<h1 class="content__item__title">section3</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
์ธ์ ๋ ํ์ฌ์ ์ง์คํ ์ ์๋ค๋ฉด ํ๋ณตํ ๊ฒ์ด๋ค.
</p>
</section>
<!-- //section3 -->
<section id="section4" class="content__item">
<span class="content__item__num">04</span>
<h1 class="content__item__title">section4</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
๋จผ์ ํ ๊ฝ์ ๋จผ์ ์ง๋ค ๋จ๋ณด๋ค ๋จผ์ ๊ณต์ ์ธ์ฐ๋ ค๊ณ ์กฐ๊ธํ ์๋๊ฒ์ด
์๋๋ค.
</p>
</section>
<!-- //section4 -->
<section id="section5" class="content__item">
<span class="content__item__num">05</span>
<h1 class="content__item__title">section5</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
์ข์ ์ฑ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ํ ๊ฑธ์ ํ ๊ฑธ์์ด ํ์ฐจ๊ณ ์ถฉ์คํ์ง ์์ผ๋ฉด ์
๋๋ค.
</p>
</section>
<!-- //section5 -->
<section id="section6" class="content__item">
<span class="content__item__num">06</span>
<h1 class="content__item__title">section6</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
์ฑ๊ณต์ ๋น๊ฒฐ์ ๋จ ํ ๊ฐ์ง, ์ํ ์ ์๋ ์ผ์ ๊ด์ ์ผ๋ก ์ง์คํ๋
๊ฒ์ด๋ค.
</p>
</section>
<!-- //section6 -->
<section id="section7" class="content__item">
<span class="content__item__num">07</span>
<h1 class="content__item__title">section7</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
๊ฟ์ ๊ณ์ ๊ฐ์งํ๊ณ ์์ผ๋ฉด ๋ฐ๋์ ์คํํ ๋๊ฐ ์จ๋ค.
</p>
</section>
<!-- //section7 -->
<section id="section8" class="content__item">
<span class="content__item__num">08</span>
<h1 class="content__item__title">section8</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
ํํ ์ฌ๋๋ค์ ๊ธฐํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง๋ง ๊ธฐํ๋ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ๋์๊ฒ ์กํ์ง
์๋ ๋ฒ์ด๋ค.
</p>
</section>
<!-- //section8 -->
<section id="section9" class="content__item">
<span class="content__item__num">09</span>
<h1 class="content__item__title">section9</h1>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">
์ด๋ฏธ๋๋๋ฒ๋ฆฐ ์ผ์ ํํํ๊ธฐ ๋ณด๋ค๋ ํ๊ณ ์ถ์๋ ์ผ๋ค์ ํ์ง๋ชปํ ๊ฒ์
ํํํ๋ผ.
</p>
</section>
<!-- //section9 -->
</div>
</main>
<!-- //main -->
<aside id="parallax__info">
<div class="scroll">scrollTop : <span>0</span>px</div>
</aside>
<!-- //parallax__info -->
html์ ๋ฉ๋ด, ์น์
, ์น์
์ ๋ค์ด๊ฐ ์ฝํ
์ธ (์ด๋ฏธ์ง์ ํ
์คํธ)๋ฑ์ ๋งํฌ์
ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ด ๋ ์น์
์ ๋ค์ด๊ฐ๋ ์ฝํ
์ธ ๋ค์๊ฒ ์ ํ์๋ค์ ๋ถ์ฌํ์ฌ ์คํฌ๋ฆฝํธ์ ์คํ์ผ์ ์ฃผ๋ ๋ฐ ์ด๋ ค์์ด ์๋๋ก ํฉ๋๋ค:)
โ๏ธ CSS ๋ณด๊ธฐ
/* option : ์ ๋๋ฉ์ด์
๋์ ์ค์ ๋ง ํด์ฃผ๊ณ ๋๋ ์ด ์ค์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ์ ๋๋ฉ์ด์
์ฃผ๊ธฐ */
.split span {
opacity: 0;
transform: translateY(50px);
transition: all 0.3s cubic-bezier(0, 0.71, 0.11, 1.66);
display: inline-block;
min-width: 1vw;
}
.split span.show {
opacity: 1;
transform: translateY(0);
}
/* option : ๋
ธ๊ฐ๋ค ์ ๋๋ฉ์ด์
์์
: ํ
์คํธ๊ฐ ์ชผ๊ฐ์ด์ง ๋งํผ :nth-child๋ก ๊ฐ๊ฐ 50ms์ฉ ๋๋ ์ด ์ค์ ํด์ฃผ๊ธฐ. */
/* .split span {
opacity: 0;
transform: translateY(50px);
transition: all 0.3s cubic-bezier(0, 0.71, 0.11, 1.66);
display: inline-block;
min-width: 1vw;
}
.split.show span {
opacity: 1;
transform: translateY(0);
} */
/* .split span:nth-child(1) {
transition-delay: 100ms;
}
.split span:nth-child(2) {
transition-delay: 150ms;
}
.split span:nth-child(3) {
transition-delay: 200ms;
}
.split span:nth-child(4) {
transition-delay: 250ms;
}
.split span:nth-child(5) {
transition-delay: 300ms;
}
.split span:nth-child(6) {
transition-delay: 350ms;
}
.split span:nth-child(7) {
transition-delay: 400ms;
}
.split span:nth-child(8) {
transition-delay: 450ms;
}
.split span:nth-child(9) {
transition-delay: 500ms;
}
.split span:nth-child(10) {
transition-delay: 550ms;
}
.split span:nth-child(11) {
transition-delay: 600ms;
}
.split span:nth-child(12) {
transition-delay: 650ms;
}
.split span:nth-child(13) {
transition-delay: 700ms;
}
.split span:nth-child(14) {
transition-delay: 750ms;
}
.split span:nth-child(15) {
transition-delay:800ms;
}
.split span:nth-child(16) {
transition-delay: 850ms;
}
.split span:nth-child(17) {
transition-delay: 900ms;
}
.split span:nth-child(18) {
transition-delay: 950ms;
}
.split span:nth-child(19) {
transition-delay: 1000ms;
}
.split span:nth-child(20) {
transition-delay: 1050ms;
}
.split span:nth-child(21) {
transition-delay: 1100ms;
}
.split span:nth-child(22) {
transition-delay: 1150ms;
}
.split span:nth-child(23) {
transition-delay: 1200ms;
}
.split span:nth-child(24) {
transition-delay: 1250ms;
}
.split span:nth-child(25) {
transition-delay: 1300ms;
}
.split span:nth-child(26) {
transition-delay: 1350ms;
}
.split span:nth-child(27) {
transition-delay: 1400ms;
}
.split span:nth-child(28) {
transition-delay: 1450ms;
}
.split span:nth-child(29) {
transition-delay: 1500ms;
}
.split span:nth-child(30) {
transition-delay: 1550ms;
}
.split span:nth-child(31) {
transition-delay: 1600ms;
}
.split span:nth-child(32) {
transition-delay: 1650ms;
}
.split span:nth-child(33) {
transition-delay: 1700ms;
}
.split span:nth-child(34) {
transition-delay: 1750ms;
}
.split span:nth-child(35) {
transition-delay: 1800ms;
}
.split span:nth-child(36) {
transition-delay: 1850ms;
}
.split span:nth-child(37) {
transition-delay: 1900ms;
}
.split span:nth-child(38) {
transition-delay: 1950ms;
}
.split span:nth-child(39) {
transition-delay: 2000ms;
}
.split span:nth-child(40) {
transition-delay: 2050ms;
}
.split span:nth-child(41) {
transition-delay: 2100ms;
}
.split span:nth-child(42) {
transition-delay: 2150ms;
}
.split span:nth-child(43) {
transition-delay: 2200ms;
} */
CSS ์์ฑ์ ํ๋ด๋ ์ค05๋ฒ๊ณผ ๋๊ฐ์ต๋๋ค! ์์ CSS๋ง ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์คํฌ๋ฆฝํธ๋ก ๋๋ ์ด๋ฅผ ์ค์ ํ ์ ์ ๋๋ฉ์ด์
์ด ์๋ํ ์ ์๋๋ก CSS๋ก ๋์ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ์๋ฉด ๋ฉ๋๋ค.
๋ํ ์คํฌ๋ฆฝํธ๋ก span์ ์ ํํ๊ธฐ ๋๋ฌธ์ showํด๋์ค์ ์์น๋ฅผ span์์ผ๋ก ์ด๋์์ผ์ค๋๋ค.
#2. JAVASCRIPT : ์คํฌ๋ฆฝํธ๋ก ํ๋ด๋์ค ํจ๊ณผ ์ฃผ๊ธฐ
์ค๋ ์คํฌ๋ฆฝํธ์์๋ forEach๋ฐ๋ณต๋ฌธ์์ ๋ฌธ์์ด ๋ฉ์๋๋ฅผ ํตํด ํ
์คํธ๋ฅผ ๊ฐ๊ฐ ํ๋์ ์์๋ก ์ชผ๊ฐ์์ต๋๋ค. ๋ํ ์ชผ๊ฐ์ด์ง ํ
์คํธ์๊ฒ ๊ฐ๊ฐ ๋๋ ์ด๋ฅผ ์ค์ ํ์ฌ ์คํฌ๋กค์ด ๋ด๋ ค๊ฐ ๋ ๊ธ์จ๊ฐ ํ๋์ฉ ๋ํ๋๋๋ก ์ค์ ํ์์ต๋๋ค.
๊ทธ๋ผ ์ฃผ์๊ณผ ํจ๊ป ์ ์ฒด์ ์ธ ํ๋ฆ์ ์ดํด ๋ด
์๋ค!
๐ก ์ ์ฒด ์คํฌ๋ฆฝํธ ๋ณด๊ธฐ
//๊ธ์จ ์ชผ๊ฐ๊ธฐ - ํ ์น์
์ ํ
์คํธ๋ง ์ชผ๊ฐ๊ธฐ
// let text = document.querySelector("#section1 .content__item__desc"); //์ฒซ๋ฒ์งธ ํ
์คํธ
// let splitText = text.innerText;
// //๋ฌธ์์ด ๊ฐ์ฒด ์ฐธ๊ณ
// let splitWrap = splitText.split('').join('</span><span>');
// text.innerHTML = splitWrap = "<span>" + splitWrap + "</span>";
//๊ธ์จ ์ชผ๊ฐ๊ธฐ (์ฌ๋ฌ๊ฐ : forEach๋ฌธ ์ด์ฉ ์ฟผ๋ฆฌ All)
// let text = document.querySelectorAll("#contents .content__item__desc");
// text.forEach(el => {
// let splitText = el.innerText;
// let splitWrap = splitText.split('').join('</span><span>');
// el.innerHTML = splitWrap = "<span>" + splitWrap + "</span>";
// });
//01
//๊ธ์จ ์ชผ๊ฐ๊ธฐ ๋ค์ค : ์ชผ๊ฐ๊ณ ์ถ์ ์์์ ํด๋์ค๋ฅผ ์ถ๊ฐ ์์ผ ๊ทธ ํด๋์ค๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์จ๋ค.
//๊ทธ ๋ค ๋ฌธ์์ด ๋ฉ์๋ split์ ํตํด ํ
์คํธ๋ฅผ ํ๋์ฉ ์ชผ๊ฐ ์ฃผ๊ณ join()์ ์ด์ฉํ์ฌ ๊ฐ๊ฐ spanํ๊ทธ๋ฅผ ๊ฐ์ธ์ค๋ค.(์ด๋ ๋ซ๋ ํ๊ทธ์ ์ฌ๋ ํ๊ทธ๊ฐ ๋ฐ๋๋ก ๋๋ฏ๋ก join์์๋ฅผ ๋ฐ๋๋ก ์จ์ค๋ค.)
//์ชผ๊ฐฐ์ ๋ ์ ๊ทผ์ฑ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด ๋ฉ์๋์ธ join()์ผ๋ก ๋ฃ์ด์ค spanํ๊ทธ ์์ aria-hidden='true' ์์ฑ์ ๋ฃ์ด ์จ๊ฒจ์ค๋ค.(์คํฌ๋ฆฐ ๋ฆฌ๋๊ธฐ์๋ง ์์ฝํ.)
document.querySelectorAll(".split").forEach(text => {
let splitText = text.innerText;
let splitWrap = splitText.split('').join("</span><span aria-hidden='true'>");
//๊ฐ์ฅ ์ ๋ถ๋ถ๊ณผ ๋ท๋ถ๋ถ์๋ join์ด ๋จนํ์ง ์์ผ๋ฏ๋ก ๋ฐ๋ก ๋ณ์ ์์ ํ
์คํธ๋ฅผ ์ถ๊ฐ์ํจ๋ค.
splitWrap = "<span aria-hidden='true'>" + splitWrap + "</span>";
//์์ ๋ฐ๋ ๋ณ์ ๊ฐ์ ๋ค์ ์ ์ฅ์ํจ๋ค.
text.innerHTML = splitWrap;
//์์ ์จ๊ธด ํ
์คํธ๋ฅผ ๋ฆฌ๋๊ธฐ์ ์ฝํ๊ธฐ ํ๊ธฐ ์ํด aria-label ์์ฑ์ ๋ถ์ฌ์ค๋ค.
text.setAttribute("aria-label", splitText);
// console.log(splitText);
});
//02
//์คํฌ๋กค ๊ฐ ๊ตฌํ๊ณ ์คํฌ๋กค ์์ง์ผ ๋ ์ ๋๋ฉ์ด์
๊ตฌํํ๊ธฐ.
function scroll() {
let scrollTop = window.scrollY;
document.querySelector("#parallax__info .scroll").innerText = Math.round(scrollTop);
//CSS ์คํ์ผ ์ค์ ์ ์ํ ํด๋์ค ์ถ๊ฐ ์คํฌ๋ฆฝํธ. (๋
ธ๊ฐ๋ค ver. : CSS๋ก ์ผ์ผํ ๊ฐ ํ ํ
์คํธ ๋น ๋๋ ์ด ์ค์ ์ ์ค ๋ค ํด๋์ค๋ง ์ถ๊ฐ.)
// document.querySelectorAll(".content__item").forEach(item => {
// if(scrollTop >= item.offsetTop){
// item.querySelector(".split").classList.add("show");
// }
// })
//03 : CSS์คํ์ผ ์ฃผ๊ธฐ
document.querySelectorAll(".content__item").forEach(item => {
//๋ง์ฝ ์คํฌ๋กค๊ฐ์ด ๊ฐ ์น์
์ ์คํ์
๊ฐ๊ณผ ๊ฐ๋ค๋ฉด.
if( scrollTop >= item.offsetTop){
//spanํ๊ทธ๋ฅผ ๋ชจ๋ ์ ํํ์ฌ ์ธ๋ฑ์ค ๊ฐ๊น์ง ๋ถ๋ฌ์จ ๋ค (span = element)
item.querySelectorAll(".split span").forEach((element, index) => {
//ํด๋์ค ๋ฆฌ์ค๋๋ฅผ ํตํด span ์์์๊ฒ ํด๋์ค show๋ฅผ ๋ฃ์ด ํ
์คํธ๊ฐ ๋ณด์ด๋๋ก ํฉ๋๋ค.
element.classList.add("show");
//๋ํ CSS์์ฑ ์ค ๋๋ ์ด๋ฅผ ์ถ๊ฐํ์ฌ ํ ๊ธ์ ๋น 50ms์ฉ ์์ง์ด๋๋ก ํ๋ค.
element.style.transitionDelay = `${index * 50}ms`;
});
}
});
requestAnimationFrame(scroll); //(1์ด์ 60๋ฒ ์คํ. : ์ฌ๊ทํจ์)
}
scroll(); //์คํ
์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฆฌ ๐
//01 : ๊ธ์จ ์ชผ๊ฐ๊ธฐ ๋ค์ค : ์ชผ๊ฐ๊ณ ์ถ์ ์์์ ํด๋์ค๋ฅผ ์ถ๊ฐ ์ํจ๋ค.
document.querySelectorAll(".split").forEach(text => {
let splitText = text.innerText;
let splitWrap = splitText.split('').join("</span><span aria-hidden='true'>");
splitWrap = "<span aria-hidden='true'>" + splitWrap + "</span>";
text.innerHTML = splitWrap;
text.setAttribute("aria-label", splitText);
});
//02 : ์คํฌ๋กค ๊ฐ ๊ตฌํ๊ณ ์คํฌ๋กค ์์ง์ผ ๋ ์ ๋๋ฉ์ด์
๊ตฌํํ๊ธฐ.
function scroll() {
let scrollTop = window.scrollY;
document.querySelector("#parallax__info .scroll").innerText = Math.round(scrollTop);
//03 : CSS์คํ์ผ ์ฃผ๊ธฐ
document.querySelectorAll(".content__item").forEach(item => {
if( scrollTop >= item.offsetTop){
item.querySelectorAll(".split span").forEach((element, index) => {
element.classList.add("show");
element.style.transitionDelay = `${index * 50}ms`;
});
}
});
requestAnimationFrame(scroll);
}
scroll(); //์คํ
'EFFECT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[EFFECT] ๊ฒ์ ํจ๊ณผ06 : Search Game (1) | 2022.10.24 |
---|---|
์ฌ๋ผ์ด๋ ํจ๊ณผ - ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋(๋ฒํผ, dot๋ฉ๋ด) (1) | 2022.10.24 |
[EFFECT] ๊ฒ์ ํจ๊ณผ05 : sort(), reverse()๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ๊ธฐ (0) | 2022.10.17 |
[EFFECT] ๊ฒ์ ํจ๊ณผ 05 : filter()๋ฉ์๋๋ฅผ ํตํด ์ค์๋ ์์ผ๋ก ๊ฒ์ํ๊ธฐ (3) | 2022.09.30 |
[EFFECT] ํ๋ด๋ ์ค ํจ๊ณผ06 : ํ ์คํธ ํจ๊ณผ (2) | 2022.09.30 |
๋๊ธ