préfères-color-scheme: Salut les ténèbres, mon vieil ami

Une tendance à la surmédiatisation ou une nécessité ? Découvrez tout ce qu'il faut savoir sur le mode sombre et comment le prendre en charge dans l'intérêt de vos utilisateurs.

Introduction

Mode sombre avant le mode sombre

Écran d'ordinateur avec fond vert
Fond vert (source)

Nous avons bouclé la boucle avec le mode sombre. Au début de l'informatique personnelle, le mode sombre n'était pas une question de choix, mais de fait : les moniteurs d'ordinateur CRT monochromes fonctionnaient en projetant des faisceaux d'électrons sur un écran phosphorescent, et le phosphore utilisé dans les premiers CRT était vert. Étant donné que le texte était affiché en vert et que le reste de l'écran était noir, ces modèles étaient souvent appelés écrans verts.

Traitement de texte en noir et blanc
Foncé sur blanc (source)

Les CRT couleur introduits par la suite affichaient plusieurs couleurs à l'aide de phosphores rouges, verts et bleus. Ils ont créé le blanc en activant simultanément les trois phosphores. Avec l'avènement de la publication assistée par ordinateur WYSIWYG plus sophistiquée, l'idée de faire ressembler le document virtuel à une feuille de papier physique est devenue populaire.

Page Web sombre sur fond blanc dans le navigateur WorldWideWeb
Navigateur WorldWideWeb (source)

C'est là que le dark-on-white a commencé comme tendance de conception, et cette tendance s'est répercutée sur les premiers modèles Web basés sur des documents. Le tout premier navigateur, WorldWideWeb (n'oubliez pas que le CSS n'avait même pas encore été inventé), affichait les pages Web de cette manière. Fait amusant : le deuxième navigateur, le Line Mode Browser (un navigateur basé sur un terminal) était vert sur fond sombre. De nos jours, les pages et les applications Web sont généralement conçues avec du texte sombre sur un arrière-plan clair, une hypothèse de base également codée en dur dans les feuilles de style user-agent, y compris celles de Chrome.

Smartphone utilisé allongé dans son lit
Smartphone utilisé au lit (source: Unsplash)

L'époque des écrans CRT est révolue. La consommation et la création de contenus se sont déplacées vers les appareils mobiles qui utilisent des écrans LCD rétroéclairés ou des écrans AMOLED économes en énergie. Les ordinateurs, tablettes et smartphones, plus petits et plus transportables, ont donné naissance à de nouveaux modes d'utilisation. Dans des environnements sombres, les activités de loisirs, comme naviguer sur le Web, coder pour s'amuser ou jouer à des jeux vidéo haut de gamme, ont souvent lieu en dehors des heures de travail. Les utilisateurs peuvent même profiter de leurs appareils dans leur lit la nuit. Plus les utilisateurs utilisent leurs appareils dans l'obscurité, plus l'idée de revenir aux fondamentaux du contraste clair/foncé devient populaire.

Pourquoi le mode sombre ?

Mode sombre pour des raisons esthétiques

Lorsque les utilisateurs sont interrogés sur pourquoi ils aiment ou veulent le mode sombre, la réponse la plus populaire est qu'il est plus agréable pour les yeux, suivie de il est élégant et beau. Dans sa documentation destinée aux développeurs sur le mode sombre, Apple indique explicitement : "Le choix d'activer un thème clair ou sombre est esthétique pour la plupart des utilisateurs et n'a pas nécessairement de rapport avec les conditions d'éclairage ambiant."

CloseView dans Mac OS System 7 avec
Vue d'ensemble du système 7 (source)

Le mode sombre comme outil d'accessibilité

Certaines personnes ont besoin du mode sombre et l'utilisent comme un autre outil d'accessibilité, par exemple les utilisateurs ayant une déficience visuelle. Le premier outil d'accessibilité que j'ai pu trouver est la fonctionnalité CloseView de System 7, qui comportait un bouton d'activation/de désactivation pour Noir sur blanc et Blanc sur noir. Bien que System 7 prenne en charge la couleur, l'interface utilisateur par défaut était toujours en noir et blanc.

