Menu

CSS overflow: hidden, scroll, auto, clip, 말줄임

overflow는 상자에 들어가지 않는 콘텐츠를 어떻게 할지 정해요. 보여 주거나, 잘라 내거나, 스크롤바를 추가해요. visible, hidden, scroll, auto, clip, overflow-x와 overflow-y, 텍스트 말줄임, overflow가 레이아웃에 주는 부작용을 알아봐요.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

overflow가 하는 일

콘텐츠가 상자보다 크면(고정 높이, 긴 단어, 넓은 표) 넘쳐요. overflow 속성은 넘친 부분을 어떻게 할지 정해요.

값보이는 모습스크롤 컨테이너
visible (기본값)콘텐츠가 상자 밖으로 흘러나와 뒤에 오는 것과 겹쳐요아니요
hiddenpadding 가장자리에서 잘리고 스크롤바가 없어요(스크립트로는 스크롤돼요)네
clip잘리고, 스크립트로도 전혀 스크롤되지 않아요아니요
scroll콘텐츠가 들어가도 항상 스크롤바를 보여 줘요네
auto콘텐츠가 들어가지 않을 때만 스크롤바네

macOS와 휴대폰에서는 스크롤바가 콘텐츠 위에 겹쳐 보이다가 사라져서, 스크롤하기 전까지는 scroll과 auto가 똑같아 보일 수 있어요.

스크롤되는 상자 만들기

상자는 무언가가 크기를 제한할 때만 넘쳐요. height나 max-height에 overflow-y: auto를 더하면 긴 목록이 스크롤 패널이 돼요.

여기서는 height보다 max-height가 더 좋아요. 짧은 목록은 짧게 남고, 긴 목록만 스크롤돼요. 안에 포커스할 수 있는 콘텐츠가 없는 스크롤 영역에는 tabindex="0"을 줘서 키보드 사용자도 스크롤할 수 있게 하세요.

overflow-x와 overflow-y

두 축은 따로 지정할 수 있어요. 흔한 용도는 넓은 표가 페이지 전체를 넓히는 대신 컨테이너 안에서 옆으로 스크롤되게 하는 거예요.

기억할 규칙이 하나 있어요. 한 축이 hidden, scroll, auto이면 다른 축의 visible 값은 auto가 돼요. 그래서 overflow-x: hidden만 써도 예상치 못한 세로 스크롤바가 생길 수 있어요. overflow-x: clip에는 그런 효과가 없어요.

.a { overflow-x: hidden; }  /* overflow-y computes to auto */
.b { overflow-x: clip; }    /* overflow-y stays visible */

말줄임표로 텍스트 자르기

text-overflow: ellipsis는 잘린 줄 끝을 "…"로 바꿔요. 제한된 너비, 줄바꿈되지 않는 텍스트, 숨겨진 overflow 세 가지가 함께 필요해요.

-webkit- 접두사가 붙은 line clamp는 Chrome, Firefox, Safari에서 동작해요. 스크린 리더는 여전히 전체 텍스트를 읽어서 잘린 단어를 잃지 않아요.

overflow의 부작용

overflow를 visible이나 clip이 아닌 값으로 지정하면 잘라 내는 것 이상의 일이 생겨요.

  • float과 자식 margin을 품어요. 요소가 새 블록 서식 맥락을 만들어서 float된 자식을 감싸도록 커져요. display: flow-root는 아무것도 잘라 내지 않고 같은 일을 해요.
  • 그 아래의 position: sticky를 망가뜨려요. sticky 자식은 가장 가까운 스크롤 컨테이너에 붙는데, 그 컨테이너가 스크롤되지 않으면 아무것도 붙지 않아요.
  • absolute 자식을 잘라 내요(넘치는 요소가 그 자식들의 포함 블록이기도 할 때). 드롭다운과 툴팁도 포함되고, 자식의 box shadow도 잘려요.

스크롤바 숨기기

scrollbar-width: none으로 상자를 스크롤 가능하게 유지하면서 스크롤바만 숨길 수 있어요. 아껴 쓰세요. 스크롤바가 없으면 많은 독자가 콘텐츠가 더 있다는 걸 알아차리지 못해요. scrollbar-gutter: stable은 반대 역할을 해요. 스크롤바 자리를 미리 잡아서 스크롤바가 나타날 때 콘텐츠가 밀리지 않게 해요.

자주 하는 실수

  • 크기 제한 없이 overflow를 기대하기. height나 max-height가 없는 상자는 넘치지 않고 커져요.
  • 가로 스크롤을 "고치려고" body에 overflow: hidden. 대신 너무 넓은 요소를 찾으세요(흔히 고정 width, 긴 URL, 스크롤바가 있을 때의 100vw예요).
  • white-space: nowrap 없는 말줄임. 텍스트가 줄바꿈되니 가로로 넘치는 게 없고 말줄임표도 나타나지 않아요.
  • overflow-x: hidden이 세로 스크롤바를 만들기. clip을 쓰세요.
  • 카드에 잘리는 드롭다운. 카드의 overflow: hidden이 잘라 내요. overflow 규칙을 옮기거나 드롭다운을 바깥에 렌더링하세요.

자주 묻는 질문

overflow: hidden은 무엇을 하나요?

요소의 padding 상자 안에 들어가지 않는 콘텐츠를 스크롤바 없이 잘라 내요. 숨겨진 부분은 스크립트로, 또는 안에 있는 무언가에 포커스를 주면 여전히 스크롤될 수 있어요.

overflow auto와 scroll은 무엇이 다른가요?

scroll은 콘텐츠가 들어가도 항상 스크롤바 자리를 잡아요. auto는 콘텐츠가 상자보다 클 때만 스크롤바를 보여 주고, 보통은 이게 원하는 동작이에요.

div를 스크롤되게 하려면 어떻게 하나요?

크기를 제한하고 스크롤을 허용해요. max-height: 300px; overflow-y: auto; height나 max-height 제한이 없으면 div는 콘텐츠와 함께 커져서 절대 넘치지 않아요.

overflow-x: hidden이 세로 스크롤바까지 추가하는 이유는 무엇인가요?

한 축이 hidden, scroll, auto이면 다른 축의 visible 값은 auto로 계산돼요. 대신 overflow-x: clip을 쓰세요. 스크롤 컨테이너를 만들지 않고 다른 축은 visible로 남겨 둬요.

넘치는 텍스트에 말줄임표(...)는 어떻게 넣나요?

한 줄이라면 너비가 제한된 요소에 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;를 쓰세요. 여러 줄이라면 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;을 쓰세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기