๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ดํŽ™ํŠธ

ํŒจ๋Ÿด๋ ‰์Šค ์ดํŽ™ํŠธ - 1. ๋ฉ”๋‰ด ์ด๋™

by Youcodein 2022. 9. 6.
728x90
๋ฐ˜์‘ํ˜•

Javascript parallax Effect

parallax ์ดํŽ™ํŠธ ์ž…๋‹ˆ๋‹ค.

HTML

html ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

<header id="header">
    <h1>Javascript parallaxEffect01</h1>
    <p>ํŒจ๋Ÿด๋ ‰์Šค ์ดํŽ™ํŠธ- ๋ฉ”๋‰ด ์ด๋™</p>
    <ul>
        <li class="active"><a href="parallaxEffect01.html">1</a></li>
        <li><a href="parallaxEffect02.html">2</a></li>
        <li><a href="parallaxEffect03.html">3</a></li>
        <li><a href="parallaxEffect04.html">4</a></li>
        <li><a href="parallaxEffect05.html">5</a></li>
        <li><a href="parallaxEffect06.html">6</a></li>
        <li><a href="parallaxEffect07.html">7</a></li>
    </ul>
</header>
<!-- //header -->
<nav id="parallax__nav">
    <ul>
        <li class="active"><a href="#section01">๋ฉ”๋‰ด1</a></li>
        <li><a href="#section02">๋ฉ”๋‰ด2</a></li>
        <li><a href="#section03">๋ฉ”๋‰ด3</a></li>
        <li><a href="#section04">๋ฉ”๋‰ด4</a></li>
        <li><a href="#section05">๋ฉ”๋‰ด5</a></li>
        <li><a href="#section06">๋ฉ”๋‰ด6</a></li>
        <li><a href="#section07">๋ฉ”๋‰ด7</a></li>
        <li><a href="#section08">๋ฉ”๋‰ด8</a></li>
        <li><a href="#section09">๋ฉ”๋‰ด9</a></li>
    </ul>