Ces implémentations basées sur l'inversion ont révélé leurs faiblesses une fois la couleur introduite. Une étude sur l'accès des personnes malvoyantes aux appareils informatiques menée par Szpiro et al. a montré que tous les utilisateurs interrogés n'aimaient pas les images inversées, mais que beaucoup préféraient un texte clair sur un arrière-plan sombre. Apple tient compte de cette préférence utilisateur avec une fonctionnalité appelée Inversion intelligente, qui inverse les couleurs à l'écran, à l'exception des images, des contenus multimédias et de certaines applications qui utilisent des styles de couleurs sombres.

Le syndrome de vision par ordinateur, également appelé fatigue oculaire numérique, est une forme particulière de déficience visuelle. Il est défini comme "la combinaison de problèmes oculaires et visuels associés à l'utilisation d'ordinateurs (y compris les ordinateurs de bureau, les ordinateurs portables et les tablettes) et d'autres écrans électroniques (par exemple, les smartphones et les lecteurs électroniques)". Il a été proposé que l'utilisation d'appareils électroniques par les adolescents, en particulier la nuit, augmente le risque de durée de sommeil plus courte, de latence d'endormissement plus longue et de déficit de sommeil. De plus, l'exposition à la lumière bleue a été largement signalée comme impliquée dans la régulation du rythme circadien et du cycle de sommeil. Les environnements lumineux irréguliers peuvent entraîner un manque de sommeil, ce qui peut affecter les performances de l'humeur et des tâches, selon une étude de Rosenfield. Pour limiter ces effets négatifs, vous pouvez réduire la lumière bleue en ajustant la température de couleur de l'écran à l'aide de fonctionnalités telles que le Mode Nuit d'iOS ou la lumière de nuit d'Android. Vous pouvez également éviter les lumières vives ou irrégulières en général à l'aide de thèmes ou de modes sombres.

Économies d'énergie du mode sombre sur les écrans AMOLED

Enfin, le mode sombre est connu pour économiser beaucoup d'énergie sur les écrans AMOLED. Des études de cas Android axées sur des applications Google populaires comme YouTube ont montré que les économies d'énergie pouvaient atteindre 60 %. La vidéo ci-dessous contient plus de détails sur ces études de cas et les économies d'énergie réalisées par application.

Activer le mode sombre dans le système d'exploitation

Maintenant que nous avons vu pourquoi le mode sombre est si important pour de nombreux utilisateurs, voyons comment le prendre en charge.

Paramètres du mode sombre Android Q
Paramètres du thème sombre Android Q

