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 odpowiadający jej metatag pozwalają programistom włączyć na stronach domyślne ustawienia motywu, stosowane w arkuszu stylów klienta użytkownika.

Wprowadzenie

Funkcja multimediów ustawień użytkownika prefers-color-scheme

Funkcja multimediów w ustawieniach użytkownika prefers-color-scheme daje programistom pełną kontrolę nad wyglądem stron. Jeśli jeszcze tego nie wiesz, przeczytaj artykuł prefers-color-scheme: Cześć ciemności, mój stary przyjaciel, w którym udokumentowałam wszystko, co wiem o tworzeniu niesamowitych funkcji trybu ciemnego.

Element łamigłówki, o którym wspomniano tylko krótko w tym artykule, to właściwość CSS color-scheme i odpowiadający jej metatag o tej samej nazwie. Wszystko to ułatwia życie programistów, ponieważ pozwala ustawić na stronie wartości domyślne motywu, z arkusza stylów klienta użytkownika, np. elementy sterujące formularza, paski przewijania czy kolory systemu CSS. Jednocześnie ta funkcja zapobiega samodzielnemu stosowaniu przekształceń przez przeglądarki.

Obsługiwane przeglądarki

prefers-color-scheme

Obsługa przeglądarek

  • 76
  • 79
  • 67
  • 12.1

Źródło

color-scheme

Obsługa przeglądarek

  • 81
  • 81
  • 96
  • 13

Źródło

Arkusz stylów klienta użytkownika

Zanim przejdziemy dalej, wyjaśnię pokrótce, czym jest arkusz stylów klienta użytkownika. Słowo klient użytkownika (UA) to najczęściej zaawansowany sposób na określenie przeglądarki. Arkusz stylów UA określa domyślny wygląd i sposób działania strony. Jak sama nazwa wskazuje, arkusz stylów UA zależy od konkretnej UA. Możesz spojrzeć na arkusz stylów UA w Chrome (i Chromium) i porównać go z przeglądarką Firefox lub Safari (oraz WebKit). Arkusze stylów UA są zazwyczaj zgodne z większością rzeczy. Na przykład wszystkie linki mają kolor niebieski, ogólny tekst czarny, a kolor tła biały, ale występują też pewne istotne (i czasem irytujące) różnice, np. związane ze stylem elementów sterujących formularza.

Zapoznaj się z arkuszem stylów WebKit UA i sprawdź, jak działa w trybie ciemnym. (W arkuszu stylów wyszukaj słowo „ciemny” w pełnym tekście). Wartość domyślna podana w arkuszu stylów zmienia się w zależności od tego, czy tryb ciemny jest włączony. Aby to zilustrować, oto jedna z takich reguł CSS wykorzystująca pseudoklasę :matches i zmienne wewnętrzne WebKit, takie jak -apple-system-control-background, a także wewnętrzną dyrektywę przedprocesora 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 */
}

Możesz zauważyć kilka niestandardowych wartości we właściwościach color i background-color powyżej. Ani text, ani -apple-system-control-background nie są prawidłowymi kolorami CSS. Są to kolory semantyczne wbudowane w WebKit.

Okazuje się, że CSS ma ustandaryzowane kolory systemów semantycznych. Są one określone w module kolorów CSS Color Module Level 4. Na przykład fragment Canvas (nie mylić z tagiem <canvas>) służy jako tło do treści lub dokumentów aplikacji, a CanvasText – do tekstu w treści lub dokumentach aplikacji. Można je stosować razem i nie należy ich używać oddzielnie.

Aby określić domyślny sposób renderowania elementów HTML, arkusze stylów UA mogą używać własnych zastrzeżonych lub standardowych kolorów systemu semantycznego. Jeśli system operacyjny jest ustawiony na tryb ciemny lub używa ciemnego motywu, właściwość CanvasText (lub text) jest warunkowo ustawiona na biały, a Canvas (lub -apple-system-control-background) – na czarny. Arkusz stylów UA przypisuje poniższy kod 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 modułu dostosowania kolorów CSS – poziom 1 wprowadza model i kontroluje automatyczną korektę kolorów przez klienta użytkownika. Ma ona na celu obsługę preferencji użytkownika, takich jak tryb ciemny, korekta kontrastu czy konkretne schematy kolorów.

Zdefiniowana w niej właściwość color-scheme pozwala elementowi wskazać schematy kolorów, z którymi ten element może być wygodnie renderowany. Wartości te są negocjowane z preferencjami użytkownika, co skutkuje wybranym schematem kolorów, który wpływa na takie elementy interfejsu, jak domyślne kolory elementów sterujących formularza i paski przewijania, a także używane wartości kolorów systemu CSS. Obecnie obsługiwane są te wartości:

  • normal Wskazuje, że element w ogóle nie zna schematów kolorów, więc powinien być renderowany z użyciem domyślnego schematu kolorów przeglądarki.

  • [ light | dark ]+ Wskazuje, że element wie i może obsługiwać wymienione schematy kolorów, a także wyraża między nimi uporządkowaną preferencję.

Na tej liście light reprezentuje jasny schemat kolorów, z jasnymi kolorami tła i ciemnymi kolorami pierwszego planu, natomiast dark wskazuje odwrotność, czyli ciemne kolory tła i jasne kolory pierwszego planu.