</nav>
<!-- parallax nav -->
<main id="parallax__cont">
    <div id="contents">
        <section id="section01" 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">
                ๊ธ€์— ์œ„์ธ์˜ ์ดˆ์ƒํ™”๊ฐ€ ์žˆ๊ณ  ์œ„์ธ์˜ ์ด๋ฆ„์ด ์“ฐ์—ฌ์žˆ๋‹ค๊ณ  ํ•ด์„œ,
                ์ธํ„ฐ๋„ท์—์„œ ๋ณธ ๋ง์„ ์•„๋ฌด๊ฑฐ๋‚˜ ๋ฏฟ์ง€ ๋ง๋ผ.
            </p>
        </section>
        <!-- section01 -->
        <section id="section02" class="content__item">
            <span class="content__item__num">02</span>
            <h2 class="content__item__title">section02</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">
                ๋น„๋ก ๋‚ด์ผ ์ง€๊ตฌ์˜ ์ข…๋ง์ด ์˜จ๋‹ค ํ•˜๋”๋ผ๋„ ๋‚˜๋Š” ์˜ค๋Š˜ ํ•œ ๊ทธ๋ฃจ์˜ ์‚ฌ๊ณผ๋‚˜๋ฌด๋ฅผ ์‹ฌ๊ฒ ๋‹ค.
            </p>
        </section>
        <!-- section02 -->
        <section id="section03" class="content__item">
            <span class="content__item__num">03</span>
            <h2 class="content__item__title">section03</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">๊ทธ๋“ค์ด ์ฃฝ์Œ์„ ๋‘๋ ค์›Œํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ถ์ด ์ฃฝ์Œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์•„ํ”„๋‹ค.</p>
        </section>
        <!-- section03 -->
        <section id="section04" class="content__item">
            <span class="content__item__num">04</span>
            <h2 class="content__item__title">section04</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">
                ๋ชจ๋“  ๊ฒƒ์ด ๋ณ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์œผ๋ฉด ๋ถ™์žก์œผ๋ ค ํ•  ๊ฒƒ์ด ์—†๋‹ค.
            </p>
        </section>
        <!-- section04 -->
        <section id="section05" class="content__item">
            <span class="content__item__num">05</span>
            <h2 class="content__item__title">section05</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">
                ์–ด๋–ค ์ƒ๊ฐ์„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š๊ณ  ์ฆ๊ฒ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๊ต์–‘ ์žˆ๋Š” ์ •์‹ ์˜ ํ‘œ์ง•์ด๋‹ค.
            </p>
        </section>
        <!-- section05 -->
        <section id="section06" class="content__item">
            <span class="content__item__num">06</span>
            <h2 class="content__item__title">section06</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">
                ์ฒ ํ•™์€ ์–ธ์ œ๋‚˜ ์šฐ๋ฆฌ ๋ˆˆ ์•ž์— ๋†“์—ฌ ์žˆ๋Š” ๊ทธ ์œ„๋Œ€ํ•œ ์ฑ…์— ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ์ฃผ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
            </p>
        </section>
        <!-- section06 -->
        <section id="section07" class="content__item">
            <span class="content__item__num">07</span>
            <h2 class="content__item__title">section07</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">
                ํ–‰๋ณต์€ ํž˜์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ €ํ•ญ์ด ๊ทน๋ณต๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.
            </p>
        </section>
        <!-- section07 -->
        <section id="section08" class="content__item">
            <span class="content__item__num">08</span>
            <h2 class="content__item__title">section08</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">์‚ฌ๋ž‘์˜ ๊ด‘๊ธฐ๋Š” ํ•˜๋Š˜์˜ ์ถ•๋ณต ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.</p>
        </section>
        <!-- section08 -->
        <section id="section09" class="content__item">
            <span class="content__item__num">09</span>
            <h2 class="content__item__title">section09</h2>
            <figure class="content__item__imgWrap">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc">๊ฐํžˆ ์•Œ๊ณ ! ๋‹น์‹ ์˜ ์ง€๋Šฅ์„ ์‚ฌ์šฉํ•  ์šฉ๊ธฐ๋ฅผ ๊ฐ€์ง€์‹ญ์‹œ์˜ค.</p>
        </section>
        <!-- section09 -->
    </div>
</main>
<!-- //main -->

<aside id="parallax__info">
    <div class="scroll">scrollTop : <span>0</span>px</div>
    <div class="info">
        <ul>
            <li>#section01 offset() : <span class="offset01">0</span>px</li>
            <li>#section02 offset() : <span class="offset02">0</span>px</li>
            <li>#section03 offset() : <span class="offset03">0</span>px</li>
            <li>#section04 offset() : <span class="offset04">0</span>px</li>
            <li>#section05 offset() : <span class="offset05">0</span>px</li>
            <li>#section06 offset() : <span class="offset06">0</span>px</li>
            <li>#section07 offset() : <span class="offset07">0</span>px</li>
            <li>#section08 offset() : <span class="offset08">0</span>px</li>
            <li>#section09 offset() : <span class="offset09">0</span>px</li>
        </ul>
    </div>
</aside>

CSS

css ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

/* 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;
}

#parallax__nav li {
    display: inline;
    margin: 0 5px;
}

#parallax__nav li a {
    display: inline-block;
    /* width: 30px; */
    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;
    /* background-color: rgba(255,255,255,0.1); */
    width: 98%;
    margin: 0 auto;
}

.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: 10vw;
}

.content__item:nth-child(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 {
    right: -5vw;
    left: auto;
}

.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;
    width: 110%;
    height: 110%;
    left: -5px;
    top: -5px;
    background-image: url(img/effect_bg02.jpg);
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
    filter: saturate(0%);
    transition: all 1s;
}

.content__item:nth-child(2) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(3) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(4) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(5) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(6) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(7) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(8) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item:nth-child(9) .content__item__img {
    background-image: url(img/effect_bg09.jpg);
}

.content__item__desc {
    font-size: 3vw;
    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;
}

#parllax__nav li.active a {
    border-radius: 5px;
}