Les systèmes d'exploitation compatibles avec un mode sombre ou un thème sombre proposent généralement une option permettant de l'activer dans les paramètres. Sur macOS X, il se trouve dans la section General (Général) des préférences système et s'intitule Appearance (Apparence) (capture d'écran). Sur Windows 10, il se trouve dans la section Colors (Couleurs) et s'intitule Choose your color (Choisir votre couleur) (capture d'écran). Sur Android Q, il se trouve sous Affichage en tant que bouton bascule Thème sombre (capture d'écran). Sur iOS 13, vous pouvez modifier l'apparence dans la section Affichage et luminosité des paramètres (capture d'écran).

Requête média prefers-color-scheme

Une dernière notion théorique avant de commencer. Les requêtes multimédias permettent aux auteurs de tester et d'interroger les valeurs ou les fonctionnalités de l'agent utilisateur ou de l'appareil d'affichage, indépendamment du document affiché. Ils sont utilisés dans la règle CSS @media pour appliquer des styles à un document de manière conditionnelle, ainsi que dans d'autres contextes et langages, tels que HTML et JavaScript. Media Queries niveau 5 introduit les fonctionnalités multimédias de préférences utilisateur, c'est-à-dire un moyen pour les sites de détecter la manière préférée de l'utilisateur d'afficher le contenu.

La fonctionnalité multimédia prefers-color-scheme permet de détecter si l'utilisateur a demandé à la page d'utiliser un thème clair ou sombre. Elle fonctionne avec les valeurs suivantes:

  • light : indique que l'utilisateur a indiqué au système qu'il préfère une page avec un thème clair (texte sombre sur fond clair).
  • dark : indique que l'utilisateur a indiqué au système qu'il préfère une page avec un thème sombre (texte clair sur fond sombre).

Prendre en charge le mode sombre

Vérifier si le mode sombre est compatible avec le navigateur

Comme le mode sombre est signalé via une requête multimédia, vous pouvez facilement vérifier si le navigateur actuel est compatible avec le mode sombre en vérifiant si la requête multimédia prefers-color-scheme correspond. Notez que je n'inclus aucune valeur, mais que je vérifie uniquement si la requête multimédia seule correspond.

if (window.matchMedia('(prefers-color-scheme)').media !== 'not all') {
  console.log('🎉 Dark mode is supported');
}

Au moment de la rédaction de cet article, prefers-color-scheme est compatible à la fois sur ordinateur et sur mobile (le cas échéant) par Chrome et Edge à partir de la version 76, Firefox à partir de la version 67 et Safari à partir de la version 12.1 sur macOS et de la version 13 sur iOS. Pour tous les autres navigateurs, consultez Puis-je utiliser les tableaux d'assistance ?

En savoir plus sur les préférences d'un utilisateur au moment de la requête

L'en-tête d'optimisation du client Sec-CH-Prefers-Color-Scheme permet aux sites d'obtenir les préférences de jeu de couleurs de l'utilisateur au moment de la requête, ce qui permet aux serveurs d'intégrer le code CSS approprié et d'éviter ainsi un flash de thème de couleurs incorrect.

Mode sombre en pratique

Voyons enfin à quoi ressemble la prise en charge du mode sombre en pratique. Comme dans Highlander, il ne peut y en avoir qu'un : sombre ou clair, mais pas les deux. Pourquoi je mentionne cela ? En effet, ce fait devrait avoir un impact sur la stratégie de chargement. Veuillez ne pas forcer les utilisateurs à télécharger du CSS dans le chemin de rendu critique destiné à un mode qu'ils n'utilisent pas actuellement. Pour optimiser la vitesse de chargement, j'ai donc divisé le CSS de l'application exemple qui illustre les recommandations suivantes en trois parties afin de différer le CSS non critique :

  • style.css contenant des règles génériques utilisées universellement sur le site.
  • dark.css qui ne contient que les règles nécessaires au mode sombre.
  • light.css, qui ne contient que les règles requises pour le mode clair.

Stratégie de chargement

Les deux derniers, light.css et dark.css, sont chargés de manière conditionnelle avec une requête <link media>. Au départ, tous les navigateurs ne sont pas compatibles avec prefers-color-scheme (détectable à l'aide du modèle ci-dessus), ce que je gère de manière dynamique en chargeant le fichier light.css par défaut via un élément <link rel="stylesheet"> inséré de manière conditionnelle dans un script intégré minuscule (la lumière est un choix arbitraire, j'aurais aussi pu définir l'expérience de remplacement par défaut sur l'obscurcissement). Pour éviter un flash de contenu non stylisé, je masque le contenu de la page jusqu'à ce que light.css soit chargé.

<script>
  // If `prefers-color-scheme` is not supported, fall back to light mode.
  // In this case, light.css will be downloaded with `highest` priority.
  if (window.matchMedia('(prefers-color-scheme: dark)').media === 'not all') {
    document.documentElement.style.display = 'none';
    document.head.insertAdjacentHTML(
      'beforeend',
      '<link rel="stylesheet" href="/light.css" onload="document.documentElement.style.display = \'\'">',
    );
  }
</script>
<!--
  Conditionally either load the light or the dark stylesheet. The matching file
  will be downloaded with `highest`, the non-matching file with `lowest`
  priority. If the browser doesn't support `prefers-color-scheme`, the media
  query is unknown and the files are downloaded with `lowest` priority (but
  above I already force `highest` priority for my default light experience).
-->
<link rel="stylesheet" href="/dark.css" media="(prefers-color-scheme: dark)" />
<link
  rel="stylesheet"
  href="/light.css"
  media="(prefers-color-scheme: light)"
/>
<!-- The main stylesheet -->
<link rel="stylesheet" href="/style.css" />

Architecture des feuilles de style

J'utilise au maximum les variables CSS, ce qui permet à mon style.css générique d'être générique, et toute la personnalisation en mode clair ou sombre se produit dans les deux autres fichiers dark.css et light.css. Vous trouverez ci-dessous un extrait des styles réels, mais il devrait suffire à vous donner une idée générale. Je déclare deux variables, -⁠-⁠color et -⁠-⁠background-color, qui créent essentiellement un thème de référence sombre sur clair et clair sur sombre.

/* light.css: 👉 dark-on-light */
:root {
  --color: rgb(5, 5, 5);
  --background-color: rgb(250, 250, 250);
}
/* dark.css: 👉 light-on-dark */
:root {
  --color: rgb(250, 250, 250);
  --background-color: rgb(5, 5, 5);
}

Dans mon style.css, j'utilise ensuite ces variables dans la règle body { … }. Comme elles sont définies sur la pseudo-classe CSS :root (un sélecteur qui, en HTML, représente l'élément <html> et est identique au sélecteur html, sauf que sa spécificité est plus élevée), elles se propagent en cascade, ce qui me permet de déclarer des variables CSS globales.

/* style.css */
:root {
  color-scheme: light dark;
}

body {
  color: var(--color);
  background-color: var(--background-color);
}

Dans l'exemple de code ci-dessus, vous avez probablement remarqué une propriété color-scheme avec la valeur séparée par des espaces light dark.

Cela indique au navigateur les thèmes de couleur compatibles avec mon application et lui permet d'activer des variantes spéciales de la feuille de style du user-agent. Cela est utile, par exemple, pour permettre au navigateur d'afficher les champs de formulaire avec un arrière-plan sombre et du texte clair, d'ajuster les barres de défilement ou d'activer une couleur de mise en surbrillance basée sur le thème. Les détails exacts de color-scheme sont spécifiés dans le niveau 1 du module d'ajustement des couleurs CSS.

Tout le reste ne consiste alors qu'à définir des variables CSS pour les éléments importants de mon site. Organiser sémantiquement les styles est très utile lorsque vous travaillez avec le mode sombre. Par exemple, plutôt que -⁠-⁠highlight-yellow, envisagez d'appeler la variable -⁠-⁠accent-color, car "jaune" peut ne pas être jaune en mode sombre ou inversement. Vous trouverez ci-dessous quelques autres variables que j'utilise dans mon exemple.

/* dark.css */
:root {
  --color: rgb(250, 250, 250);
  --background-color: rgb(5, 5, 5);
  --link-color: rgb(0, 188, 212);
  --main-headline-color: rgb(233, 30, 99);
  --accent-background-color: rgb(0, 188, 212);
  --accent-color: rgb(5, 5, 5);
}
/* light.css */
:root {
  --color: rgb(5, 5, 5);
  --background-color: rgb(250, 250, 250);
  --link-color: rgb(0, 0, 238);
  --main-headline-color: rgb(0, 0, 192);
  --accent-background-color: rgb(0, 0, 238);
  --accent-color: rgb(250, 250, 250);
}

Exemple complet

Dans l'intégration Glitch suivante, vous pouvez voir un exemple complet qui met en pratique les concepts ci-dessus. Essayez d'activer/de désactiver le mode sombre dans les paramètres de votre système d'exploitation et observez le comportement de la page.

Impact du chargement

Lorsque vous jouez avec cet exemple, vous pouvez voir pourquoi je charge mes dark.css et light.css via des requêtes multimédias. Essayez d'activer le mode sombre et d'actualiser la page. Les feuilles de style qui ne correspondent pas actuellement sont toujours chargées, mais avec la priorité la plus basse, de sorte qu'elles ne soient jamais en concurrence avec les ressources dont le site a besoin pour le moment.

Diagramme de chargement réseau montrant comment le CSS en mode sombre est chargé avec la priorité la plus faible en mode clair
Le site en mode clair charge le CSS en mode sombre avec la priorité la plus faible.
Diagramme de chargement réseau montrant comment le CSS en mode sombre est chargé avec la priorité la plus basse en mode sombre
Le site en mode sombre charge le CSS du mode clair avec la priorité la plus basse.
Schéma de chargement réseau montrant comment, en mode clair par défaut, le CSS du mode sombre est chargé avec la priorité la plus faible
Le site en mode clair par défaut sur un navigateur qui n'est pas compatible avec prefers-color-scheme charge le CSS du mode sombre avec la priorité la plus basse.

Réagir aux changements de mode sombre

Comme pour toute autre modification de requête multimédia, vous pouvez vous abonner aux modifications du mode sombre via JavaScript. Vous pouvez l'utiliser, par exemple, pour modifier de façon dynamique le favicon d'une page ou la <meta name="theme-color"> qui détermine la couleur de la barre d'adresse dans Chrome. L'exemple complet ci-dessus montre cela en action. Pour voir les modifications apportées à la couleur du thème et à la favicon, ouvrez la démo dans un onglet distinct.

const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
darkModeMediaQuery.addEventListener('change', (e) => {
  const darkModeOn = e.matches;
  console.log(`Dark mode is ${darkModeOn ? '🌒 on' : '☀️ off'}.`);
});

Depuis Chromium 93 et Safari 15, vous pouvez ajuster la couleur en fonction d'une requête multimédia avec l'attribut media de l'élément de couleur de thème meta. Le premier élément qui correspond sera sélectionné. Par exemple, vous pouvez avoir une couleur pour le mode clair et une autre pour le mode sombre. Au moment de la rédaction de ce document, vous ne pouvez pas les définir dans votre fichier manifeste. Consultez la page concernant le problème GitHub de w3c/manifest#975.

<meta
  name="theme-color"
  media="(prefers-color-scheme: light)"
  content="white"
/>
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="black" />

Déboguer et tester le mode sombre

Émuler prefers-color-scheme dans DevTools

Changer le jeu de couleurs de l'ensemble du système d'exploitation peut rapidement devenir ennuyeux. Chrome DevTools vous permet désormais d'émuler le jeu de couleurs préféré de l'utilisateur de manière à n'affecter que l'onglet actuellement visible. Ouvrez le menu Command (Commande), commencez à saisir Rendering, exécutez la commande Show Rendering, puis modifiez l'option Emulate CSS media feature prefers-color-scheme (Émuler la caractéristique média CSS prefers-color-scheme).

Capture d&#39;écran de l&#39;option &quot;Émuler la caractéristique média CSS prefers-color-scheme&quot;, située dans l&#39;onglet &quot;Rendering&quot; (Affichage) de Chrome DevTools

Prendre une capture d'écran de prefers-color-scheme avec Puppeteer

Puppeteer est une bibliothèque Node.js qui fournit une API de haut niveau pour contrôler Chrome ou Chromium via le protocole DevTools. Avec dark-mode-screenshot, nous fournissons un script Puppeteer qui vous permet de créer des captures d'écran de vos pages en mode clair et sombre. Vous pouvez exécuter ce script de manière ponctuelle ou l'intégrer à votre suite de test d'intégration continue (CI).

npx dark-mode-screenshot --url https://googlechromelabs.github.io/dark-mode-toggle/demo/ --output screenshot --fullPage --pause 750

Bonnes pratiques concernant le mode sombre

Évitez le blanc pur

Un petit détail que vous avez peut-être remarqué est que je n'utilise pas de blanc pur. À la place, pour éviter les effets de halo et de bavures sur le contenu sombre environnant, j'ai choisi un blanc légèrement plus foncé. Par exemple, rgb(250, 250, 250) fonctionne bien.

Recoloriser et assombrir des images photographiques

Si vous comparez les deux captures d'écran ci-dessous, vous remarquerez que le thème principal est passé de sombre sur clair à clair sur sombre, mais que l'image de l'héros est légèrement différente. Mes recherches sur l'expérience utilisateur ont montré que la majorité des personnes interrogées préfèrent des images légèrement moins vives et éclatantes lorsque le mode sombre est activé. J'appelle cela la recolorisation.

L&#39;image héros est légèrement plus sombre en mode sombre.
Image principale légèrement assombrie en mode sombre.
Image héros standard en mode clair.
Image principale standard en mode clair.

Je peux les recolorer à l'aide d'un filtre CSS appliqué à mes images. J'utilise un sélecteur CSS qui correspond à toutes les images qui ne contiennent pas .svg dans leur URL. L'idée est que je peux appliquer un traitement de recolorisation différent aux graphiques vectoriels (icônes) qu'à mes images (photos). Pour en savoir plus, consultez le paragraphe suivant. Notez que j'utilise à nouveau une variable CSS pour pouvoir modifier mon filtre plus tard de manière flexible.

Étant donné que la recoloration n'est nécessaire qu'en mode sombre, c'est-à-dire que lorsque dark.css est actif, il n'y a pas de règles correspondantes dans light.css.

/* dark.css */
--image-filter: grayscale(50%);

img:not([src*='.svg']) {
  filter: var(--image-filter);
}

Personnaliser les intensités de recolorisation du mode sombre avec JavaScript

Tout le monde n'est pas pareil, et les besoins en mode sombre sont différents. En respectant la méthode de recolorisation décrite ci-dessus, je peux facilement faire de l'intensité en niveaux de gris une préférence utilisateur que je peux modifier via JavaScript. En définissant une valeur de 0%, je peux également désactiver complètement la recolorisation. Notez que document.documentElement fournit une référence à l'élément racine du document, c'est-à-dire le même élément que je peux référencer avec la pseudo-classe CSS :root.

const filter = 'grayscale(70%)';
document.documentElement.style.setProperty('--image-filter', value);

Inverser des graphiques vectoriels et des icônes

Pour les graphiques vectoriels (qui, dans mon cas, sont utilisés comme icônes que je référence via des éléments <img>), j'utilise une méthode de recoloration différente. Bien que des recherches aient montré que les gens n'aiment pas l'inversion pour les photos, elle fonctionne très bien pour la plupart des icônes. Je réutilise des variables CSS pour déterminer le niveau d'inversion dans l'état normal et dans l'état :hover.

Les icônes sont inversées en mode sombre.
Les icônes sont inversées en mode sombre.
Icônes standards en mode clair.
Icones standards en mode clair.

Notez que, là encore, je n'inverse les icônes que dans dark.css, mais pas dans light.css, et que :hover obtient une intensité d'inversion différente dans les deux cas pour que l'icône soit légèrement plus sombre ou légèrement plus lumineuse, en fonction du mode sélectionné par l'utilisateur.

/* dark.css */
--icon-filter: invert(100%);
--icon-filter_hover: invert(40%);

img[src*='.svg'] {
  filter: var(--icon-filter);
}
/* light.css */
--icon-filter_hover: invert(60%);
/* style.css */
img[src*='.svg']:hover {
  filter: var(--icon-filter_hover);
}

Utiliser currentColor pour les SVG intégrés

Pour les images SVG intégrées, au lieu d'utiliser des filtres d'inversion, vous pouvez exploiter le mot clé CSS currentColor qui représente la valeur de la propriété color d'un élément. Vous pouvez ainsi utiliser la valeur color sur les propriétés qui ne la reçoivent pas par défaut. Pratiquement, si currentColor est utilisé comme valeur des attributs fill ou stroke SVG, il tire sa valeur de la valeur héritée de la propriété color. Mieux encore : cela fonctionne également pour <svg><use href="…"></svg>. Vous pouvez donc avoir des ressources distinctes, et currentColor sera toujours appliqué dans le contexte. Notez que cette méthode ne fonctionne que pour les SVG intégrés ou <use href="…">, mais pas pour les SVG référencés en tant que src d'une image ou via CSS. Vous pouvez voir cela appliqué dans la démonstration ci-dessous.

<!-- Some inline SVG -->
<svg xmlns="http://www.w3.org/2000/svg"
    stroke="currentColor"
>
  […]
</svg>

Transitions fluides entre les modes

Le passage du mode sombre au mode clair ou inversement peut être fluide, car color et background-color sont des propriétés CSS animables. Pour créer l'animation, il vous suffit de déclarer deux transition pour les deux propriétés. L'exemple ci-dessous illustre l'idée générale. Vous pouvez le tester en direct dans la démonstration.

body {
  --duration: 0.5s;
  --timing: ease;

  color: var(--color);
  background-color: var(--background-color);

  transition: color var(--duration) var(--timing), background-color var(
        --duration
      ) var(--timing);
}

Direction artistique avec mode sombre

Pour des raisons de performances de chargement, nous vous recommandons généralement de n'utiliser que prefers-color-scheme dans l'attribut media des éléments <link> (plutôt que dans les feuilles de style), mais il peut arriver que vous souhaitiez utiliser prefers-color-scheme directement dans le code HTML. La direction artistique est un exemple de cette situation. Sur le Web, la direction artistique concerne l'apparence visuelle globale d'une page et la façon dont elle communique visuellement, stimule les humeurs, contraste les caractéristiques et fait appel psychologiquement à une audience cible.

Avec le mode sombre, c'est au concepteur de décider quelle est la meilleure image pour un mode particulier et si la recolorisation des images n'est peut-être pas suffisante. En cas d'utilisation avec l'élément <picture>, le <source> de l'image à afficher peut dépendre de l'attribut media. Dans l'exemple ci-dessous, j'affiche l'hémisphère Ouest pour le mode sombre et l'hémisphère Est pour le mode clair, ou lorsqu'aucune préférence n'est donnée, l'hémisphère Est dans tous les autres cas. Il s'agit bien entendu d'un exemple. Activez le mode sombre sur votre appareil pour voir la différence.

<picture>
  <source srcset="western.webp" media="(prefers-color-scheme: dark)" />
  <source srcset="eastern.webp" media="(prefers-color-scheme: light)" />
  <img src="eastern.webp" />
</picture>

Mode sombre, mais avec une option de désactivation

Comme indiqué dans la section Pourquoi le mode sombre ci-dessus, le mode sombre est un choix esthétique pour la plupart des utilisateurs. Par conséquent, certains utilisateurs peuvent préférer que l'interface utilisateur de leur système d'exploitation soit sombre, mais qu'ils voient leurs pages Web comme ils en ont l'habitude. Un bon modèle consiste à respecter initialement le signal envoyé par le navigateur via prefers-color-scheme, mais à autoriser ensuite les utilisateurs à remplacer leur paramètre au niveau du système.

L'élément personnalisé <dark-mode-toggle>

Vous pouvez bien sûr créer le code vous-même, mais vous pouvez également utiliser un élément personnalisé (composant Web) que j'ai créé à cette fin. Il s'appelle <dark-mode-toggle> et ajoute à votre page un bouton d'activation/de désactivation (mode sombre : activer/désactiver) ou un sélecteur de thème (thème clair/sombre) que vous pouvez personnaliser entièrement. La démonstration ci-dessous montre l'élément en action (et je l'ai également 🤫 glissé discrètement dans tous les autres exemples ci-dessus).

<dark-mode-toggle
  legend="Theme Switcher"
  appearance="switch"
  dark="Dark"
  light="Light"
  remember="Remember this"
></dark-mode-toggle>
dark-mode-toggle en mode clair.
<dark-mode-toggle> en mode clair.
dark-mode-toggle en mode clair.
<dark-mode-toggle> en mode sombre.

Dans la démo ci-dessous, cliquez ou appuyez sur les commandes du mode sombre en haut à droite. Si vous cochez la case dans la troisième et la quatrième commande, vous verrez que le mode sélectionné est mémorisé, même lorsque vous actualisez la page. Ainsi, vos visiteurs peuvent conserver leur système d'exploitation en mode sombre, tout en profitant de votre site en mode clair, ou inversement.

Conclusions

Utiliser et prendre en charge le mode sombre est amusant et ouvre de nouvelles voies de conception. Pour certains visiteurs, cela peut faire toute la différence entre ne pas être capable de gérer votre site et être satisfait. Il existe quelques écueils et des tests minutieux sont absolument nécessaires, mais le mode sombre est une excellente occasion de montrer que vous vous souciez de tous vos utilisateurs. Les bonnes pratiques mentionnées dans cet article et les outils d'assistance tels que l'élément personnalisé <dark-mode-toggle> devraient vous permettre de créer une expérience de mode sombre exceptionnelle. N'hésitez pas à m'indiquer sur Twitter ce que vous créez, si ce post vous a été utile et si vous avez des suggestions pour l'améliorer. Merci de votre attention, 🌒

Ressources pour la requête multimédia prefers-color-scheme :

Ressources sur la balise méta color-scheme et la propriété CSS :

Liens généraux sur le mode sombre :

Articles de recherche de contexte pour cet article:

Remerciements

La fonctionnalité multimédia prefers-color-scheme, la propriété CSS color-scheme et la balise méta associée sont le travail d'implémentation de 👏 Rune Lillesveen. Rune est également co-éditrice de la spécification du module d'ajustement des couleurs CSS niveau 1. Je souhaite remercier Lukasz Zbylut, Rowan Merewood, Chirag Desai et Rob Dodson pour avoir examiné attentivement cet article. La stratégie de chargement est l'idée de Jake Archibald. Emilio Cobos Álvarez m'a indiqué la bonne méthode de détection de prefers-color-scheme. Le conseil contenant les fichiers SVG et currentColor référencés provient de Timothy Hatcher. Enfin, je remercie les nombreux participants anonymes des différentes études utilisateur qui ont contribué à façonner les recommandations de cet article. Image principale par Nathan Anderson.