프론트엔드 개발자가 될거야./react

페이지의 특정 부분으로 스크롤하는 방법

정니정은니 2023. 8. 7. 17:07

구현 중에 버튼을 누르면 해당부분으로 자동으로 스크롤하게 하는 기능을 구현하게 되었다.

스크롤하게 하는 기능은 같은 페이지 내에서도 가능하고
다른 페이지로 이동한 후 해당 부분으로 스크롤하게 할 수 있다.

 

페이지 내에서 특정 부분으로 스크롤해주는 것은 사소한 부분일지라도
유저에게는 매우 편리한 기능이기에 알아두면 좋을 거 같다.

case 1. 같은 페이지일 때 해당 부분으로 스크롤하기

같은 페이지 내에서 해당 부분으로 스크롤하는 방법은 간단하다.

<div>
    <button href="#a">a부분으로 스크롤</button>
    
    <div id="a">a부분</div>
</div>

이 예시에서는 'a부분으로 스크롤' 버튼을 누르면 해당 부분으로 스크롤된다.
이는 간단한 해시 값을 활용한 스크롤 이동이다.


case 2. 다른 페이지로 이동해서 해당 부분으로 스크롤하기

다른 페이지로 이동한 후 해당 부분으로 스크롤하는 방법이다.

 

- Home 페이지

Home 페이지에서 'detail 페이지로 이동 후 a 부분으로 스크롤' 링크를 제공해주자.

<link to="/home/detail/#a">detail페이지로 이동 후 a부분으로 스크롤</link>

- Detail 페이지

Detail 페이지에서useEffect 훅을 활용하여
URL의 해시 값이 변경될 때 해당 부분으로 스크롤하는 기능을 구현하자.

import React, { useEffect } from 'react';

function DetailPage() {
  useEffect(() => {
    const handleHashScroll = () => {
      const { hash } = window.location;
      if (hash) {
        const element = document.querySelector(hash);
        if (element) {
          element.scrollIntoView({ behavior: "smooth" });
        }
      }
    };

    handleHashScroll();

    window.addEventListener("hashchange", handleHashScroll);
    return () => {
      window.removeEventListener("hashchange", handleHashScroll);
    };
  }, []);

  return (
    <div>
      {/* ... (다른 컴포넌트 및 내용) */}
      <div id="a">a부분</div>
    </div>
  );
}

export default DetailPage;

페이지가 로드되거나 URL의 해시 값이 변경될 때 handleHashScroll 함수를 실행하여 원하는 부분으로 스크롤한다.
다른 페이지로 이동하더라도 원하는 부분으로 자동으로 스크롤된다 : )