๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ : ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด

by ์ฝ”ํŒŒ์นด 2022. 9. 8.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ : ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค ์ค‘, ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ƒ๋‹จ ๋ฉ”๋‰ด๊ฐ€ ์•„๋‹Œ ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ํ˜„์žฌ ์œ„์น˜ํ•œ ์Šคํฌ๋กค๊ฐ’์— ๋”ฐ๋ผ ๋ฉ”๋‰ด์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


HTML ์†Œ์Šค

HTML์€ ๋จผ์ € nav, main, aside ์„ธ ํŒŒํŠธ๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. nav์—๋Š” 9๊ฐœ์˜ ๋ฉ”๋‰ด, main์—๋Š” 9๊ฐœ์˜ ์ฝ˜ํ…์ธ , aside์—๋Š” ์Šคํฌ๋กค์˜ ์œ„์น˜๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ๋” ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

<nav id="parallax__nav">
    <ul>
        <li class="active"><a href="#section1">๋ฉ”๋‰ด1</a></li>
        <li><a href="#section2">๋ฉ”๋‰ด2</a></li>
        <li><a href="#section3">๋ฉ”๋‰ด3</a></li>
        <li><a href="#section4">๋ฉ”๋‰ด4</a></li>
        <li><a href="#section5">๋ฉ”๋‰ด5</a></li>
        <li><a href="#section6">๋ฉ”๋‰ด6</a></li>
        <li><a href="#section7">๋ฉ”๋‰ด7</a></li>
        <li><a href="#section8">๋ฉ”๋‰ด8</a></li>
        <li><a href="#section9">๋ฉ”๋‰ด9</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">๊ฒฐ๊ณผ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๊ณผ์ •์„ ๋” ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค.</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">๋น„๊ฐ€ ์˜จ ๋‹ค์Œ์—๋Š” ๋ง‘์€ ๋‚ ์”จ๊ฐ€ ๋œ๋‹ค.</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">์ •์งํ•œ ์‚ฌ๋žŒ์ด ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ์ด์•ผ๋ง๋กœ ๊ฐ€์žฅ ์ •์งํ•˜์ง€ ๋ชปํ•œ ์‚ฌ๋žŒ์ด๋‹ค.</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">์„ธ์ƒ์€ ๊ณ ํ†ต์œผ๋กœ ๊ฐ€๋“ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์„ ์ด๊ฒจ๋‚ด๋Š” ์ผ๋กœ๋„ ๊ฐ€๋“ํ•˜๋‹ค.</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">๋ฌด๋ก€ํ•œ ์‚ฌ๋žŒ์˜ ํ–‰์œ„๋Š” ๋‚ด ํ–‰์‹ค์„ ๋ฐ”๋กœ ์žก๊ฒŒ ํ•ด์ฃผ๋Š” ์Šค์Šน์ด๋‹ค.</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">๊ฒธ์†ํ•œ ์ž๋งŒ์ด ๋‹ค์Šค๋ฆด ๊ฒƒ์ด์š”, ์• ์จ ์ผํ•˜๋Š” ์ž๋งŒ์ด ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.</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">๋ง๋„ ์•„๋ฆ„๋‹ค์šด ๊ฝƒ์ฒ˜๋Ÿผ ๊ทธ ์ƒ‰๊น”์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.</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">์‹œ๊ฐ„์€ ์œ„๋Œ€ํ•œ ์Šค์Šน์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ž์‹ ์˜ ๋ชจ๋“  ์ œ์ž๋ฅผ ์ฃฝ์ธ๋‹ค.</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">์‚ฌ๋ž‘์€ ๋‘ ์‚ฌ๋žŒ์ด ๋งˆ์ฃผ ์ณ๋‹ค๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•จ๊ป˜ ๊ฐ™์€ ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.</p>
        </section>
        <!-- //section9 -->
    </div>
</main>
<!-- //main -->

<aside id="parallax__info">
    <div class="scroll">scrollTop : <span>0</span>px</div>
</aside>

CSS ์†Œ์Šค

CSS๋กœ ์Šคํƒ€์ผ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์™€ info ๋ฐ•์Šค๋Š” position: fixed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์— ๊ณ ์ •๋˜๊ฒŒ ์„ค์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

