Ulepszyliśmy domyślny styl trybu ciemnego za pomocą właściwości CSS schematu kolorów i odpowiedniego metatagu.

Właściwość CSS color-scheme i odpowiedni tag meta umożliwiają deweloperom włączenie na stronach domyślnych ustawień arkusza stylów klienta użytkownika, które są specyficzne dla danego motywu.

Tło

Funkcja multimedialna prefers-color-scheme user preference

Funkcja multimedialna prefers-color-scheme preferencji użytkownika daje deweloperom pełną kontrolę nad wyglądem stron. Jeśli nie znasz tego trybu, przeczytaj mój artykuł prefers-color-schemeHello darkness, my old friend, w którym opisałem wszystko, co wiem o tworzeniu niesamowitych wrażeń w trybie ciemnym.

Jednym z elementów układanki, o którym wspomniano tylko krótko w artykule, jest właściwość CSS color-scheme i odpowiedni tag meta o tej samej nazwie. Obie te funkcje ułatwiają pracę deweloperom, ponieważ pozwalają włączyć na stronie domyślne ustawienia arkusza stylów klienta użytkownika, takie jak elementy sterujące formularza, paski przewijania czy systemowe kolory CSS. Jednocześnie ta funkcja uniemożliwia przeglądarkom samodzielne stosowanie przekształceń.

Obsługa przeglądarek

prefers-color-scheme

Browser Support

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

Source

color-scheme

Browser Support

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

Source

Arkusz stylów klienta użytkownika

Zanim przejdę dalej, wyjaśnię, czym jest arkusz stylów klienta użytkownika. W większości przypadków słowo klient użytkownika (UA) to po prostu inne określenie przeglądarki. Arkusz stylów UA określa domyślny wygląd strony. Jak sama nazwa wskazuje, arkusz stylów UA zależy od danego UA. Możesz zapoznać się z arkuszem stylów UA Chrome (i Chromium) i porównać go z arkuszem Firefoksa lub Safari (i WebKit). Zwykle arkusze stylów UA są w większości zgodne. Na przykład wszystkie sprawiają, że linki są niebieskie, zwykły tekst jest czarny, a kolor tła jest biały, ale istnieją też ważne (a czasami irytujące) różnice, np. w sposobie stylizowania elementów sterujących formularza.

Przyjrzyj się bliżej arkuszowi stylów UA WebKit i jego działaniu w trybie ciemnym. (Wyszukaj w arkuszu stylów pełny tekst „dark”). Wartość domyślna podana w arkuszu stylów zmienia się w zależności od tego, czy tryb ciemny jest włączony czy wyłączony. Aby to zilustrować, przedstawiamy jedną z takich reguł CSS, która korzysta z klasy pseudo :matches, wewnętrznych zmiennych WebKit, takich jak -apple-system-control-background, oraz wewnętrznej dyrektywy preprocesora WebKit #if defined:

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 */
}

Zauważysz, że powyżej znajdują się niestandardowe wartości właściwości colorbackground-color. Ani text, ani -apple-system-control-background nie są prawidłowymi kolorami CSS. Są to wewnętrzne kolory semantyczne WebKit.

Okazuje się, że CSS ma ustandaryzowane semantyczne kolory systemowe. Są one określone w module kolorów CSS na poziomie 4. Na przykład tag Canvas (nie mylić z tagiem <canvas>) służy do określania tła treści aplikacji lub dokumentów, a tag CanvasText do określania tekstu w treści aplikacji lub dokumentach. Te 2 elementy są ze sobą powiązane i nie należy ich używać oddzielnie.

Arkusz stylów UA może używać własnych, zastrzeżonych kolorów lub standardowych kolorów systemu semantycznego, aby określić, jak domyślnie mają być renderowane elementy HTML. Jeśli system operacyjny jest ustawiony na tryb ciemny lub używa ciemnego motywu, kolor CanvasText (lub text) zostanie warunkowo ustawiony na biały, a kolor Canvas (lub -apple-system-control-background) na czarny. Arkusz stylów UA przypisuje wtedy te style CSS tylko raz i obejmuje zarówno tryb jasny, jak i ciemny.

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

