color-scheme CSS 속성 및 해당 메타 태그로 어두운 모드 기본 스타일 지정이 개선되었습니다.

color-scheme CSS 속성과 해당 메타 태그를 사용하면 개발자가 페이지를 사용자 에이전트 스타일시트의 테마별 기본값으로 선택할 수 있습니다.

배경

prefers-color-scheme 사용자 환경설정 미디어 기능

prefers-color-scheme 사용자 환경설정 미디어 기능을 사용하면 개발자가 페이지 모양을 완전히 제어할 수 있습니다. 어두운 모드에 대해 잘 모르는 경우 멋진 어두운 모드 환경을 만드는 방법에 관해 내가 알고 있는 모든 것을 문서화한 prefers-color-scheme: 어두운 밤이여, 안녕 도움말을 읽어보세요.

이 도움말에서 간단히 언급된 퍼즐 조각 중 하나는 color-scheme CSS 속성과 동일한 이름의 상응하는 메타 태그입니다. 둘 다 페이지에서 양식 컨트롤, 스크롤바, CSS 시스템 색상과 같은 사용자 에이전트 스타일시트의 테마별 기본값을 선택할 수 있도록 하여 개발자의 작업을 더 쉽게 만들어 줍니다. 동시에 이 기능은 브라우저가 변환을 자체적으로 적용하지 못하도록 합니다.

브라우저 지원

prefers-color-scheme

브라우저 지원

  • Chrome: 76
  • Edge: 79
  • Firefox: 67
  • Safari: 12.1

소스

color-scheme

브라우저 지원

  • Chrome: 81
  • Edge: 81
  • Firefox: 96.
  • Safari: 13

소스

사용자 에이전트 스타일시트

계속하기 전에 사용자 에이전트 스타일시트가 무엇인지 간단히 설명하겠습니다. 대부분의 경우 사용자 에이전트 (UA)라는 단어는 브라우저라는 단어를 멋지게 표현한 것이라고 생각하면 됩니다. UA 스타일시트는 페이지의 기본 모양과 느낌을 결정합니다. 이름에서 알 수 있듯이 UA 스타일시트는 해당 UA에 종속됩니다. Chrome(및 Chromium)의 UA 스타일시트를 확인하고 Firefox 또는 Safari (및 WebKit)와 비교할 수 있습니다. 일반적으로 UA 스타일시트는 대부분 일치합니다. 예를 들어 모두 링크를 파란색으로, 일반 텍스트를 검은색으로, 배경 색상을 흰색으로 설정하지만, 양식 컨트롤의 스타일을 지정하는 방식과 같이 중요한 차이점 (때로는 불편한 차이점)도 있습니다.

WebKit의 UA 스타일시트와 다크 모드와 관련하여 이 스타일시트가 하는 작업을 자세히 살펴보세요. 스타일시트에서 'dark'를 전체 텍스트 검색합니다. 스타일시트에서 제공하는 기본값은 어두운 모드 사용 여부에 따라 달라집니다. 이를 보여주기 위해 다음은 :matches 가상 클래스와 -apple-system-control-background와 같은 WebKit 내부 변수, WebKit 내부 전처리기 디렉티브 #if defined를 사용하는 CSS 규칙 중 하나입니다.

input,
input:matches([type="password"], [type="search"]) {
  -webkit-appearance: textfield;
  #if defined(HAVE_OS_DARK_MODE_SUPPORT) &&
      HAVE_OS_DARK_MODE_SUPPORT
    color: text;
    background-color: -apple-system-control-background;
  #else
    background-color: white;
  #endif
  /* snip */
}

위의 colorbackground-color 속성에는 비표준 값이 몇 개 있습니다. text-apple-system-control-background는 유효한 CSS 색상이 아닙니다. WebKit 내부 시맨틱 색상입니다.

CSS에는 시맨틱 시스템 색상이 표준화되어 있습니다. CSS 색상 모듈 레벨 4에 지정되어 있습니다. 예를 들어 Canvas(<canvas> 태그와 혼동하지 마세요)는 애플리케이션 콘텐츠 또는 문서의 배경에 사용되는 반면 CanvasText는 애플리케이션 콘텐츠 또는 문서의 텍스트에 사용됩니다. 이 두 가지는 함께 사용해야 하며 개별적으로 사용해서는 안 됩니다.

UA 스타일시트는 자체 독점 색상 또는 표준화된 시맨틱 시스템 색상을 사용하여 HTML 요소가 기본적으로 렌더링되는 방식을 결정할 수 있습니다. 운영체제가 어두운 모드로 설정되어 있거나 어두운 테마를 사용하는 경우 CanvasText (또는 text)는 조건부로 흰색으로 설정되고 Canvas (또는 -apple-system-control-background)는 검은색으로 설정됩니다. 그러면 UA 스타일시트는 다음 CSS를 한 번만 할당하고 밝은 모드와 어두운 모드를 모두 적용합니다.

