🏷️ 개발,

CSS로 웹사이트 스크롤바 커스터마이징하기(NO JavaScript)

위린이 위린이 · 3 mins read
CSS로 웹사이트 스크롤바 커스터마이징하기(NO JavaScript)

스크롤바는 작은 영역이지만 UI 관점에서 무시하기엔 아쉬운 요소다. CSS만으로 커스터마이징할 수 있다.

표준 속성 (권장)

Chrome 121+, Firefox 64+, Edge 121+, Safari 18.2+에서 scrollbar-colorscrollbar-width를 지원한다. 이게 현재 권장 방식이다.

body {
  scrollbar-width: thin; /* auto | thin | none */
  scrollbar-color: #babac0 #fff; /* thumb-color track-color */
}

두 줄이면 대부분의 경우 충분하다. -webkit-scrollbar보다 세밀한 조정은 안 되지만, 표준이라는 점이 핵심이다.

macOS와 iOS는 오버레이 스크롤바라 스타일링 차이가 크게 티 나지 않지만, Windows는 항상 스크롤바 공간을 차지하는 방식이라 디자인 일관성을 위해 조정이 필요하다. 모바일 브라우저는 대부분 오버레이 방식이라 건드릴 여지가 적다. 한동안 -webkit-scrollbar에만 의존해왔는데 표준 속성이 안정화되면서 상황이 바뀌었다. 기본은 표준 속성으로 가고, 더 정밀한 스타일링이 필요한 경우에만 웹킷 가상 요소를 폴백으로 두는 게 요즘 권장 패턴이다.

-webkit-scrollbar (레거시)

border-radius나 border 같은 세밀한 스타일링이 필요하면 -webkit-scrollbar 가상 요소를 쓸 수 있다. Chromium과 Safari에서 동작한다.

주의: Chrome 121부터 표준 속성과 -webkit-scrollbar가 동시에 있으면 표준 속성이 우선한다. @supports로 분리하는 게 안전하다.

/* 표준 속성 우선 */
body {
  scrollbar-width: thin;
  scrollbar-color: #babac0 #fff;
}

/* 표준 미지원 브라우저용 폴백 */
@supports not (scrollbar-width: thin) {
  body::-webkit-scrollbar {
    background-color: #fff;
    width: 16px;
  }

  body::-webkit-scrollbar-track {
    background-color: #fff;
  }

  body::-webkit-scrollbar-thumb {
    background-color: #babac0;
    border-radius: 16px;
    border: 4px solid #fff;
  }

  body::-webkit-scrollbar-button {
    display: none;
  }
}

가상 요소 목록

::-webkit-scrollbar              /* 스크롤바 전체 영역 */
::-webkit-scrollbar-button       /* 상하 방향 버튼 */
::-webkit-scrollbar-track        /* 스크롤바 트랙 */
::-webkit-scrollbar-track-piece  /* thumb이 덮지 않는 영역 */
::-webkit-scrollbar-thumb        /* 드래그 가능한 스크롤바 본체 */
::-webkit-resizer                /* 하단 리사이저 */
::-webkit-scrollbar-corner       /* 하단 코너 */

-webkit-scrollbar-button은 상하 방향 화살표인데 대부분의 경우 display: none으로 숨기는 게 깔끔하다. track-piece는 thumb이 덮지 않는 영역만 별도로 스타일링할 때 쓰고, 단순 배경만 바꾸려면 track으로 충분하다. 폴백 블록에서 @supports not (scrollbar-width: thin)을 쓰면 표준 지원 브라우저에서 웹킷 스타일이 자동으로 무시되므로 중복 적용 걱정은 없다. border-radius, border 같은 세밀한 조정은 표준 속성으로 불가능해서 웹킷 가상 요소가 여전히 유용한 지점이다.


적용 예제

macOS 스타일 스크롤바를 크로스 브라우저로 적용하는 최소 코드다.

/* 표준 */
body {
  scrollbar-width: thin;
  scrollbar-color: #babac0 #fff;
}

/* Webkit 폴백 */
@supports not (scrollbar-width: thin) {
  body::-webkit-scrollbar {
    background-color: #fff;
    width: 16px;
  }

  body::-webkit-scrollbar-track {
    background-color: #fff;
  }

  body::-webkit-scrollbar-thumb {
    background-color: #babac0;
    border-radius: 16px;
    border: 4px solid #fff;
  }
}

브라우저 지원

scrollbar-colorscrollbar-width는 Chrome 121+, Edge 121+, Firefox 64+, Safari 18.2+에서 지원한다. 구형 브라우저는 -webkit-scrollbar가 폴백으로 동작한다.

최신 지원 현황은 caniuse.com에서 확인할 수 있다.

주의할 부분은 thumb과 track의 색상 대비다. 밝은 배경에 옅은 thumb 색상을 쓰면 사용자가 스크롤 여부를 알아보기 힘들어져 접근성 이슈가 된다. WCAG 기준 3:1 이상의 명도 대비를 권장한다. 다크 모드까지 고려한다면 :root[data-theme=dark]에 각각 scrollbar-color를 선언해 테마 전환에 맞춰 따라가게 하는 패턴이 가장 깔끔하다.

브라우저 지원 현황

위린이

Written by ✍️ 위린이

위스키 테이스팅, 자동차, 투자·부동산, 맛집, 개발을 기록하는 위린이