본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Frontend

테마와 다크 모드 구현: theme-color, color-scheme, accent-color

작성 2026. 10. 17.추가
목차8개 항목
출처와 참고

web.dev의 「Learn Responsive Design」 강좌의 Theming 모듈을 바탕으로, 속성 이름과 지원 범위는 MDN으로 확인해 재구성한 노트다.

테마가 닿는 곳

반응형은 화면 크기뿐 아니라 사용자 설정에도 반응한다. 다크 모드가 대표적이다. 다크 모드가 왜 필요한지, 대비 기준은 무엇인지는 색과 움직임의 접근성에, 색 변수를 팔레트·기능·컴포넌트로 나누는 설계는 CSS 커스텀 속성으로 색상 체계 짜기에 있다. 이 노트는 테마를 끝까지 적용하는 체크리스트다.

대상누가 그리나도구
주소창·상태 표시줄브라우저<meta name="theme-color">, 매니페스트 theme_color
본문 배경·글자·테두리내 CSS커스텀 속성 + prefers-color-scheme 또는 light-dark()
기본 폼 컨트롤·스크롤바브라우저color-scheme
체크박스·라디오·범위·진행 막대의 강조색브라우저accent-color
인라인 SVG 아이콘내 CSScurrentColor, 커스텀 속성
사진·지도이미지 파일filter, <picture>의 media
파비콘이미지 파일SVG 파비콘 안의 @media (prefers-color-scheme)

1. 브라우저 UI: theme-color

<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#111111" media="(prefers-color-scheme: dark)">
  • HTML에 두는 이유는 CSS를 기다리지 않고 페이지가 열리자마자 브라우저 UI를 칠하기 위해서다.
  • JavaScript로 바꿀 수 있지만 자주 바꾸면 사용자를 피곤하게 한다. 바꾸더라도 은은하게 바꾼다.
  • 홈 화면에 추가된 앱의 색은 웹 앱 매니페스트의 theme_color·background_color가 정한다. 어느 브라우저가 이 값을 쓰는지는 문서 head와 메타데이터에 있다.

2. 페이지 색: 커스텀 속성을 한 번만 재정의

선택자마다 다크 모드 규칙을 다시 쓰면 색이 바뀔 때마다 두 곳을 고친다. 색을 변수에 담고 미디어 쿼리 안에서는 변수만 바꾼다.

:root {
  color-scheme: light dark;
  --page: white;
  --ink: black;
  --accent: #c00;
}
@media (prefers-color-scheme: dark) {
  :root {
    --page: #111;
    --ink: #eee;
    --accent: pink;          /* 어두운 테마에서는 브랜드 색을 한 단계 누그러뜨린다 */
  }
}
 
body   { background-color: var(--page); color: var(--ink); }
button { background-color: var(--ink);  color: var(--page); }
:root  { accent-color: var(--accent); }

같은 일을 미디어 쿼리 없이 color: light-dark(black, #eee)로 쓸 수도 있다. 이 함수는 color-scheme이 선언돼 있어야 동작한다.

시스템 설정 + 사용자 선택

시스템 설정을 기본으로 따르되 사이트 안에서도 바꿀 수 있게 하려면, color-scheme 자체를 바꾼다. light-dark()로 쓴 색이 모두 따라온다.

:root                     { color-scheme: light dark; }  /* 기본: 시스템을 따른다 */
:root[data-theme="light"] { color-scheme: light; }
:root[data-theme="dark"]  { color-scheme: dark; }
 
body { background: light-dark(white, #111); color: light-dark(black, #eee); }

선택값은 저장해 두고 첫 렌더 전에 data-theme을 붙인다. 늦게 붙이면 밝은 화면이 한 번 번쩍인다.

3. 브라우저가 그리는 부분: color-scheme

color-scheme은 이 요소가 어떤 색 체계로 그려져도 되는지 브라우저에 알린다. dark가 들어 있으면 브라우저는 입력란·버튼·스크롤바·기본 배경을 어두운 기본 스타일로 그린다. 이것 없이 배경만 검게 칠하면 흰 입력란과 흰 스크롤바가 남는다.

값뜻
normal지정 안 함. 페이지 기본(대개 밝음)
light / dark그 체계만
light dark둘 다 된다. 사용자 설정을 따른다
only light브라우저가 자동으로 어둡게 바꾸는 기능도 막는다

CSS가 내려오기 전부터 적용하려면 meta로도 선언한다. 과거 초안의 supported-color-schemes가 아니라 color-scheme이 표준 이름이다.

<meta name="color-scheme" content="light dark">

4. 폼 강조색: accent-color

:root { accent-color: var(--accent); }

체크박스, 라디오 버튼, <input type="range">, <progress>의 강조색을 한 줄로 브랜드 색에 맞춘다. 컨트롤을 직접 다시 만들지 않아도 된다. 브라우저는 강조색에 맞춰 체크 표시 색을 대비가 나게 고른다. Baseline 2022다.

5. 아이콘과 이미지

대상방법
인라인 SVG 아이콘fill: currentColor 또는 stroke: var(--ink). 글자색이 바뀌면 함께 바뀐다(SVG 아이콘)
사진어두운 테마에서 img { filter: brightness(.8) contrast(1.2); }로 눈부심을 줄인다
지도·도표처럼 통째로 바꿔야 하는 이미지<picture>의 <source media="(prefers-color-scheme: dark)">로 어두운 판을 준다
SVG 파비콘SVG 안 <style>에 @media (prefers-color-scheme: dark)를 넣는다. 브라우저마다 지원이 다르다
<picture>
  <source srcset="map-dark.png" media="(prefers-color-scheme: dark)">
  <img src="map-light.png" alt="매장 위치 지도">
</picture>

<picture>의 다른 쓰임(아트 디렉션, 새 형식 대체)은 반응형 이미지에 있다.

정리

  • 테마는 브라우저 UI(theme-color), 브라우저 기본 컨트롤(color-scheme), 강조색(accent-color), 내 CSS, 아이콘, 이미지까지 모두 바꿔야 끝난다.
  • 색 값은 커스텀 속성에 모으고 미디어 쿼리에서는 변수만 바꾼다. 아니면 light-dark()로 한 줄에 둘 다 쓴다.
  • 사용자 선택을 지원할 때는 color-scheme을 바꾸고, 첫 렌더 전에 적용해 깜빡임을 막는다.

관련 노트: CSS 커스텀 속성으로 색상 체계 짜기, 색과 움직임의 접근성, 미디어 쿼리 문법과 미디어 기능, 문서 head와 메타데이터, SVG 아이콘

원본 기록4

댓글

GitHub 계정으로 댓글을 남길 수 있어요.