W przypadku wszystkich elementów renderowanie za pomocą schematu kolorów powinno powodować dopasowanie kolorów we wszystkich interfejsach udostępnianych przez przeglądarkę, aby element był zgodny ze schematem kolorów. Przykładami takich treści są paski przewijania, opcje sprawdzania pisowni, elementy sterujące formularza itp.

W przypadku elementu :root renderowanie za pomocą schematu kolorów musi dodatkowo wpływać na kolor powierzchni obszaru roboczego (czyli globalny kolor tła), wartość początkową właściwości color i używane wartości kolorów systemowych. Poza tym powinno też wpływać na paski przewijania widocznego obszaru.

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

Metatag color-scheme

Zaakceptowanie właściwości CSS color-scheme wymaga wcześniejszego pobrania arkusza CSS (jeśli odwołuje się do niego w elemencie <link rel="stylesheet">) i jego przeanalizowania. Aby natychmiast pomóc klientom użytkownika renderować tło strony w wybranym schemacie kolorów, możesz też podać wartość color-scheme w elemencie <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">

Łączę: color-scheme i prefers-color-scheme

Zarówno metatag, jak i właściwość CSS (jeśli zostanie zastosowana do elementu :root) dają w efekcie identyczne działanie, zalecamy więc zawsze określać schemat kolorów za pomocą meta tagu, aby przeglądarka szybciej przystosowała się do preferowanego schematu.

Chociaż w przypadku bezwzględnych stron podstawowych nie są potrzebne dodatkowe reguły CSS, w ogólnym przypadku należy zawsze łączyć atrybuty color-scheme i prefers-color-scheme. Na przykład zastrzeżony kolor CSS WebKit -webkit-link używany przez WebKit i Chrome w przypadku klasycznego linku niebieskiego rgb(0,0,238) ma niewystarczający współczynnik kontrastu 2,23:1 na czarnym tle i nie spełnia wymagań zarówno WCAG AA, jak i wymagań WCAG AAA.

Udało mi się naprawić błędy w Chrome, WebKit i Firefoksie, a także metaproblem w standardzie HTML.

Interakcja z: prefers-color-scheme

Współdziałanie właściwości CSS color-scheme i powiązanego z nim metatagu z funkcją multimediów w ustawieniach użytkownika prefers-color-scheme może w pierwszej chwili wydawać się niejasne. Wręcz przeciwnie, grają ze sobą świetnie. Najważniejsze jest to, że color-scheme określa domyślny wygląd, natomiast prefers-color-scheme określa wygląd, który określa styl. Aby to wyjaśnić, załóżmy, że:

<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 w ogólnym przypadku wartość background-color elementu <fieldset> na gainsboro oraz na darkslategray, jeśli użytkownik preferuje schemat kolorów dark zgodnie z funkcją multimediów preferencji użytkownika prefers-color-scheme.

Za pomocą elementu <meta name="color-scheme" content="dark light"> strona informuje przeglądarkę, że obsługuje ona ciemny i jasny motyw, ale z wyprzedzeniem korzysta z ciemnego motywu.

W zależności od tego, czy system operacyjny jest ustawiony na tryb ciemny czy jasny, cała strona będzie wyświetlana w ciemnych kolorach lub na odwrót, w zależności od arkusza stylów klienta użytkownika. Aby zmienić tekst akapitu lub kolor tła strony, nie trzeba korzystać z dodatkowej usługi porównywania cen dostarczonej przez dewelopera.

Zwróć uwagę, jak parametr background-color elementu <fieldset> zmienia się w zależności od tego, czy tryb ciemny jest włączony, zgodnie z regułami podanymi w umieszczonym na stronie wbudowanym arkuszu stylów. Wartość to 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). Wartość background-color elementu <fieldset> wynosi gainsboro zgodnie z wbudowanym arkuszem stylów programisty.
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. Wartość background-color elementu <fieldset> wynosi darkslategray zgodnie z wbudowanym arkuszem stylów programisty.

Wygląd elementu <button> jest określany przez arkusz stylów klienta użytkownika. Element color jest ustawiony na kolor systemowy ButtonText, a background-color i 4 elementy border-color mają kolor systemowy ButtonFace.

Strona w trybie jasnym, która korzysta z właściwości ButtonFace.
Tryb jasny: dla elementu background-color i różnych elementów border-color jest ustawiony kolor systemu ButtonFace.

Zanotuj teraz, jak zmienia się border-color elementu <button>. Wartość obliczona dla właściwości border-top-color i border-bottom-color zmieni się z rgba(0, 0, 0, 0.847) (czarny) na rgba(255, 255, 255, 0.847) (biała), ponieważ klient użytkownika aktualizuje wartość ButtonFace dynamicznie na podstawie schematu kolorów. To samo dotyczy atrybutu color elementu <button>, który ma ustawiony odpowiedni kolor systemowy ButtonText.

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

Wersja demonstracyjna

Efekty działania funkcji color-scheme w przypadku dużej liczby elementów HTML możesz zobaczyć w demonstracji funkcji Uszkodzenie. Demonstracja celowo pokazuje naruszenie zasad WCAG AA i WCAG AAA oraz kolorami linków wspomnianymi w ostrzeżeniu powyżej.

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

Podziękowania

Właściwość CSS color-scheme i odpowiadający jej metatag zostały wdrożone przez Rune Lillesveen. Rune jest też współredaktorem specyfikacji modułu dostosowania kolorów CSS poziomu 1. Baner powitalny od Philippe Leone w serwisie Unsplash.