flex-1에 스크롤이 생기지 않는다면?
❗ 문제 상황
1
2
3
4
5
6
<body class="h-screen flex flex-col">
<header class="h-16 bg-gray-200">헤더</header>
<main class="flex-1 overflow-y-auto bg-white">
<div class="h-[2000px]">길게 넘치는 콘텐츠</div>
</main>
</body>
위와 같은 상황에서 부모에 height도 지정했고 나머지 영역이 flex:1로 잡히는 것을 볼 수 있었다. 하지만 자식 요소가 넘쳐났을 때 영역이 늘어나기만 하고 스크롤이 생기지 않았다.
💡 문제 원인 찾기
flex:1 은 실제로 아래와 같이 해석된다.
1
2
3
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
flex-grow: 1 → 남는 공간이 있을 때, 이 요소가 비율 1만큼 차지해서 늘어난다.
flex-shrink: 1 → 공간이 부족할 때 비율 1만큼 줄어들 수 있다.
flex-basis: 0% → 요소의 기본 크기는 0으로 설정된다. 즉, 오로지 남는 공간을 기준으로 크기를 조절함.
기본적으로 Flex 컨테이너 내부의 요소는 min-height: auto
속성을 가지고 있어, 자식 콘텐츠의 크기를 고려해서 자신을 늘릴 수 있게 설정되어 있다.
그래서 flex-1
로 공간을 제한했더라도, 자식 콘텐츠가 크면 컨테이너도 같이 커져버려서 스크롤이 아닌 부모 밖으로 콘텐츠가 넘치는 현상이 발생한다.
결과적으로, overflow-y-auto가 있어도 자식이 커지면 flex-1 영역도 같이 커져버린다.
overflow-y-auto
는 내부 콘텐츠가 부모보다 클 때만 스크롤이 생긴다. 하지만 현재 상황에선 부모 요소(flex-1
)가 자식 높이를 따라 계속 커지기 때문에, 스크롤이 생기기 전에 공간이 늘어나버리는 문제가 생긴 것이다.
💡 문제 해결
1
2
3
4
5
6
<body class="h-screen flex flex-col">
<header class="h-16 bg-gray-200">헤더</header>
<main class="flex-1 overflow-y-auto min-h-0 bg-white">
<div class="h-[2000px]">길게 넘치는 콘텐츠</div>
</main>
</body>
✅ 체크리스트 🔍
- overflow-y-auto 있음? -> 스크롤 유도
- flex-1 부모가 height를 가지고 있나? -> (h-screen, h-full, 등)
- min-h-0을 줬는가? -> 자식 높이 제한
This post is licensed under CC BY 4.0 by the author.