/**
  Not actual UA stylesheet code.
  For illustrative purposes only.
*/
body {
  color: CanvasText;
  background-color: Canvas
}

color-scheme CSS 속성

CSS 색상 조정 모듈 수준 1 사양은 어두운 모드, 대비 조정, 특정 원하는 색 구성표와 같은 사용자 환경설정을 처리하기 위해 사용자 에이전트의 자동 색상 조정에 관한 모델과 제어를 도입합니다.

여기에 정의된 color-scheme 속성을 사용하면 요소가 어떤 색상 구성표로 렌더링할 수 있는지 나타낼 수 있습니다. 이러한 값은 사용자의 환경설정과 협상되어 선택된 색 구성표가 생성되며, 이 색 구성표는 양식 컨트롤 및 스크롤 막대의 기본 색상과 같은 사용자 인터페이스 (UI) 항목과 CSS 시스템 색상의 사용 값에 영향을 미칩니다. 현재는 다음과 같은 값이 지원됩니다.

  • normal 요소가 색 구성표를 전혀 인식하지 않으므로 요소가 브라우저의 기본 색 구성표로 렌더링되어야 함을 나타냅니다.

  • [ light | dark ]+ 요소가 나열된 색 구성표를 인식하고 처리할 수 있음을 나타내며, 색 구성표 간에 순서가 지정된 선호도를 표현합니다.

이 목록에서 light는 밝은 배경 색상과 어두운 전경 색상이 있는 밝은 색 구성표를 나타내고 dark는 어두운 배경 색상과 밝은 전경 색상이 있는 그 반대를 나타냅니다.

모든 요소의 경우 색 구성표로 렌더링하면 요소의 모든 브라우저 제공 UI에서 사용되는 색상이 색 구성표의 의도와 일치해야 합니다. 스크롤 막대, 맞춤법 검사 밑줄, 양식 컨트롤 등이 여기에 해당합니다.

:root 요소에서 색 구성표로 렌더링하면 캔버스의 노출 영역 색상 (즉, 전역 배경 색상), color 속성의 초기 값, 사용된 시스템 색상 값에 영향을 미치고 뷰포트의 스크롤 막대에 영향을 미쳐야 합니다.

/*
  The page supports both dark and light color schemes,
  and the page author prefers dark.
*/
:root {
  color-scheme: dark light;
}

color-scheme 메타 태그

color-scheme CSS 속성을 사용하려면 먼저 CSS를 다운로드하고(<link rel="stylesheet">를 통해 참조되는 경우) 파싱해야 합니다. 사용자 에이전트가 원하는 색 구성표로 페이지 배경을 즉시 렌더링할 수 있도록 color-scheme 값을 <meta name="color-scheme"> 요소에 제공할 수도 있습니다.

<!--
  The page supports both dark and light color schemes,
  and the page author prefers dark.
-->
<meta name="color-scheme" content="dark light">

color-schemeprefers-color-scheme 조합

메타 태그와 CSS 속성 (:root 요소에 적용된 경우) 모두 결국 동일한 동작을 초래하므로 브라우저가 선호하는 색 구성표를 더 빠르게 채택할 수 있도록 항상 메타 태그를 통해 색 구성표를 지정하는 것이 좋습니다.

절대 기준 페이지의 경우 추가 CSS 규칙이 필요하지 않지만 일반적으로 항상 color-schemeprefers-color-scheme와 결합해야 합니다. 예를 들어 WebKit 및 Chrome에서 기존 링크 블루 rgb(0,0,238)에 사용하는 독점 WebKit CSS 색상 -webkit-link는 검은색 배경에서 대비율이 2.23:1로 충분하지 않으며 WCAG AA 및 WCAG AAA 요구사항을 모두 충족하지 않습니다.

이 문제를 해결하기 위해 Chrome, WebKit, Firefox의 버그와 HTML 표준의 메타 문제를 신고했습니다.

prefers-color-scheme와 상호작용

color-scheme CSS 속성과 상응하는 메타 태그가 prefers-color-scheme 사용자 환경설정 미디어 기능과 상호작용하는 방식은 처음에는 혼란스러울 수 있습니다. 실제로 두 가지 기술은 서로 잘 어울립니다. 가장 중요한 점은 color-scheme는 기본 모양만 결정하는 반면 prefers-color-scheme는 스타일 지정 가능한 모양을 결정한다는 것입니다. 이를 더 명확하게 이해하려면 다음 페이지를 가정해 보겠습니다.

