Motile UI

useScrollLock

배경 스크롤을 차단하는 Hook입니다. Modal, Drawer, Sheet 등이 열렸을 때 배경 스크롤을 방지합니다. iOS Safari의 모멘텀 스크롤도 차단하며, 특정 요소는 스크롤을 허용할 수 있습니다.

미리보기

오버레이가 열리면 배경 스크롤이 잠기지만, 내부 스크롤 영역은 스크롤 가능합니다

사용법

1import { useState } from "react";
2import { Button } from "motile-ui";
3import { useScrollLock } from "motile-ui/hooks";
4
5export function ScrollLockDemo() {
6  const [isOpen, setIsOpen] = useState(false);
7
8  useScrollLock({
9    enabled: isOpen,
10    allowedSelectors: ["[data-scroll-allowed]"],
11  });
12
13  return (
14    <div>
15      <Button onClick={() => setIsOpen(true)}>
16        오버레이 열기
17      </Button>
18
19      {isOpen && (
20        <div className="overlay" onClick={() => setIsOpen(false)}>
21          <div className="content" onClick={(e) => e.stopPropagation()}>
22            <h3>useScrollLock 데모</h3>
23            <p>배경 스크롤은 잠겨있습니다</p>
24
25            {/* 스크롤 가능 영역 - data-scroll-allowed 속성 적용 */}
26            <div className="scroll-area" data-scroll-allowed>
27              {Array.from({ length: 20 }, (_, i) => (
28                <div key={i}>스크롤 항목 {i + 1}</div>
29              ))}
30            </div>
31
32            <Button variant="secondary" onClick={() => setIsOpen(false)}>
33              닫기
34            </Button>
35          </div>
36        </div>
37      )}
38    </div>
39  );
40}

API 레퍼런스

속성타입기본값설명
enabledbooleantrue스크롤 락 활성화 여부
allowedSelectorsstring[]["[data-scroll-allowed]", ".sheet-content", ".modal-body"]스크롤을 허용할 CSS 선택자 배열
useScrollLock | Motile UI