/* parallaxType */
/* 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;
    height: 30px;
    padding: 5px 10px;
    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.3); */
    text-align: left;
    margin-right: 0;
    position: relative;
    padding-top: 7vw;
}
/* nth-child์˜ ๊ด„ํ˜ธ ์•ˆ์—๋Š” ์ˆ˜์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค, even = 2n (์ง์ˆ˜๋งŒ ์„ ํƒ) */
.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 {
    /* left ๊ฐ’ ์ดˆ๊ธฐํ™” */
    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_bg20-min.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_bg18-min.jpg);
}
.content__item:nth-child(2) .content__item__img {
    background-image: url(../assets/img/effect_bg17-min.jpg);
}
.content__item:nth-child(3) .content__item__img {
    background-image: url(../assets/img/effect_bg16-min.jpg);
}
.content__item:nth-child(4) .content__item__img {
    background-image: url(../assets/img/effect_bg15-min.jpg);
}
.content__item:nth-child(5) .content__item__img {
    background-image: url(../assets/img/effect_bg14-min.jpg);
}
.content__item:nth-child(6) .content__item__img {
    background-image: url(../assets/img/effect_bg13-min.jpg);
}
.content__item:nth-child(7) .content__item__img {
    background-image: url(../assets/img/effect_bg19-min.jpg);
}
.content__item:nth-child(8) .content__item__img {
    background-image: url(../assets/img/effect_bg20-min.jpg);
}
.content__item:nth-child(9) .content__item__img {
    background-image: url(../assets/img/effect_bg04-min.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;
}
#parallax__info {
    position: fixed;
    left: 10px;
    bottom: 10px;
    z-index: 2000;
    background: rgba(0, 0, 0, 0.6);
    color: #fff;
    padding: 20px;
    border-radius: 10px;
}
#parallax__info li,
.scrollTop {
    line-height: 1.4;
}

@media (max-width: 800px) {
    #parallax__cont {
        margin-top: 70vw;
    }
    #parallax__nav {
        padding: 10px;
        right: auto;
        left: 10px;
        top: 10px;
        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__dot {
    position: fixed;
    right: 20px;
    top: 50%;
    transform: translateY(-50%);
    z-index: 10000;
    background: rgba(0, 0, 0, 0.4);
    padding: 20px 10px;
    border-radius: 30px;
}
#parallax__dot li {
    position: relative;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    margin: 12px 8px;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0);
    transition: box-shadow 0.2s ease;
}
#parallax__dot li a {
    background: #fff;
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    border-radius: 50%;
    transition: transform 0.2s ease;
}
#parallax__dot li.active {
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 1);
}
#parallax__dot li.active a {
    transform: scale(0.4);
}
#parallax__dot li span {
    display: none;
}

JAVASCRIPT ์†Œ์Šค

preventDefault() ํด๋ฆญ ์‹œ ํŽ˜์ด์ง€ ์ด๋™ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
Attribute() ์„ ํƒํ•œ ์š”์†Œ์˜ ํŠน์ • ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
scrollIntoView() ํŠน์ • ์š”์†Œ์˜ ์œ„์น˜๋กœ ์Šคํฌ๋กค์„ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
behavior: smooth ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
document.querySelectorAll("#parallax__dot a").forEach((el) => {
    el.addEventListener("click", (e) => {
        e.preventDefault();

        document.querySelector(el.getAttribute("href")).scrollIntoView({ behavior: "smooth" });
    });
});

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

    document.querySelector("#parallax__info span").innerText = Math.floor(scrollTop);
    document.querySelectorAll(".content__item").forEach((e, i) => {
        if (scrollTop >= e.offsetTop - window.innerHeight - 10) {  /* ์˜ค์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด -10 */
        /* ์Šคํฌ๋กค์˜ ํ˜„์žฌ ์œ„์น˜ >= ๊ฐ ์„น์…˜์˜ ์œ„์น˜ - ๋ธŒ๋ผ์šฐ์ €์˜ ๋†’์ด */
            document.querySelectorAll("#parallax__dot li").forEach((li) => {
                li.classList.remove("active"); /* ๊ฐ ์„น์…˜์— ๋„์ฐฉํ•˜๋ฉด active ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐ */
            });
            document.querySelector("#parallax__dot li:nth-child(" + (i + 1) + ")").classList.add("active");
        }
    });
});

// window.scroll(0, 1000);
// window.scroll({ left: 0, top: 2000 });
// window.scroll({ left: 0, top: 2000, behivor: "smooth" });

// window.scrollTo(0, 1000);
// window.scrollTo({ left: 0, top: 2000 });
// window.scrollTo({ left: 0, top: 2000, behivor: "smooth" });

// ์œ„ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ด (์Šคํฌ๋กค๊ฐ’ 1000์œผ๋กœ ์ด๋™)

// window.scrollBy(0, 1000); /* ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ 1000์”ฉ ๋‹ค์šด */
// window.scrollBy({ left: 0, top: 2000 });
// window.scrollBy({ left: 0, top: 2000, behivor: "smooth" });

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•์œผ๋กœ๋Š” ์Šคํฌ๋กค์˜ ๋ฒ”์œ„์— ์˜ค์ฐจ๊ฐ€ ์ƒ๊ธฐ์ง€๋งŒ, ์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ๊ณ ์น  ๋ฐฉ๋ฒ•์ด ์—†์œผ๋‹ˆ ํƒœํด์€ ๋ฐ›์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