<head>
  <meta name="color-scheme" content="dark light">
  <style>
    fieldset {
      background-color: gainsboro;
    }
    @media (prefers-color-scheme: dark) {
      fieldset {
        background-color: darkslategray;
      }
    }
  </style>
</head>
<body>
  <p>
    Lorem ipsum dolor sit amet, legere ancillae ne vis.
  </p>
  <form>
    <fieldset>
      <legend>Lorem ipsum</legend>
      <button type="button">Lorem ipsum</button>
    </fieldset>
  </form>
</body>

페이지의 인라인 CSS 코드는 일반적으로 <fieldset> 요소의 background-colorgainsboro로 설정하고, 사용자가 prefers-color-scheme 사용자 환경설정 미디어 기능에 따라 dark 색 구성표를 선호하는 경우 darkslategray로 설정합니다.

<meta name="color-scheme" content="dark light"> 요소를 통해 페이지는 어두운 테마를 선호하면서 어두운 테마와 밝은 테마를 모두 지원한다고 브라우저에 알립니다.

운영체제가 어두운 모드로 설정되어 있는지 밝은 모드로 설정되어 있는지에 따라 사용자 에이전트 스타일시트를 기반으로 전체 페이지가 어두운 모드에서 밝은 모드로 표시되거나 그 반대로 표시됩니다. 페이지의 단락 텍스트나 배경 색상을 변경하는 데 관련된 추가 개발자 제공 CSS는 없습니다.

페이지에서 개발자가 제공한 인라인 스타일시트의 규칙에 따라 어두운 모드 사용 여부에 따라 <fieldset> 요소의 background-color가 어떻게 변경되는지 확인합니다. gainsboro 또는 darkslategray입니다.

밝은 모드의 페이지
밝은 모드: 개발자와 사용자 에이전트가 지정한 스타일입니다. 사용자 에이전트 스타일시트에 따라 텍스트는 검은색이고 배경은 흰색입니다. <fieldset> 요소의 background-color는 인라인 개발자 스타일시트에 따라 gainsboro입니다.
어두운 모드의 페이지
어두운 모드: 개발자와 사용자 에이전트가 지정한 스타일입니다. 사용자 에이전트 스타일시트에 따라 텍스트는 흰색이고 배경은 검은색입니다. <fieldset> 요소의 background-color는 인라인 개발자 스타일시트에 따라 darkslategray입니다.

<button> 요소의 모양은 사용자 에이전트 스타일시트로 제어됩니다. colorButtonText 시스템 색상으로 설정되고 background-color 및 4개의 border-color는 시스템 색상 ButtonFace로 설정됩니다.

ButtonFace 속성을 사용하는 밝은 모드 페이지
밝은 모드: background-color 및 다양한 border-colorButtonFace 시스템 색상으로 설정됩니다.

이제 <button> 요소의 border-color가 어떻게 변경되는지 확인합니다. 사용자 에이전트가 색 구성표에 따라 ButtonFace를 동적으로 업데이트하므로 border-top-colorborder-bottom-color계산된 값이 rgba(0, 0, 0, 0.847) (검은색)에서 rgba(255, 255, 255, 0.847) (흰색)로 전환됩니다. 상응하는 시스템 색상 ButtonText로 설정된 <button> 요소의 color에도 동일하게 적용됩니다.

계산된 색상 값이 ButtonFace와 일치하는 것을 보여줍니다.
밝은 모드: 사용자 에이전트 스타일시트에서 모두 ButtonFace로 설정된 border-top-colorborder-bottom-color의 계산된 값이 이제 rgba(0, 0, 0, 0.847)입니다.
어두운 모드에서도 계산된 색상 값이 ButtonFace와 일치함을 보여줍니다.
어두운 모드: 사용자 에이전트 스타일시트에서 모두 ButtonFace로 설정된 border-top-colorborder-bottom-color의 계산된 값이 이제 rgba(255, 255, 255, 0.847)입니다.

데모

Glitch의 데모에서 많은 수의 HTML 요소에 적용된 color-scheme의 효과를 확인할 수 있습니다. 이 데모에서는 위에 나온 경고에 언급된 링크 색상으로 WCAG AA 및 WCAG AAA 위반고의로 보여줍니다.

밝은 모드에서 실행되는 데모
데모color-scheme: light로 전환되었습니다.
어두운 모드에서 실행되는 데모
데모color-scheme: dark로 전환되었습니다. 링크 색상으로 WCAG AA 및 WCAG AAA 위반 을 확인할 수 있습니다.

감사의 말씀

color-scheme CSS 속성과 상응하는 메타 태그는 룬 릴레스베인님이 구현했습니다. 룬은 CSS 색상 조정 모듈 수준 1 사양의 공동 편집자이기도 합니다. Unsplash필립 레온님 제공 히어로 이미지