ํจ๋ด๋ญ์ค ์ดํํธ 06
์ด๋ฒ ์๊ฐ์๋ ๊ทธ ๋์ ๋ฐฐ์ ๋ JavaScript๋ฅผ ์ด์ฉํ์ฌ ํจ๋ด๋ญ์ค(parallax, ํจ๋ด๋์ค) ์ดํํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ parallax๋, '์์ฐจ(่ฆๅทฎ)'๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ฒ๋ฌธํ ์ฉ์ด์ด๋ฉฐ, ์ด๋ฒ ํฌ์คํ
์์ ๋ด๋น๊ฒ์ด์
๋ฐ์์ ํน์ ์น์
์ผ๋ก ๊ฐ๋ ๋ฒํผ์
๋๋ฅด๋ฉด ํด๋น ์น์
์ผ๋ก ์์ฐจ๋ฅผ ๋๊ณ ์ค๋ฌด์คํ๊ฒ ์ด๋์์ผ ์ฃผ๋ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ ํฉ๋๋ค.
์ด๋ฒ ํจ๋ด๋ญ์ค ์ดํํธ 06 - ํ
์คํธ ํจ๊ณผ์์๋ ํ
์คํธ๊ฐ ํ์ดํํ๋ ํ์์ผ๋ก ํ๊ธ์์ฉ ๋ํ๋๋ ์ ๋๋ฉ์ด์
์ ์ฃผ๊ฒ ์ต๋๋ค.
HTML ์์ค
header, parallax__dot(dot ๋ด๋น๊ฒ์ด์ ), main(parallax__cont(๋ช ์ธ ๋ชจ์)), aside(parallax__info(์คํฌ๋กคํ๊ฐ)), footer(๋ชจ๋ฌ ๋ฐ์ค)๋ก ๊ตฌ์ฑ๋๋ค.
<body class="img10">
<header id="header">
<h1>JAVASCRIPT PARALLAX EFFECT 06</h1>
<p>ํจ๋ด๋ญ์ค ์ดํํธ - ํ
์คํธ ํจ๊ณผ</p>
<ul>
<li><a href="parallaxEffect01.html">01</a></li>
<li><a href="parallaxEffect02.html">02</a></li>
<li><a href="parallaxEffect03.html">03</a></li>
<li><a href="parallaxEffect04.html">04</a></li>
<li><a href="parallaxEffect05.html">05</a></li>
<li class="active"><a href="parallaxEffect06.html">06</a></li>
<li><a href="parallaxEffect07.html">07</a></li>
</ul>
</header>
<!-- //header -->
<nav id="parallax__nav">
<ul>
<li class="active"><a href="#section1">๋ฉ๋ด1</a></li>
<li><a href="#section2"><span>๋ฉ๋ด2</span></a></li>
<li><a href="#section3"><span>๋ฉ๋ด3</span></a></li>
<li><a href="#section4"><span>๋ฉ๋ด4</span></a></li>
<li><a href="#section5"><span>๋ฉ๋ด5</span></a></li>
<li><a href="#section6"><span>๋ฉ๋ด6</span></a></li>
<li><a href="#section7"><span>๋ฉ๋ด7</span></a></li>
<li><a href="#section8"><span>๋ฉ๋ด8</span></a></li>
<li><a href="#section9"><span>๋ฉ๋ด9</span></a></li>
</ul>
</nav>
<!-- //parallax__nav -->
<main id="parallax__cont">
<div id="contents">
<section id="section1" class="content__item">
<span class="content__item__num">01</span>
<h2 class="content__item__title">section1</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">๊ฒฐ๊ณผ๋ ์ค์ํ์ง๋ง, ๊ณผ์ ์ ๋ ์ค์ํ๊ฒ ์๊ฐํ๋ค.</p>
</section>
<!-- //section1 -->
<section id="section2" class="content__item">
<span class="content__item__num">02</span>
<h2 class="content__item__title">section2</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ธ์์์ ๋ง์ ํจ๋ฐฐ์ ์ง๋ฉดํ๊ฒ ์ง๋ง ๊ฒฐ์ฝ ํจ๋ฐฐํ์ง ๋ง๋ผ.</p>
</section>
<!-- //section2 -->
<section id="section3" class="content__item">
<span class="content__item__num">03</span>
<h2 class="content__item__title">section3</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">โ๋ด ๋ ๊ทธ๋ด ์ค ์์๋คโ ์์์ผ๋ฉด ์ ๋ฐ ๋ฏธ๋ฆฌ ๋ง ํด์ค๋ผ.</p>
</section>
<!-- //section3 -->
<section id="section4" class="content__item">
<span class="content__item__num">04</span>
<h2 class="content__item__title">section4</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">๋ฆ์๋ค๊ณ ์๊ฐํ ๋๊ฐ ์ง์ง ๋๋ฌด ๋ฆ์๋ค.</p>
</section>
<!-- //section4 -->
<section id="section5" class="content__item">
<span class="content__item__num">05</span>
<h2 class="content__item__title">section5</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ฆ๊ธธ ์ ์์ผ๋ฉด ํผํ๋ผ.</p>
</section>
<!-- //section5 -->
<section id="section6" class="content__item">
<span class="content__item__num">06</span>
<h2 class="content__item__title">section6</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ํ์ ๊ณผ๊ฐํ ๋ชจํ์ด๊ฑฐ๋ ์๋๋ฉด ์๋ฌด๊ฒ๋ ์๋๋ค.</p>
</section>
<!-- //section6 -->
<section id="section7" class="content__item">
<span class="content__item__num">07</span>
<h2 class="content__item__title">section7</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ด๋ ค์ด ๊ธธ์ ๊ธธ์ด ์๋๋ค.</p>
</section>
<!-- //section7 -->
<section id="section8" class="content__item">
<span class="content__item__num">08</span>
<h2 class="content__item__title">section8</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ ์ ์๋ ํผ๋ก๊ฐ ์ ํ๋ฆฌ๋.</p>
</section>
<!-- //section8 -->
<section id="section9" class="content__item">
<span class="content__item__num">09</span>
<h2 class="content__item__title">section9</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc split">์ธ์์ ์๋ํ ๋ชจํ์ด๊ฑฐ๋ ์๋๋ฉด ์๋ฌด๊ฒ๋ ์๋๋ค.</p>
</section>
<!-- //section9 -->
</div>
</main>
<!-- //main -->
<aside id="parallax__info">
<div class="scroll">scrollTop : <span>0</span>px</div>
</aside>
<!-- //parallax__info -->
<footer id="footer">
<div class="modal__wrap">
</div>
</footer>
<!-- //footer -->
</body>
CSS ์์ค
ํจ๋ด๋ญ์ค ํจ๊ณผ์๋ง ์ ์ฉ๋๋ CSS ์์ค์ด๋ค. ๊ณตํต/์ด๊ธฐํ ๋ถ๋ถ CSS๋ ํ๋จ์ CSS ์์ค ๋ณด๊ธฐ ๋ฒํผ์ ๋๋ฌ ํ์ธํ ๊ฒ.
<style>
/* parallax__nav */
#parallax__nav {
position: fixed;
right: 20px;
top: 20px;
z-index: 2000;
background-color: rgba(0,0,0,0.4);
padding: 20px 30px;
border-radius: 50px;
transition: top .4s ease;
}
#parallax__nav li {
display: inline;
margin: 0 5px;
}
#parallax__nav li a {
display: inline-block;
height: 30px;
padding: 5px 20px;
text-align: center;
line-height: 30px;
}
#parallax__nav li.active a {
background: #fff;
color: #000;
border-radius: 20px;
box-sizing: content-box;
}
#parallax__cont {
max-width: 1600px;
width: 98%;
margin: 0 auto;
/* background-color: rgba(255,255,255,0.1); */
}
.content__item {
width: 1000px;
max-width: 70vw;
margin: 30vw auto;
/* background-color: rgba(255,255,255,0.1); */
text-align: left;
margin-right: 0;
position: relative;
padding-top: 7vw;
}
.content__item:nth-child(even) { /* even == ์ง์๋ง ์ ํ */
margin-left: 0;
text-align: right;
}
.content__item__num {
font-size: 35vw;
font-family: 'Lato';
font-weight: 100;
position: absolute;
left: -5vw;
top: -16vw;
opacity: 0.07;
z-index: -2;
}
.content__item:nth-child(even) .content__item__num {
left: auto;
right: -5vw;
}
.content__item__title {
font-weight: 400;
text-transform: capitalize;
}
.content__item__imgWrap {
width: 100%;
padding-bottom: 56.25%;
background: #000;
position: relative;
overflow: hidden;
z-index: -1;
}
.content__item__img {
position: absolute;
background-image: url(../assets/img/effect_bg10.jpg);
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
width: 110%;
height: 110%;
left: -5%;
top: -5%;
filter: saturate(0%);
/* transition: all 1s; */
}
.content__item:nth-child(1) .content__item__img {
background-image: url(../assets/img/effect_bg10.jpg);
}
.content__item:nth-child(2) .content__item__img {
background-image: url(../assets/img/effect_bg09.jpg);
}
.content__item:nth-child(3) .content__item__img {
background-image: url(../assets/img/effect_bg08.jpg);
}
.content__item:nth-child(4) .content__item__img {
background-image: url(../assets/img/effect_bg07.jpg);
}
.content__item:nth-child(5) .content__item__img {
background-image: url(../assets/img/effect_bg06.jpg);
}
.content__item:nth-child(6) .content__item__img {
background-image: url(../assets/img/effect_bg05.jpg);
}
.content__item:nth-child(7) .content__item__img {
background-image: url(../assets/img/effect_bg04.jpg);
}
.content__item:nth-child(8) .content__item__img {
background-image: url(../assets/img/effect_bg03.jpg);
}
.content__item:nth-child(9) .content__item__img {
background-image: url(../assets/img/effect_bg02.jpg);
}
.content__item__desc {
font-size: 4vw;
line-height: 1.4;
margin-top: -5vw;
margin-left: -4vw;
word-break: keep-all;
}
.content__item:nth-child(even) .content__item__desc {
margin-left: auto;
margin-right: -4vw;
}
/* info */
#parallax__info {
position: fixed;
left: 20px;
bottom: 20px;
z-index: 2000;
background: rgba(0,0,0,0.4);
color: #fff;
padding: 20px 30px;
border-radius: 10px;
}
#parallax__info li, .scrollTop {
line-height: 1.4;
}
/* option */
.split span {
opacity: 0;
transform: translateY(50px);
transition: all 0.6s cubic-bezier(0, 0.71, 0.11, 1.66);
display: inline-block;
min-width: 1vw;
}
.split.show span {
opacity: 1;
transform: translateY(0);
}
/* .split.show span:nth-child(1){transition-delay: 100ms;}
.split.show span:nth-child(2){transition-delay: 150ms;}
.split.show span:nth-child(3){transition-delay: 200ms;}
.split.show span:nth-child(4){transition-delay: 250ms;}
.split.show span:nth-child(5){transition-delay: 300ms;}
.split.show span:nth-child(6){transition-delay: 350ms;}
.split.show span:nth-child(7){transition-delay: 400ms;}
.split.show span:nth-child(8){transition-delay: 450ms;}
.split.show span:nth-child(9){transition-delay: 500ms;}
.split.show span:nth-child(10){transition-delay: 550ms;}
.split.show span:nth-child(11){transition-delay: 600ms;}
.split.show span:nth-child(12){transition-delay: 650ms;}
.split.show span:nth-child(13){transition-delay: 700ms;}
.split.show span:nth-child(14){transition-delay: 750ms;}
.split.show span:nth-child(15){transition-delay: 800ms;}
.split.show span:nth-child(16){transition-delay: 850ms;}
.split.show span:nth-child(17){transition-delay: 900ms;}
.split.show span:nth-child(18){transition-delay: 950ms;}
.split.show span:nth-child(19){transition-delay: 1000ms;}
.split.show span:nth-child(20){transition-delay: 1050ms;}
.split.show span:nth-child(21){transition-delay: 1100ms;}
.split.show span:nth-child(22){transition-delay: 1150ms;}
.split.show span:nth-child(23){transition-delay: 1200ms;}
.split.show span:nth-child(24){transition-delay: 1250ms;}
.split.show span:nth-child(25){transition-delay: 1300ms;}
.split.show span:nth-child(26){transition-delay: 1350ms;}
.split.show span:nth-child(27){transition-delay: 1400ms;}
.split.show span:nth-child(28){transition-delay: 1450ms;}
.split.show span:nth-child(29){transition-delay: 1500ms;}
.split.show span:nth-child(30){transition-delay: 1550ms;}
.split.show span:nth-child(31){transition-delay: 1600ms;}
.split.show span:nth-child(32){transition-delay: 1650ms;} */
/* ๋ฐ์ํ */
@media (max-width: 800px) {
#parallax__cont {
margin-top: 70vw;
}
#parallax__nav {
padding: 10px;
right: auto;
left: 10px;
top: 50%;
transform: translateY(-50%);
border-radius: 5px;
background-color: rgba(0,0,0,0.8);
}
#parallax__nav li {
display: block;
margin: 5px;
}
#parallax__nav li a {
font-size: 14px;
padding: 5px;
border-radius: 5px;
height: auto;
line-height: 1;
}
#parallax__nav li.active a {
border-radius: 5px;
}
#parallax__info {
left: 10px;
bottom: 10px;
}
}
</style>
JS ์์ค
<script>
// ๊ธ์จ ์ชผ๊ฐ๊ธฐ
// let text = document.querySelector('#section1 .content__item__desc');
// let splitTextWrap = text.innerText.split('').join('</span><span>');
// splitTextWrap = "<span>" + splitTextWrap + "</span>";
// text.innerHTML = splitTextWrap;
// ๊ธ์จ ์ชผ๊ฐ๊ธฐ(๋ค์ค์ด)
// let texts = document.querySelectorAll('.content__item__desc');
// texts.forEach((text, index) => {
// let splitTextWrap = text.innerText.split('').join('</span><span>');
// splitTextWrap = "<span>" + splitTextWrap + "</span>";
// text.innerHTML = splitTextWrap;
// });
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);
});
function scroll() {
let scrollTop = window.scrollY;
document.querySelector('.scroll span').innerText = Math.ceil(scrollTop);
// css ํด๋์ค ์ถ๊ฐ(์๋์ ๋ฐฉ๋ฒ)
// document.querySelectorAll('.content__item').forEach((item) => {
// if(scrollTop >= item.offsetTop - 200) {
// item.querySelector('.split').classList.add('show');
// }
// });
document.querySelectorAll('.content__item').forEach((item) => {
if(scrollTop >= item.offsetTop - 200) {
item.querySelector('.split').classList.add('show');
item.querySelectorAll('.split span').forEach((span, index) => {
span.style.transitionDelay = `${index * 50}ms`;
});
}
});
requestAnimationFrame(scroll);
}
scroll();
// ์ฒซ ๋ฒ์งธ span 0.01,
// ๋ ๋ฒ์งธ span 0.02,
// ์ธ ๋ฒ์งธ span 0.03
</script>
๋๊ธ