packagesreacthooksuseLockBodyScroll

useLockBodyScroll

페이지의 스크롤을 제한하는 Hook입니다. 모달이나 팝업이 열렸을 때 배경의 스크롤을 막기 위해 사용합니다.

Props

이름타입설명기본값
isLockedboolean스크롤 잠금 여부false
preventShiftboolean스크롤바 너비만큼 패딩을 추가할지 여부true
preventTouchScrollbooleaniOS Safari에서 터치 스크롤을 방지할지 여부true

Usage

import { useLockBodyScroll } from '@teamsparta/react';
 
function Modal({ isOpen }) {
  useLockBodyScroll({ isLocked: isOpen });
 
  return isOpen ? (
    <div className="modal">
      <h2>모달 내용</h2>
    </div>
  ) : null;
}

Example

기본 모달

function BasicModal() {
  const [isOpen, setIsOpen] = useState(false);
 
  useLockBodyScroll({ isLocked: isOpen });
 
  return (
    <>
      <button onClick={() => setIsOpen(true)}>모달 열기</button>
      {isOpen && (
        <div className="modal">
          <div className="modal-content">
            <h2>모달 내용</h2>
            <button onClick={() => setIsOpen(false)}>닫기</button>
          </div>
        </div>
      )}
    </>
  );
}

레이아웃 시프트 방지 비활성화

function CustomModal() {
  const [isOpen, setIsOpen] = useState(false);
 
  useLockBodyScroll({
    isLocked: isOpen,
    preventShift: false, // 스크롤바 너비만큼 패딩을 추가하지 않음
  });
 
  return (
    <>
      <button onClick={() => setIsOpen(true)}>모달 열기</button>
      {isOpen && (
        <div className="modal">
          <div className="modal-content">
            <h2>모달 내용</h2>
            <button onClick={() => setIsOpen(false)}>닫기</button>
          </div>
        </div>
      )}
    </>
  );
}

모바일 터치 스크롤 허용

function MobileModal() {
  const [isOpen, setIsOpen] = useState(false);
 
  useLockBodyScroll({
    isLocked: isOpen,
    preventTouchScroll: false, // iOS Safari에서 터치 스크롤 허용
  });
 
  return (
    <>
      <button onClick={() => setIsOpen(true)}>모달 열기</button>
      {isOpen && (
        <div className="modal">
          <div className="modal-content">
            <h2>모달 내용</h2>
            <button onClick={() => setIsOpen(false)}>닫기</button>
          </div>
        </div>
      )}
    </>
  );
}

주의사항

  • 여러 컴포넌트에서 동시에 사용할 수 있습니다.
  • 컴포넌트가 언마운트되면 자동으로 스크롤이 복원됩니다.
  • preventShift 옵션으로 스크롤바 너비로 인한 레이아웃 시프트를 방지할 수 있습니다.
  • preventTouchScroll 옵션으로 iOS Safari에서의 터치 스크롤을 제어할 수 있습니다.
  • 스크롤바 너비는 브라우저와 운영체제에 따라 다를 수 있습니다.
  • 모달이나 팝업이 열릴 때만 isLockedtrue로 설정하는 것이 좋습니다.