개발 도구 (Development Tools)/Library

[jQuery] 원페이지 마우스 스크롤링 효과

ZEN(ゼン) 2022. 3. 22. 10:00
반응형

 

#1 기능 설명

  마우스 휠을 스크롤하면 해당 위치까지 부드럽게 애니메이션처럼 스크롤되는 효과.

  전체 화면을 페이지 넘기듯 전환하는 방식으로 웹페이지에서 자주 사용되었던 지금은 유행이 살짝 지난 효과.

 

 

#2 적용 및 사용방법 (샘플)

1. jQuery 연결하기

  jQuery를 사용하므로 jQuery 연결은 필수.

  참고: 제이쿼리(jQuery) 설치하는 방법

 

2. HTML 샘플

<body>
    <header>
        <div id="header_title">
            <h1>한국</h1>
        </div>
        <nav id="header_gnb">
            <ul>
                <li><a href="#section_so">서울</a></li>
                <li><a href="#section_dj">대전</a></li>
                <li><a href="#section_dg">대구</a></li>
                <li><a href="#section_bu">부산</a></li>
            </ul>
        </nav>
    </header>
    <!-- <div id="fullpage" class="contents"> -->
        <section id="section_so" class="location"><h2>서울</h2></section>
        <section id="section_dj" class="location"><h2>대전</h2></section>
        <section id="section_dg" class="location"><h2>대구</h2></section>
        <section id="section_bu" class="location"><h2>부산</h2></section>
    <!-- </div> -->
    <footer>
        <a href="http://bicute.net">bicute.net</a>
    </footer>
</body>

  전체적인 내용은 중요하지 않지만 이 글에선 16~19라인의 section을 전체 화면으로 스크롤되게 할 것이며, 모두 동일한 location이라는 클래스를 주었습니다. 

  위아래 주석처리가 되어있는 div는 일반적으로 이 부분을 따로 그룹을 지어주겠지만, 이 스크롤 기능을 이용하게 되면 해당 영역(div) 내에서만 움직이기 때문에 위와 같이 nav나 footer 가 추가로 있을 경우 해당 위치로 이동을 할 수 없게 됩니다.

  그것을 방지하기 위해서 section을 담고 있는 div를 제거합니다. 

 

3. CSS 샘플

* { margin: 0 auto;  color: black; }
a { text-decoration: none; }
h2 { font-size: 96px;  color: white; }

#header_title { text-align: center; height: 48px;  margin: 6px; }
header nav { background: #ff9100; }
#header_gnb ul { display: flex; width: 80%; text-align: center; 
		justify-content: space-around; align-items: center; height: 48px; }   
li {  width: 25%; list-style: none; padding: 10px 30px; }


section {
    width: 100%;
    height: 100vh;
    position: relative;
}

section h2 {
    position: absolute;
    display: inline-block;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    text-shadow: 3px 3px 3px rgba(0, 0, 0, 0.5);
}

#section_so { background: yellow; }
#section_dj { background: green; }
#section_dg { background: blue; }
#section_bu { background: gray; }

  이건 샘플이니 크게 중요한건 없고, 그냥 각 section들이 전체 화면을 차지하고 있다 정도.

 

4. JS 샘플

window.onload = function () {
    var elm = ".location";      // 제어하고자 하는 해당하는 클래스명을 지정
    $(elm).each(function (index) {
        // 개별적으로 Wheel 이벤트 적용
        $(this).on("mousewheel DOMMouseScroll", function (e) {
            e.preventDefault();
            var delta = 0;
            if (!event) event = window.event;
            if (event.wheelDelta) {
                delta = event.wheelDelta / 120;
                if (window.opera) delta = -delta;
            } 
            else if (event.detail)
                delta = -event.detail / 3;
            var moveTop = $(window).scrollTop();
            var elmSelecter = $(elm).eq(index);
            // 마우스휠을 위에서 아래로
            if (delta < 0) {
                if ($(elmSelecter).next() != undefined) {
                    try{
                        moveTop = $(elmSelecter).next().offset().top;
                    }catch(e){}
                }
            // 마우스휠을 아래에서 위로
            } else {
                if ($(elmSelecter).prev() != undefined) {
                    try{
                        moveTop = $(elmSelecter).prev().offset().top;
                    }catch(e){}
                }
            }
            // 화면 이동
            $("html,body").stop().animate({
                scrollTop: moveTop + 'px'
            }, {
                duration: 1600, complete: function () {
                }
            });
        });
    });
}

  2번째 줄에 elm 값을 자신에게 맞춰 해당 요소를 입력해주면 됩니다. 

 

 

#3 잡담

  위의 HTML과 같은 형식으로 링크와 스크롤 모두 사용하게 된다면, 

  [jQuery] 앵커 태그 이동 시 부드러운 스크롤 효과를 함께 사용하여 마우스 휠과 앵커 태그 모두에게 스크롤 효과를 줄 수 있습니다. 

 

 

 

반응형