목표: 전체 화면이 아닌 특정 내부 컴포넌트(
MenuGrid등)에만 스크롤을 적용하기
어떤 요소에 flex: 1과 overflowY: auto를 주고 스크롤이 되게 하려면,
그 요소의 모든 상위 요소들이 아래 조건을 모두 만족해야 한다.
| 설정 항목 | 설명 |
|---|---|
display: flex | flex 레이아웃을 적용하여 flex: 1이 동작할 수 있게 함 |
flexDirection: column | 수직으로 요소들을 쌓을 수 있도록 설정 |
height: 100% 또는 height: 100vh | 자식 요소가 어느 정도 높이로 커질지 계산 가능하게 함 |
<div style={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
<AppBar />
<div style={{ flex: 1, overflow: 'hidden' }}>
<Outlet />
</div>
<BottomNav />
</div>
<div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
<HorizontalDatePicker />
<Tabs />
<div style={{ flex: 1, overflowY: 'auto' }}>
<MenuGrid />
</div>
</div>
const TabPanel = ({ children, value, index }) => (
<div hidden={value !== index} style={{ height: '100%' }}>
{value === index && children}
</div>
);
| 문제 | 원인 |
|---|---|
| 스크롤이 안 생김 | 부모 요소 중 하나가 height를 지정하지 않음 |
flex: 1이 동작하지 않음 | 부모 요소가 flex container가 아님 |
| 전체 화면이 스크롤됨 | html, body, #root에 overflow: scroll이 설정됨 |
html, body, #root {
height: 100%;
margin: 0;
overflow: hidden;
}
내부 특정 컴포넌트만 스크롤되게 만들기 위해서는:
display: flex, flexDirection: column을 가지고 있어야 함height를 명시해줘야 함 (100% 또는 100vh)flex: 1과 overflowY: auto를 적용이 규칙은 #root까지 모든 계층에 적용되어야 한다.