«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Posts
Today
Total
관리 메뉴

on&on

[React] Modal 출력 시 스크롤 막기 본문

React

[React] Modal 출력 시 스크롤 막기

다느 2023. 5. 9. 01:25

콘텐츠의 길이에 따라 브라우저 사이즈의 크기가 변화하는 것을 막기위해 GlobalStyle로 다음과 같이 지정하였다.

  :root {
    min-width: 1000px;
    overflow-y: scroll;
  }

그리고 useModal custom Hook의 open 함수와 close 함수를 아래와 같이 구현하였다.

  const open = useCallback(() => {
    setIsOpen(() => true);
    document.body.style.overflow = "hidden";
  }, []);

  const close = useCallback(() => {
    setIsOpen(() => false);
    document.body.style.overflow = "unset";  
  }, []);

모달이 open일 때 overflow = 'hidden'을 주었지만, 적용이 안되는 상태....

 

overflow를 hidden으로 주는 방법 대신 modal이 open 상태일 경우, body의 위치를 고정하는 형태로 수정했다.

모달이 close 상태이면 position = 'fixed'를 해제하고 prevScrollY에 저장된 위치로 이동한다.

const preventScroll = () => {
    const currentScrollY = window.scrollY;
    document.body.style.position = "fixed";
    document.body.style.width = "100%";
    document.body.style.top = `-${currentScrollY}px`; 
    return currentScrollY;
};

const allowScroll = (prevScrollY) => {
    document.body.style.position = "";
    document.body.style.width = "";
    document.body.style.top = "";
    window.scrollTo(0, prevScrollY);
};

useEffect(() => {
    if (isOpen) {
      const prevScrollY = preventScroll();
      return () => {
        allowScroll(prevScrollY);
      };
    }
}, [isOpen]);

스크롤바가 사라지지 않으면서 스크롤이 안되는 상태로 적용 완!

Comments