오버플로우와 스크롤 컨테이너

Overflow & scroll containers

콘텐츠가 상자보다 클 때 무슨 일이 벌어지는지를 정하는 `overflow` 네 가지 값 — 넘치게 두거나, 자르거나, 스크롤을 만들거나.

다른 이름: overflow: auto/hidden/scroll/clip
···
html
<div class="wrap" id="wrap">
  <div class="cell"><b>visible</b><div class="box vis"><i></i><i></i><i></i><i></i></div></div>
  <div class="cell"><b>hidden</b><div class="box hid"><i></i><i></i><i></i><i></i></div></div>
  <div class="cell"><b>scroll</b><div class="box scr"><i></i><i></i><i></i><i></i></div></div>
  <div class="cell"><b>auto</b><div class="box aut"><i></i><i></i><i></i><i></i></div></div>
</div>
css
.wrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:18px 14px;row-gap:44px;
  width:min(94%,480px);transition:width 2.6s cubic-bezier(.4,0,.2,1)}
.cell{display:flex;flex-direction:column;align-items:center;gap:6px}
.cell b{font:700 10px/1 ui-monospace,monospace;color:var(--muted)}
.box{position:relative;width:72px;height:56px;border:2px solid var(--line);border-radius:8px;background:var(--surface)}
.vis{overflow:visible}
.hid{overflow:hidden}
.scr{overflow:scroll}
.aut{overflow:auto}
.box i{display:block;height:13px;margin:4px 8px;border-radius:3px;background:var(--accent)}
.box i:nth-child(even){background:var(--accent-3)}
js
const wrap = document.getElementById('wrap');
setInterval(() => wrap.style.width = wrap.style.width === '48%' ? 'min(94%, 480px)' : '48%', 2600);

`overflow: visible`(기본값)은 아무 조치도 취하지 않습니다 — 콘텐츠가 상자 경계를 그냥 넘어가서 옆·아래 요소와 겹칠 수 있습니다. `hidden`은 넘치는 부분을 잘라내고 스크롤 수단은 전혀 제공하지 않습니다 — 사용자는 잘린 내용을 볼 방법이 없습니다. `scroll`은 실제로 넘치든 안 넘치든 스크롤바를 항상 표시하고, `auto`는 콘텐츠가 실제로 넘칠 때만 스크롤바를 만듭니다 — 대부분의 "스크롤되는 영역"은 `auto`가 정답입니다.

`clip`(비교적 최근 값)은 `hidden`과 비슷하게 자르지만 스크롤을 **프로그래밍적으로도** 막습니다 — `hidden`은 `scrollTo()` 같은 JS로 몰래 스크롤시킬 수 있지만 `clip`은 그마저 안 됩니다. 또 `overflow-clip-margin`으로 "경계에서 몇 px까지는 봐준다"는 여유를 줄 수 있어 그림자 등이 살짝 걸쳐도 안 잘리게 만들 수 있습니다.

가로·세로를 따로 지정하려면 `overflow-x`·`overflow-y`를 씁니다. 흔한 실수는 `overflow: hidden`을 부모에 걸어뒀는데 그 부모가 `position: sticky` 자식을 품고 있는 경우입니다 — sticky는 스크롤 가능한 가장 가까운 조상의 `overflow`가 `visible`이 아니면 작동을 멈춥니다.

언제 쓰나

모달 안 긴 목록, 채팅창, 코드 블록처럼 "화면 크기는 고정하고 안의 내용만 스크롤되게" 만들 때 `auto`가 기본값입니다. 디자인 요소가 상자 밖으로 살짝 삐져나오는 의도된 효과라면 `visible`을 그대로 둡니다.