L'été StartingUp est aussi l'occasion de rouvrir nos archives. Après avoir enterré les questions que l'IA a rendues obsolètes, en voici une qui a survécu : ce texte de 2021 sur le dark mode en CSS et le respect du thème choisi par vos visiteurs n'a pas pris une ride sur le fond. De prefers-color-scheme à la fonction light-dark() arrivée depuis, nous le publions enfin, dans son jus, en n'en dépoussiérant que les détails techniques.
Détecter la préférence de ton visiteur avec prefers-color-scheme
macOS, Windows, iOS, Android : tous les systèmes permettent aujourd'hui à leurs utilisateurs de choisir entre un thème clair et un thème sombre. Ce choix, le navigateur le connaît et le transmet à ta feuille de style via la media query prefers-color-scheme.
Cette media query est désormais supportée par tous les navigateurs : tu peux t'appuyer dessus sans arrière-pensée, en CSS pur, sans une ligne de JavaScript :
Forcer l'usage d'un thème via un bouton Toggle
Si tu souhaites permettre à tes visiteurs de changer manuellement de thème via un bouton, tu peux choisir de forcer ces valeurs en utilisant des variables CSS :
Aller plus loin dans l'intégration du Dark Mode via SASS
Si tu es un utilisateur de SASS, je ne peux que t'encourager à te créer des mixins pour éviter de dupliquer ces directives un peu verbeuses partout dans ton code :
Je choisis ici d'ajouter la class indiquant le thème sur l'objet <html> et non sur le <body> de manière à pouvoir styliser également l'élément <body> avec ce mixin.
Tu pourras ainsi intégrer aisément ton Dark Mode dans l'ensemble de tes composants hérités de cette manière :
Dark Mode : Le niveau ultime
Nous pouvons aller encore plus loin avec ce que nous avons créé :
Nous nous rendons compte qu'il n'est pas nécessaire de dupliquer tout le code pour un thème light, que nous pourrions simplement définir comme « l'absence de thème sombre ».
light-dark() : le raccourci qui n'existait pas en 2021
Le CSS a continué d'avancer depuis l'écriture de ces lignes : les trois moteurs majeurs prennent en charge, depuis 2024, la fonction light-dark(). Elle permet de déclarer les deux variantes d'une couleur en une seule ligne, sans media query :
La propriété color-scheme est indispensable : c'est elle qui annonce au navigateur que ta page gère les deux thèmes. Elle t'offre au passage un toggle presque gratuit : force color-scheme: light ou color-scheme: dark sur l'élément <html>, et toutes tes valeurs light-dark() basculent avec lui. La fonction ne s'applique pour l'instant qu'aux couleurs ; pour le reste, les media queries et les variables vues plus haut restent de mise.
Sources :
- https://css-tricks.com/dark-modes-with-css/
- https://developer.mozilla.org/fr/docs/Web/CSS/color_value/light-dark






