overflow-x
수평(가로) 방향의 오버플로우만 제어합니다. 가로 스크롤 가능한 컨테이너(캐러셀, 넓은 테이블)에 자주 사용됩니다.
클래스 목록
| 클래스 | CSS | 설명 |
|---|---|---|
oxv | overflow-x: visible | 기본값. 넘치는 콘텐츠가 그대로 보임 |
oxh | overflow-x: hidden | 넘치는 콘텐츠를 잘라서 숨김 |
oxs | overflow-x: scroll | 항상 가로 스크롤바 표시 |
oxa | overflow-x: auto | 넘칠 때만 가로 스크롤바 표시 |
oxc | overflow-x: clip | 숨기되 스크롤 영역도 생성하지 않음 |
시각적 비교
넓은 콘텐츠가 컨테이너를 초과할 때 각 값의 동작을 비교합니다.
Visible — oxv
콘텐츠가 컨테이너 밖으로 넘침
Hidden — oxh
넘치는 부분이 잘려서 보이지 않음
Auto — oxa
넘칠 때만 가로 스크롤바가 나타남
Scroll — oxs
항상 가로 스크롤바가 표시됨
실제 스크롤 데모
아래 카드 줄은 컨테이너보다 넓습니다. 마우스 휠을 좌우로 굴리거나 트랙패드로 옆으로 밀어보세요. 가로 스크롤바가 생기고 카드가 옆으로 움직입니다.
oxa — oxa df gap16px
자식에 fs0(flex-shrink: 0)을 주지 않으면 카드가 줄어들어 스크롤이 아예 생기지 않습니다. 가로 스크롤 줄을 만들 때 가장 자주 놓치는 부분입니다.
클래스별 상세
oxvoverflow-x: visible
기본값입니다. 넘치는 콘텐츠를 자르지 않고 컨테이너 밖으로 그대로 그립니다. 스크롤 컨테이너가 만들어지지 않습니다.
언제 쓰나
툴팁, 드롭다운, 그림자처럼 부모 밖으로 삐져나와야 하는 요소가 있을 때 기본값 그대로 두면 됩니다. 이미 다른 곳에서 잘림이 걸린 요소를 되돌릴 때 명시적으로 씁니다.
<!-- Dropdown that must escape its narrow parent -->
<div class="oxv pr">
<button class="py8px px16px bg18181B cFAFAFA br8px bn cp">Filter</button>
<ul class="pa t100p l0 w28rem bg0F0F17 b1pxsolid27272A br8px p12px">
<li class="py8px fs14px cA1A1AA">Wider than the button</li>
</ul>
</div>oxhoverflow-x: hidden
넘치는 가로 콘텐츠를 잘라내고 스크롤바도 표시하지 않습니다. 다만 요소는 스크롤 컨테이너가 되므로, 자바스크립트로 scrollLeft를 조작하면 여전히 움직일 수 있습니다.
언제 쓰나
장식용 배경이나 애니메이션 요소가 좌우로 삐져나와 가로 스크롤바를 만드는 것을 막을 때 씁니다.
<!-- Clip a decorative element that sticks out sideways -->
<section class="oxh pr w100p h30rem bg0F0F17 br12px">
<div class="pa t0 l0 w120rem h30rem bg99-102-241-20"></div>
<h2 class="pr fs3-2rem fw700 cFAFAFA p2rem">Hero</h2>
</section>oxsoverflow-x: scroll
넘치든 넘치지 않든 항상 가로 스크롤바 자리를 잡아 둡니다.
언제 쓰나
콘텐츠 길이에 따라 스크롤바가 생겼다 사라지면서 레이아웃이 흔들리는 것이 싫을 때 씁니다. 스크롤바가 항상 보이므로 옆으로 더 볼 내용이 있다는 사실도 드러납니다.
<!-- Timeline where the scrollbar must always be visible -->
<div class="oxs w100p pb12px">
<div class="df gap16px minw60rem">
<div class="fs0 w20rem h8rem bg18181B br8px"></div>
<div class="fs0 w20rem h8rem bg18181B br8px"></div>
<div class="fs0 w20rem h8rem bg18181B br8px"></div>
</div>
</div>oxaoverflow-x: auto
콘텐츠가 넘칠 때만 가로 스크롤바를 표시합니다. 넘치지 않으면 visible처럼 보입니다.
언제 쓰나
가로 캐러셀, 넓은 표, 탭 줄 등 대부분의 가로 스크롤 영역에 쓰는 기본 선택지입니다.
<!-- Card strip: scrollbar only appears when it is needed -->
<div class="oxa df gap16px pb12px">
<div class="fs0 w20rem h8rem bg6366F1 br8px"></div>
<div class="fs0 w20rem h8rem bg6366F1 br8px"></div>
<div class="fs0 w20rem h8rem bg6366F1 br8px"></div>
</div>oxcoverflow-x: clip
hidden처럼 잘라내지만 스크롤 컨테이너를 만들지 않습니다. 그래서 자바스크립트로도 스크롤할 수 없습니다.
언제 쓰나
잘라내기만 하면 되고 스크롤은 절대 필요 없을 때 씁니다. 스크롤 컨테이너가 생기지 않으므로 안쪽의 position sticky 요소가 살아남는다는 장점이 있습니다. 다만 지원 범위가 hidden보다 좁습니다.
<!-- Clip without turning the element into a scroll container -->
<div class="oxc pr w100p h20rem br8px bg0F0F17">
<div class="pa t0 l0 w120rem h20rem bg99-102-241-20"></div>
</div>사용 예시
넓은 표와 카드 캐러셀의 기본 형태입니다.
<!-- Horizontally scrollable table -->
<div class="oxa">
<table class="minw60rem">
<tr><td>Wide table content...</td></tr>
</table>
</div>
<!-- Horizontal scroll card carousel -->
<div class="oxa df gap16px pb12px">
<div class="minw28rem bg18181B p2rem br8px fs0">Card 1</div>
<div class="minw28rem bg18181B p2rem br8px fs0">Card 2</div>
<div class="minw28rem bg18181B p2rem br8px fs0">Card 3</div>
</div>
<!-- Overflow prevention (code block) -->
<div class="oxh maxw100p">
<pre>A very long line of code...</pre>
</div>가로로도 세로로도 스크롤되는 리포트 표입니다. 헤더 행은 position sticky로 위에 고정하고, obxc로 가로 스크롤이 페이지로 전파되지 않게 막았습니다.
<!-- Wide report table with a sticky header row -->
<div class="oxa obxc w100p maxh50vh oya b1pxsolid27272A br8px">
<table class="minw60rem w100p bcc fs14px">
<thead>
<tr>
<th class="ps t0 tal py12px px16px bg18181B cA1A1AA wsn">Region</th>
<th class="ps t0 tal py12px px16px bg18181B cA1A1AA wsn">Owner</th>
<th class="ps t0 tal py12px px16px bg18181B cA1A1AA wsn">Pipeline</th>
<th class="ps t0 tal py12px px16px bg18181B cA1A1AA wsn">Closed won</th>
</tr>
</thead>
<tbody>
<tr>
<td class="py12px px16px bb1pxsolid27272A wsn">APAC</td>
<td class="py12px px16px bb1pxsolid27272A wsn">Kim</td>
<td class="py12px px16px bb1pxsolid27272A wsn">120,000</td>
<td class="py12px px16px bb1pxsolid27272A wsn">48,000</td>
</tr>
</tbody>
</table>
</div>팁 & 주의사항
한쪽 축만 지정하면 다른 축이 auto가 됩니다
overflow-x와 overflow-y 중 한쪽만 visible이 아닌 값을 주면, 브라우저는 나머지 축의 visible을 auto로 바꿉니다. 즉 oxh만 줬는데 세로 스크롤바가 생길 수 있습니다. 세로를 자르고 싶지 않다면 높이 제한을 두지 마세요.
body에 준 oxh가 sticky를 깨뜨립니다
가로 스크롤바를 없애려고 html이나 body에 oxh를 주면, 그 안의 position sticky 요소가 동작을 멈추는 경우가 많습니다. 진짜 원인(삐져나온 요소)을 찾아 그 요소에 잘라내기를 적용하거나, 스크롤 컨테이너를 만들지 않는 oxc를 쓰세요.
flex 자식이 안 줄어들게 해야 스크롤이 생깁니다
df 컨테이너의 자식은 기본적으로 줄어듭니다. fs0이나 최소 너비를 주지 않으면 콘텐츠가 압축되어 가로 스크롤이 생기지 않습니다.
잘림과 접근성
oxh로 감춘 내용은 화면에서 사라질 뿐 문서에는 남아 있습니다. 키보드 포커스가 보이지 않는 영역으로 이동하면 사용자가 길을 잃습니다. 감출 내용이 상호작용 요소라면 잘라내기 대신 실제로 제거하세요.