Właściwość CSS color-scheme

Specyfikacja CSS Color Adjustment Module Level 1 wprowadza model i elementy sterujące automatyczną korekcją kolorów przez agenta użytkownika w celu obsługi preferencji użytkownika takich jak tryb ciemny, dostosowanie kontrastu czy określone schematy kolorów.

Zdefiniowana w nim właściwość color-scheme umożliwia elementowi wskazanie, w jakich schematach kolorów może być renderowany. Te wartości są negocjowane z preferencjami użytkownika, co skutkuje wybraną kolorystyką, która wpływa na elementy interfejsu, takie jak domyślne kolory elementów sterujących formularza i pasków przewijania, a także na używane wartości kolorów systemowych CSS. Obecnie obsługiwane są te wartości:

  • normal Oznacza, że element nie rozpoznaje schematów kolorów, więc powinien być renderowany z domyślnym schematem kolorów przeglądarki.

  • [ light | dark ]+ Wskazuje, że element jest zgodny z wymienionymi schematami kolorów i może je obsługiwać, a także określa preferowaną kolejność tych schematów.

Na tej liście light oznacza jasną kolorystykę z jasnymi kolorami tła i ciemnymi kolorami pierwszego planu, a dark oznacza odwrotną kolorystykę z ciemnymi kolorami tła i jasnymi kolorami pierwszego planu.

W przypadku wszystkich elementów renderowanie za pomocą schematu kolorów powinno powodować, że kolory używane we wszystkich elementach interfejsu dostarczanych przez przeglądarkę będą zgodne z zamierzeniem schematu kolorów. Przykłady to paski przewijania, podkreślenia sprawdzania pisowni, elementy sterujące formularza itp.

W przypadku elementu :root renderowanie z schematem kolorów musi dodatkowo wpływać na kolor powierzchni obszaru rysowania (czyli globalny kolor tła), początkową wartość właściwości color i używane wartości kolorów systemowych, a także na paski przewijania w obszarze widoku.

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

Metatag color-scheme

Aby uwzględnić właściwość color-scheme CSS, należy najpierw pobrać CSS (jeśli jest do niego odwołanie za pomocą <link rel="stylesheet">) i go przeanalizować. Aby pomóc agentom użytkownika w natychmiastowym renderowaniu tła strony z wybraną kolorystyką, w elemencie <meta name="color-scheme"> można też podać wartość color-scheme.

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

Łączenie color-schemeprefers-color-scheme

Zarówno metatag, jak i właściwość CSS (jeśli jest zastosowana do elementu :root) ostatecznie dają ten sam efekt, dlatego zawsze zalecam określanie schematu kolorów za pomocą metatagu, aby przeglądarka mogła szybciej dostosować się do preferowanego schematu.

W przypadku stron z bezwzględną linią bazową nie są potrzebne żadne dodatkowe reguły CSS, ale w ogólnym przypadku zawsze należy łączyć color-schemeprefers-color-scheme. Na przykład zastrzeżony kolor CSS WebKit -webkit-link, używany przez WebKit i Chrome w przypadku klasycznego niebieskiego koloru linku rgb(0,0,238), ma niewystarczający współczynnik kontrastu wynoszący 2,23:1 na czarnym tle i nie spełnia wymagań WCAG AA ani WCAG AAA.

Zgłosiłem błędy w Chrome, WebKitFirefox, a także problem zbiorczy w standardzie HTML, aby to naprawić.

Współpraca z: prefers-color-scheme

Współdziałanie właściwości CSS color-scheme i odpowiedniego tagu meta z funkcją mediów prefers-color-scheme preferencji użytkownika może początkowo wydawać się skomplikowane. W rzeczywistości świetnie ze sobą współpracują. Najważniejsze jest to, że atrybut color-schemeokreśla domyślny wygląd, a atrybut prefers-color-scheme – wygląd, który można dostosować. Aby to wyjaśnić, załóżmy, że masz taką stronę:

<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>

Wbudowany kod CSS na stronie ustawia wartość background-color elementu <fieldset> na gainsboro w przypadku ogólnym i na darkslategray, jeśli użytkownik woli schemat kolorów dark zgodnie z funkcją mediów prefers-color-scheme.

