모바일 메뉴가 화면에 나오면 스크롤이 일어나지 말아야 할 때도 있다.
스크롤 방지를 안 하면
스크롤 방지
모바일 메뉴가 보이면 body에 스타일을 주어 스크롤을 방지한다.
// 모바일 메뉴 오픈시 스크롤 방지
useEffect(() => {
if (showMobileMenu) {
document.body.style.overflowY = "hidden";
document.body.style.position = "fixed";
document.body.style.width = "100%";
document.body.style.height = "100%";
} else {
document.body.style.position = "relative";
document.body.style.overflowY = "auto";
}
}, [showMobileMenu]);
전체 코드
export default function Header() {
// mobileMenu
const [showMobileMenu, setShowMobileMenu] = useState(false);
const handleOpenMenu = () => {
setShowMobileMenu((prev) => !prev);
};
// 스크롤 감지
const [scroll, setScroll] = useState(false);
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, []);
const handleScroll = () => {
if (window.scrollY >= 50) {
setScroll(true);
} else {
setScroll(false);
}
};
// 모바일 메뉴 오픈시 스크롤 방지
useEffect(() => {
if (showMobileMenu) {
document.body.style.overflowY = "hidden";
document.body.style.position = "fixed";
document.body.style.width = "100%";
document.body.style.height = "100%";
} else {
document.body.style.position = "relative";
document.body.style.overflowY = "auto";
}
}, [showMobileMenu]);
return (
<>
<header css={[headerArea, flexStyle]}>
<div className="header-left">
<h3>Test</h3>
</div>
{/* mobileMenu */}
<div css={[mobileMenu]} onClick={handleOpenMenu}>
<HiMenu />
</div>
</header>
{/* mobileMenuBg & content */}
{showMobileMenu && (
<div css={mobileMenuBg} onClick={() => setShowMobileMenu(false)} />
)}
<div css={[mobileMenuContent, { right: showMobileMenu ? 0 : "-80%" }]}>
<div className="menuContent">
<div className="closeBtn" css={[mobileMenu]} onClick={handleOpenMenu}>
<HiOutlineX />
</div>
<div className="scrollAlert">
<p>{scroll ? "스크롤 중" : "..."}</p>
</div>
</div>
</div>
</>
);
}
코드 적용 후
'React' 카테고리의 다른 글
부모에서 자식 / 자식에서 부모 값 전달하기 (0) | 2024.08.25 |
---|---|
모달 오픈 시 body 스크롤 방지 (이전 스크롤 위치 기억) (0) | 2024.08.25 |
react-highlight (0) | 2024.08.25 |
Zustand에 대해 (0) | 2024.08.24 |
React에서 input 관리 (0) | 2024.08.24 |