ํจ๋ด๋ญ์ค ์ดํํธ 07
์ด๋ฒ ์๊ฐ์๋ ๊ทธ ๋์ ๋ฐฐ์ ๋ JavaScript๋ฅผ ์ด์ฉํ์ฌ ํจ๋ด๋ญ์ค(parallax, ํจ๋ด๋์ค) ์ดํํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ parallax๋, '์์ฐจ(่ฆๅทฎ)'๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ฒ๋ฌธํ ์ฉ์ด์ด๋ฉฐ, ์ด๋ฒ ํฌ์คํ
์์ ๋ด๋น๊ฒ์ด์
๋ฐ์์ ํน์ ์น์
์ผ๋ก ๊ฐ๋ ๋ฒํผ์
๋๋ฅด๋ฉด ํด๋น ์น์
์ผ๋ก ์์ฐจ๋ฅผ ๋๊ณ ์ค๋ฌด์คํ๊ฒ ์ด๋์์ผ ์ฃผ๋ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ ํฉ๋๋ค.
์ด๋ฒ ํจ๋ด๋ญ์ค ์ดํํธ 07์์๋ ๋ฆฌ๋น(reveal) ํจ๊ณผ ์ ๋๋ฉ์ด์
์ ์ฃผ๊ฒ ์ต๋๋ค.
HTML ์์ค
์ ๋๋ฉ์ด์ ์ ์ฃผ๊ณ ์ ํ๋ ์ด๋ฏธ์ง์ ํ ์คํธ ์์ญ์ reveal ํด๋์ค๊ฐ์ ์ค๋ค.
ยท reveal-RTL : ์ฐ์ธก์์ ์ข์ธก์ผ๋ก ๋ฆฌ๋น ํจ๊ณผ
ยท reveal-TTB : ์๋จ์์ ํ๋จ์ผ๋ก ๋ฆฌ๋น ํจ๊ณผ
ยท reveal-BTT : ํ๋จ์์ ์๋จ์ผ๋ก ๋ฆฌ๋น ํจ๊ณผ
ยท reveal-TWO : ๋ ๊ฐ์ง ์ ๋๋ฉ์ด์
์ ๋์์ ์ค
<body class="img10">
<header id="header">
<h1>JAVASCRIPT PARALLAX EFFECT 07</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><a href="parallaxEffect06.html">06</a></li>
<li class="active"><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 reveal">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal">๊ฒฐ๊ณผ๋ ์ค์ํ์ง๋ง, ๊ณผ์ ์ ๋ ์ค์ํ๊ฒ ์๊ฐํ๋ค.</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 reveal reveal-RTL">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-RTL">์ธ์์์ ๋ง์ ํจ๋ฐฐ์ ์ง๋ฉดํ๊ฒ ์ง๋ง ๊ฒฐ์ฝ ํจ๋ฐฐํ์ง ๋ง๋ผ.</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 reveal reveal-TTB">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-TTB">โ๋ด ๋ ๊ทธ๋ด ์ค ์์๋คโ ์์์ผ๋ฉด ์ ๋ฐ ๋ฏธ๋ฆฌ ๋ง ํด์ค๋ผ.</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 reveal reveal-BTT">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-BTT">๋ฆ์๋ค๊ณ ์๊ฐํ ๋๊ฐ ์ง์ง ๋๋ฌด ๋ฆ์๋ค.</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 reveal reveal-TWO">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-TWO">์ฆ๊ธธ ์ ์์ผ๋ฉด ํผํ๋ผ.</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 reveal reveal-TWO reveal-RTL">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-TWO reveal-RTL">์ํ์ ๊ณผ๊ฐํ ๋ชจํ์ด๊ฑฐ๋ ์๋๋ฉด ์๋ฌด๊ฒ๋ ์๋๋ค.</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 reveal reveal-TWO reveal-TTB">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-TWO reveal-TTB">์ด๋ ค์ด ๊ธธ์ ๊ธธ์ด ์๋๋ค.</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 reveal reveal-TWO reveal-BTT">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal reveal-TWO reveal-BTT">์ ์ ์๋ ํผ๋ก๊ฐ ์ ํ๋ฆฌ๋.</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 reveal">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc reveal">์ธ์์ ์๋ํ ๋ชจํ์ด๊ฑฐ๋ ์๋๋ฉด ์๋ฌด๊ฒ๋ ์๋๋ค.</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 ์์ค ๋ณด๊ธฐ ๋ฒํผ์ ๋๋ฌ ํ์ธํ ๊ฒ. reveal ํจ๊ณผ๋ /* option */ ํญ๋ชฉ์ ์ฐธ์กฐํ ๊ฒ. ํคํ๋ ์์ ๋ง๋ค์ด์ animation ํ๊ทธ์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์์ ์ ํ๋ค.
<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 */
.reveal > div,
.reveal > span {
opacity: 0;
}
.reveal.show > div {
animation: opacity 1s linear forwards;
}
.reveal.show > span {
opacity: 1;
}
.reveal {
position: relative;
}
.reveal::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 0;
height: 100%;
background: #fff;
z-index: 1;
}
.reveal.reveal-TWO::after {
content: '';
position: absolute;
left: 0;
top: 0;
width: 0;
height: 100%;
z-index: 1;
background: orange;
}
/* 1๊ฐ */
.reveal.show::before {
animation: reveal 1s;
}
.reveal.reveal-RTL.show::before {
animation: reveal-RTL 1s;
}
.reveal.reveal-TTB.show::before {
animation: reveal-TTB 1s;
}
.reveal.reveal-BTT.show::before {
animation: reveal-BTT 1s;
}
/* 2๊ฐ */
.reveal.show::after {
animation: reveal 1s 0.3s;
}
.reveal.reveal-RTL.show::after {
animation: reveal-RTL 1s 0.3s;
}
.reveal.reveal-TTB.show::after {
animation: reveal-TTB 1s 0.3s;
}
.reveal.reveal-BTT.show::after {
animation: reveal-BTT 1s 0.3s;
}
@keyframes opacity {
0% {opacity: 0;}
60% {opacity: 0;}
70% {opacity: 1;}
100% {opacity: 1;}
}
@keyframes reveal {
0% {width: 0; left: 0;}
50% {width: 100%; left: 0;}
80% {width: 100%; left: 0;}
100% {width: 0; left: 100%;}
}
@keyframes reveal-RTL {
0% {width: 0; right: 0; left: auto;}
50% {width: 100%; right: 0; left: auto;}
80% {width: 100%; right: 0; left: auto;}
100% {width: 0; right: 100%; left: auto;}
}
@keyframes reveal-TTB {
0% {width: 100%; height: 0; top: 0;}
50% {width: 100%; height: 100%; top: 0;}
80% {width: 100%; height: 100%; top: 0;}
100% {width: 100%; height: 0; top: 100%;}
}
@keyframes reveal-BTT {
0% {width: 100%; height: 0; bottom: 0; top: auto;}
50% {width: 100%; height: 100%; bottom: 0; top: auto;}
80% {width: 100%; height: 100%; bottom: 0; top: auto;}
100% {width: 100%; height: 0; bottom: 100%; top: auto;}
}
.content__item__num { display: none; }
.content__item__title { display: none; }
/* ๋ฐ์ํ */
@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 ์์ค
reveal ํด๋์ค ์์์ ๊ธ์จ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ทธ ๊ธ์จ๋ฅผ span ํ๊ทธ๋ก ๊ฐ์ธ๋๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์ง๊ณ , ์คํฌ๋กค ๊ฐ์ด ์น์ ์์ญ์ ๋๋ฌํ์ ๊ฒฝ์ฐ show ํด๋์ค๊ฐ์ ๋ถ์ฌ ๋ฆฌ๋น ํจ๊ณผ๋ฅผ ์ฃผ๋๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์งฐ๋ค.
<script>
const revealText = document.querySelectorAll(".reveal");
// reveal ํด๋์ค ์์์ ๊ธ์จ๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ฐ์์ผ๋ก span ํ๊ทธ๋ฅผ ๋ง๋ค์ด์ ๋ฃ๊ธฐ
revealText.forEach((el)=>{
let splitText = el.innerText;
// console.log(splitText)
if(splitText){
el.innerHTML = '<span>' + splitText + '</span>';
}
});
function scroll() {
let scrollTop = window.scrollY; // ์คํฌ๋กคํ๊ฐ
const reveal = document.querySelectorAll(".reveal"); // ๋ฆฌ๋น ํจ๊ณผ ์์
reveal.forEach(el => {
let revealOffset = el.offsetTop + el.parentElement.offsetTop;
let revealDelay = el.dataset.delay; // ๋๋ ์ด ์ฃผ๊ธฐ
// if(scrollTop > revealOffset - window.innerHeight/2){
// el.classList.add("show"); // ์คํฌ๋กค ์์น๊ฐ ์์ญ์ ๋๋ฌํ ์ show ๋ถ์ฌ์ฃผ๊ธฐ
// }
if(scrollTop >= revealOffset - window.innerHeight){
if(revealDelay == undefined){
el.classList.add("show");
} else {
setTimeout(() => {
el.classList.add("show");
}, revealDelay)
}
}
});
requestAnimationFrame(scroll);
}
scroll();
</script>
๋๊ธ