본문 바로가기
Effect

Parallax Effect01

by 코터틀 2022. 9. 6.
반응형

parallaxEffect01

패럴랙스 이펙트01번 입니다. 스크롤 기준으로, 요소의 좌표값과 메뉴 버튼의 활성화 상태가 변경되도록 하였습니다.


HTML

헤더와, 연결(nav), 콘텐츠, 사이드, 푸터 영역으로 나누었습니다.
nav 영역은 현재 스크롤 영역이 어디인지, 클릭하면 그 메뉴의 영역을 볼 수 있도록 구성하였습니다.
contents 영역은 이미지와 명언이 들어가는 본문 영역입니다.
사이드(info) 영역은 현재 스크롤 좌표, 각 메뉴 요소들의 세로 좌표값을 js코드를 통해 볼 수 있도록 하였습니다.

<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>
    <div class="info">
        <ul>
            <li>#section1 offset() : <span class="offset1">0</span>px</li>
            <li>#section2 offset() : <span class="offset2">0</span>px</li>
            <li>#section3 offset() : <span class="offset3">0</span>px</li>
            <li>#section4 offset() : <span class="offset4">0</span>px</li>
            <li>#section5 offset() : <span class="offset5">0</span>px</li>
            <li>#section6 offset() : <span class="offset6">0</span>px</li>
            <li>#section7 offset() : <span class="offset7">0</span>px</li>
            <li>#section8 offset() : <span class="offset8">0</span>px</li>
            <li>#section9 offset() : <span class="offset9">0</span>px</li>
        </ul>
    </div>
</aside>
<!-- //parallax__info -->

JAVASCRIPT

1. 요소의 세로 스크롤 값을 구하기 위해 scroll 이벤트 함수를 선언합니다.
2. for문 or forEach문을 사용하여 스크롤 위치에 따른 메뉴의 활성화(active) 상태를 추가/제거합니다.
(scrollTop:브라우저의 최상단에서 스크롤 한 값이 .content__item 클래스 요소의 상단과의 거리 값의 이상이라면)
3. scroll span태그에 들어가는 scrollTop값이 반올림이 되도록 설정합니다.
3-1. for문을 사용하여 offsetN클래스들의 offsetTop값을 출력합니다.
4. 메뉴 이동이 부드러워지도록 클릭시 이벤트를 설정합니다.

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;
    //브라우저 호환에 따라 셋 중 한가지가 사용되도록 함

    //for문
    // for (let i = 1; i <= 9; i++) {
    //     if (scrollTop >= document.getElementById("section" + 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((el, i) => {
        if (scrollTop >= el.offsetTop - 2) {
            document.querySelectorAll("#parallax__nav li").forEach(li => {
                li.classList.remove("active");
            });
            document.querySelector("#parallax__nav li:nth-child(" + (i + 1) + ")").classList.add("active")
        }
    });
    //스크롤을 계속 감지하기 때문에 과부하가 걸릴 수 밖에 없습니다.

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

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

//스크롤 이동
document.querySelectorAll("#parallax__nav li a").forEach(li => {
    li.addEventListener("click", (e) => {
        e.preventDefault();
        document.querySelector(li.getAttribute("href")).scrollIntoView({
            behavior: "smooth"
        });
    });
});

이미지 참고자료

반응형

'Effect' 카테고리의 다른 글

Parallax Effect03  (2) 2022.09.13
Parallax Effect02  (13) 2022.09.08
mouseEffect01  (5) 2022.09.06
sliderEffect03  (13) 2022.09.01
sliderEffect02  (8) 2022.08.29

댓글


광고 준비중입니다.