글을 불러오는 중…
글을 불러오는 중…
아래는 "Radix UI Popover의 Portal로 인한 모달 내 스크롤 문제 트러블슈팅"을 범용적인 용어로 정리한 마크다운 예시입니다. 문제 상황 React 프로젝트에서 Radix UI의 Popover 컴포넌트를 사용해 검색어 추천/최근 검색어 팝업을 구현했습니다. 이 컴포넌트를…
아래는 "Radix UI Popover의 Portal로 인한 모달 내 스크롤 문제 트러블슈팅"을 범용적인 용어로 정리한 마크다운 예시입니다.
React 프로젝트에서 Radix UI의 Popover 컴포넌트를 사용해 검색어 추천/최근 검색어 팝업을 구현했습니다. 이 컴포넌트를 모달(LayerPage 등) 내부에서 사용할 때, 팝업 내 스크롤 영역(예: 최근 검색어 리스트)이 스크롤되지 않는 현상이 발생했습니다.
Popover 내 스크롤 영역에 max-height와 overflow-y: auto를 적용했음에도 스크롤이 동작하지 않음
동일 컴포넌트를 일반 페이지에서 사용할 때는 정상적으로 스크롤됨
Radix UI의 Popover는 기본적으로 Portal을 사용하여,
Popover의 Content를 DOM의 최상단(body 등)으로 렌더링합니다.
이로 인해 다음과 같은 문제가 발생할 수 있습니다.
모달의 부모 엘리먼트(오버레이, 컨테이너 등)에 overflow: hidden 또는 clip이 적용되어 있을 경우,
**body에 overflow: hidden**이 적용되는 경우,
Radix UI의 Popover에서 <Popover.Portal>을 제거하여,
Popover Content가 모달 내부의 DOM 트리에 렌더링되도록 변경합니다.
<Popover.Root open={open} onOpenChange={onOpenChange}>
<Popover.Anchor asChild>{anchor}</Popover.Anchor>
<Popover.Portal>
<Popover.Content>
{/* ... */}
</Popover.Content>
</Popover.Portal>
</Popover.Root>
<Popover.Root open={open} onOpenChange={onOpenChange}>
<Popover.Anchor asChild>{anchor}</Popover.Anchor>
<Popover.Content>
{/* ... */}
</Popover.Content>
</Popover.Root>
container prop을 활용해,
모달 내부의 특정 DOM 노드에 Content를 렌더링하도록 지정할 수도 있습니다.Popover Content가 모달 내부에 렌더링되면서,
스크롤 영역(overflow-y: auto)이 정상적으로 동작함
모달의 오버레이/컨테이너의 overflow 스타일에 영향을 받지 않음
Radix UI Popover 등 Portal 기반 컴포넌트를 모달 내부에서 사용할 때는 Portal이 의도치 않게 스크롤/레이어링 문제를 유발할 수 있으니, Portal 사용 여부를 상황에 맞게 조정하는 것이 중요합니다.