안녕하세요

스크롤 막기 이벤트 본문

데이터시각화-KMG

스크롤 막기 이벤트

sakuraop 2023. 6. 21. 17:14

사이드 메뉴를 열면 배경이 스크롤이 되지 않도록 하고 싶을 때

 

 

const NavBar = () => {

  useEffect(() => {
      const scrollY = window.scrollY;
      const bodyStyle = document.body.style;

      bodyStyle.position = "fixed";
      bodyStyle.top = `-${scrollY}px`;
      bodyStyle.overflowY = "scroll";
      bodyStyle.width = "100%";

      return () => {
        bodyStyle.cssText = "";
        window.scrollTo(0, scrollY);
      };
    }, []);
    
    return ( ...<컴포넌트/> );
};
 

사이드 메뉴 컴포넌트가 나타날 때 body에 css style을 몇 가지 적용하여 스크롤이 되지 않도록 할 수 있다.

 

    const scrollY = window.scrollY;

0. 현재 스크롤 위치를 저장한다.

 

    bodyStyle.position = "fixed";

1. body에 position을 fixed로 바꾸게 되면 스크롤 바가 사라지게 된다.

 

    bodyStyle.top = `-${scrollY}px`;

2. 현재 스크롤 위치로 top을 이동한다.

 

    bodyStyle.overflowY = "scroll";

3. 스크롤 바가 나타나도록 한다.

 

    bodyStyle.width = "100%";

4. 내용물의 css가 display: flex로 인해 수축하는 것을 막기 위해서 width를 100%로 설정한다.

 

    return () => { ... } ***컴포넌트가 제거될 때***

      bodyStyle.cssText = "";

5. body에 적용 된 인라인 스타일을 모두 제거한다.

 

      window.scrollTo(0, scrollY);

6. 현재 스크롤 위치로 이동시킨다. 


width 설정 안했을 때 축소된 컨테이너 모습


참고글

React에서 Modal 구현하기(feat. createPortal, 스크롤 막기)