Za pomocą elementu <meta name="color-scheme" content="dark light"> strona informuje przeglądarkę, że obsługuje motyw ciemny i jasny, przy czym preferowany jest motyw ciemny.

W zależności od tego, czy system operacyjny jest ustawiony na tryb ciemny czy jasny, cała strona będzie wyświetlana w trybie jasnym na ciemnym lub odwrotnie, zgodnie z arkuszem stylów agenta użytkownika. Do zmiany tekstu akapitu ani koloru tła strony nie jest potrzebny dodatkowy kod CSS dostarczony przez programistę.

Zwróć uwagę, jak zmienia się element <fieldset> w zależności od tego, czy tryb ciemny jest włączony, zgodnie z regułami w arkuszu stylów wbudowanym na stronie przez dewelopera.background-color Może to być gainsboro lub darkslategray.

Strona w trybie jasnym.
Tryb jasny: style określone przez dewelopera i klienta użytkownika. Tekst jest czarny, a tło białe, zgodnie z arkuszem stylów klienta użytkownika. W zgodzie z wbudowanym arkuszem stylów dewelopera wartość atrybutu background-color elementu <fieldset> to gainsboro.
Strona w trybie ciemnym.
Tryb ciemny: style określone przez dewelopera i klienta użytkownika. Tekst jest biały, a tło czarne, zgodnie z arkuszem stylów klienta użytkownika. W zgodzie z wbudowanym arkuszem stylów dewelopera wartość atrybutu background-color elementu <fieldset> to darkslategray.

Wygląd elementu <button> jest kontrolowany przez arkusz stylów klienta użytkownika. Jego color jest ustawiony na kolor systemu ButtonText, a background-color i cztery border-color są ustawione na kolor systemu ButtonFace.

Strona w trybie jasnym, która korzysta z właściwości ButtonFace.
Tryb jasny: właściwości background-color i różne border-color są ustawione na kolor systemowy ButtonFace.

Zwróć uwagę, jak zmienia się border-color elementu <button>. Wartość obliczona dla przełączników border-top-colorborder-bottom-color zmienia się z rgba(0, 0, 0, 0.847) (ciemnawy) na rgba(255, 255, 255, 0.847) (białawy), ponieważ klient użytkownika dynamicznie aktualizuje ButtonFace na podstawie schematu kolorów. To samo dotyczy elementu <button>, którego color jest ustawiony na odpowiedni kolor systemowy ButtonText.

Pokazuje, że obliczone wartości kolorów pasują do koloru ButtonFace.
Tryb jasny: obliczone wartości właściwości border-top-colorborder-bottom-color, które w arkuszu stylów klienta użytkownika są ustawione na ButtonFace, to teraz rgba(0, 0, 0, 0.847).
Pokazuje, że obliczone wartości kolorów nadal pasują do koloru ButtonFace w trybie ciemnym.
Tryb ciemny: obliczone wartości border-top-colorborder-bottom-color, które w arkuszu stylów klienta użytkownika są ustawione na ButtonFace , to teraz rgba(255, 255, 255, 0.847).

Prezentacja

Efekty zastosowania color-scheme do dużej liczby elementów HTML możesz zobaczyć w demonstracji na Glitchu. Wersja demonstracyjna celowo pokazuje naruszenie wytycznych WCAG AA i WCAG AAA z kolorami linków wymienionymi w ostrzeżeniu powyżej.

Prezentacja w trybie jasnym.
Wersja demonstracyjna została przełączona na color-scheme: light.
Prezentacja w trybie ciemnym.
Wersja demonstracyjna została przełączona na color-scheme: dark. Zwróć uwagę na naruszenie wytycznych WCAG AA i WCAG AAA w przypadku kolorów linków.

Podziękowania

Właściwość CSS color-scheme i odpowiadający jej metatag zostały wdrożone przez Rune Lillesveena. Rune jest też współredaktorem specyfikacji modułu dostosowywania kolorów CSS na poziomie 1. Baner powitalny: Philippe Leone, Unsplash.