안녕하세요
스크롤 막기 이벤트 본문
사이드 메뉴를 열면 배경이 스크롤이 되지 않도록 하고 싶을 때
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, 스크롤 막기)
'데이터시각화-KMG' 카테고리의 다른 글
헤더에 엑세스 토큰 보낼 때 "Content-Type": "application/json", (0) | 2023.07.23 |
---|---|
페이지 이동 후 특정 섹션으로 스크롤 이동하기 (0) | 2023.06.22 |
드래그 앤 드롭 이벤트 onDragOver onDragLeave 반복 깜빡거림 문제 해결 (0) | 2023.06.19 |
드래그 앤 드롭 이벤트 (0) | 2023.06.15 |
2차원(이상인) 객체의 깊은 복사: JSON.parse + JSON.stringify (0) | 2023.05.21 |