Maîtrisez l'Art du Dark Mode avec une seule ligne de CSS !
Tags: webdev, css, html, programming
Published: 2024-02-18 03:32:08

Voyons ensemble comment mettre en place facilement un mode sombre avec quelques lignes de CSS inspirées du microframework [nightowl](https://github.com/bufferhead-code/nightowl). Le fonctionnement est assez similaire à celui de l'extension [Dark reader](https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh) sur Chrome.




## Tout ce que vous avez a ajouter a votre feuille de style :

Voici tout ce dont vous avez besoin c'est magique, n'est-ce pas ?
(j'ai pas menti pour les une lignes lisez jusqu'a la fin)

```css
@media (prefers-color-scheme: dark) {
  body {
    filter: invert(100%) hue-rotate(180deg);
  }

  html {
    background-color: #111;
  }

  img, video, iframe {
    filter: invert(100%) hue-rotate(180deg);
  }

  .icon {
    filter: invert(15%) hue-rotate(180deg);
  }

  li::marker {
    color: #666;
  }
}
```

## Alors comment Ça Marche ?


### Les préliminaires avec la règle [@media](https://developer.mozilla.org/fr/docs/Web/CSS/@media)


```css
@media (prefers-color-scheme: dark) {
   .
   .
   .
}
```
Ce bloc de code utilise une règle [@media](https://developer.mozilla.org/fr/docs/Web/CSS/@media) pour cibler les appareils qui préfèrent un schéma de couleurs sombre. Lorsque l'utilisateur a activé le mode de couleur sombre sur son appareil ou navigateur, les styles CSS à l'intérieur de cette règle seront appliqués. Cette approche permet d'adapter l'apparence de l'interface utilisateur en fonction des préférences de l'utilisateur en matière de couleur, offrant ainsi une meilleure expérience d'utilisation.

### La technique magique

voici lafameuse ligne magique tout s'opère ici dans la première règle :

```css
  body {
    filter: invert(100%) hue-rotate(180deg);
  }
```

Ce code applique un filtre d'effet sur l'élément <body> de la page web. Plus spécifiquement, il utilise le filtre [invert(100%)](https://developer.mozilla.org/fr/docs/Web/CSS/filter-function/invert) pour inverser toutes les couleurs, transformant ainsi les teintes claires en teintes sombres et vice versa. Ensuite, il utilise [hue-rotate(180deg)](https://developer.mozilla.org/fr/docs/Web/CSS/filter-function/hue-rotate) pour faire pivoter la teinte des couleurs de 180 degrés, ce qui a pour effet d'inverser la teinte des couleurs restantes. En combinant ces deux filtres, l'effet final est une inversion totale des couleurs de l'élément <body>, créant ainsi une esthétique visuelle inversée.


Revenons un instant sur la fonction [hue-rotate()](https://developer.mozilla.org/fr/docs/Web/CSS/filter-function/hue-rotate). Ce filtre permet de modifier subtilement la teinte des couleurs d'un élément spécifique. En appliquant hue-rotate(angle), où l'angle est exprimé en degrés, toutes les nuances de couleur de l'élément se déplacent autour du cercle chromatique en fonction de cet angle.

la roue chromatique:
![La fameuse roue chromatique](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3bipskvqt5b6enj873mq.jpeg)
Si vous voulez en savoir plus cliquez [ici](https://fr.wikipedia.org/wiki/Cercle_chromatique)

Par exemple, hue-rotate(180deg) fera pivoter toutes les couleurs de 180 degrés autour du cercle chromatique, ce qui signifie que les couleurs complémentaires seront échangées. Les teintes rouges deviendront cyan, les jaunes deviendront bleus, etc...

![les differents angles les plus commun](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ncgqqujvyyhxr4viq9fk.jpg)

### Le problème de firefox

Vous voyez ce code la :

```css
html {
  background-color: #111;
}
```
Vous vous demandez peut-être pourquoi j'applique une couleur en dur alors que j'ai un filtre d'inversion ?

La réponse est simple : le navigateur Firefox ne prend pas en charge les filtres pour l'arrière-plan de l'élément racine <html>.

Ainsi, je dois définir manuellement l'arrière-plan de l'élément racine. Dans votre cas, il vous faudra trouver l'inverse de la couleur de votre arrière-plan. Cette méthode fonctionne également sur d'autres navigateurs, même Internet Explorer (bien que tout le monde déteste IE de toute façon).

### On a encore un gros problème: les médias (img, vidéos etc..)

Avec le filtre d'inversetion et bah tout est inversé même les médias de notre site et si on veux éviter d'avoir des images bizarre comme ça :

![image inversee](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6v4e9a1aa33pam28ezj.png)


On doit donc rusé en inversant le filtre d'inversion...
C'est plutot simple: 

```css
img, video, iframe {
   filter: invert(100%) hue-rotate(180deg);
}
```
![meme](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gfrphzisz1mf7wsaarl3.png)

et ça marche du tonnerre !

### Les ajustements 

les autres règles sont des ajustements optiques pour améliorer le contraste sur quelques éléments comme les icônes et les arrière-plans des blocs de code !


```css
/* Contraste amélioré sur les icônes. */
.icon {
  filter: invert(15%) hue-rotate(180deg);
}

/* Améliorer le contraste sur les marqueurs d'éléments de liste. */
li::marker {
  color: #666;
}
```

Si vous souhaitez intégrer le mode sombre sur votre site web, les filtres CSS sont vos meilleurs alliés, surtout si vous manquez de temps pour élaborer une feuille de style distincte.

Je rends a césar ce qui est a lui ce post a été FORTEMENT inspiré par [Aral Balkan](https://ar.al/), [nightowl](https://github.com/bufferhead-code/nightowl) et [Dark reader](https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh) un grand merci a eux !