#parallax__info {
    position: fixed;
    left: 20px;
    bottom: 20px;
    z-index: 2000;
    background-color: rgba(0, 0, 0, 0.6);
    color: #fff;
    padding: 20px;
    border-radius: 10px;
}

#parallax__info li,
.scrollTop {
    line-height: 1.4;
}

#parallax__info li.active a {
    border-radius: 5px;
}

@media (max-width: 800px) {
    #parallax__cont {
        margin-top: 70vw;
    }

#parllax__nav {
    padding: 10px;
    right: auto;
    left: 10px;
    top: 10px;
    border-radius: 5px;
    background: rgba(0, 0, 0, 0.8);
    transform: translateY(-50%);
}

#parllax__nav li {
    display: block;
    margin: 5px;
}

#parllax__nav li a {
    font-size: 14px;
    padding: 5px;
    border-radius: 5px;
    height: auto;
    line-height: 1;
}

#parallax__info {
    left: 10;
    bottom: 10px;
}

}

Javascript

Javascript ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

// const scroll = document.querySelector("#parallax__info .scroll span")

window.addEventListener("scroll", () => {
    //let scrollTop = window.pageYOffset;
    //let scrollTop = window.scrollY;
    //let scrollTop = document.documentElement.scrollTop;

    let scrollTop = window.pageYOffset || window.scrollY || document.documentElement.scrollTop;

    // if(scrollTop >= document.getElementById("section01").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(1)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section02").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(2)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section03").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(3)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section04").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(4)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section05").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(5)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section06").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(6)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section07").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(7)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section08").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(8)").classList.add("active")
    // }
    // if(scrollTop >= document.getElementById("section09").offsetTop) {
    //     document.querySelectorAll("#parallax__nav li").forEach(li => {
    //         li.classList.remove("active");
    //     })
    //     document.querySelector("#parallax__nav li:nth-child(9)").classList.add("active")
    // }

    //for

    // for (let i = 1; i <= 9; i++) {
    //     if (scrollTop >= document.getElementById("section0" + i).offsetTop) {
    //         document.querySelectorAll("#parallax__nav li").forEach(li => {
    //             li.classList.remove("active")
    //         })
    //         document.querySelector("#parallax__nav li:nth-child(" + i + ")").classList.add("active");
    //     }
    // }

    //forEach

    document.querySelectorAll(".content__item").forEach((element, index) =>{
        if(scrollTop>= element.offsetTop -2){
            document.querySelectorAll("#parallax__nav li").forEach(li => {
                li.classList.remove("active")
            })
            document.querySelector("#parallax__nav li:nth-child(" + (index + 1) + ")").classList.add("active");
        }
    })


    //info
    document.querySelector(".scroll span").innerText = Math.round(scrollTop);

    //for
    for (let i = 1; i <= 9; i++) {
        document.querySelector(".offset0" + i).innerText = document.getElementById("section0" + i).offsetTop;
    }

});

//scroll์ด๋™
document.querySelectorAll("#parallax__nav li a").forEach(li => {
    li.addEventListener("click", (e) => {
        e.preventDefault();
        document.querySelector(li.getAttribute("href")).scrollIntoView({
            behavior:"smooth"
        })
    })
})

// document.querySelector(".offset01").innerText = document.getElementById("section01").offsetTop;
// document.querySelector(".offset02").innerText = document.getElementById("section02").offsetTop;
// document.querySelector(".offset03").innerText = document.getElementById("section03").offsetTop;
// document.querySelector(".offset04").innerText = document.getElementById("section04").offsetTop;
// document.querySelector(".offset05").innerText = document.getElementById("section05").offsetTop;
// document.querySelector(".offset06").innerText = document.getElementById("section06").offsetTop;
// document.querySelector(".offset07").innerText = document.getElementById("section07").offsetTop;
// document.querySelector(".offset08").innerText = document.getElementById("section08").offsetTop;
// document.querySelector(".offset09").innerText = document.getElementById("section09").offsetTop;
728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€