Favicon avec thème clair/sombre
Tout le monde n’utilise pas son OS ou son navigateur en thème sombre, tout le monde n’a pas son côté gothique twighlight.
Cependant, des fois, le favicon de notre site Web se marie mal avec un thème light ou un thème dark (voire les 2, mais là, je ne peux rien faire).

L’idée est de d’avoir un favicon dédié mode sombre et un dédié mode clair et d’utiliser celui qui est en phase avec le thème utilisé par notre internaute.
Ce se fait avec l’attribut média de la balise link :
<link rel="icon" type="image/png" href="/favicon-light.png" media="(prefers-color-scheme:light)"> |
C’est aussi simple que ça.
Pour générer des favicons, vous avez l’embarras du choix :
- https://realfavicongenerator.net/
- https://favicon.io/
- https://www.favicon-generator.org/
- https://www.favicon.cc/
Favicon SVG natif
Le format SVG est supporté comme favicon par tous les navigateurs modernes. Il offre l’avantage d’être vectoriel (net sur tous les écrans) et de supporter les media queries directement :
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> |
SVG avec prefers-color-scheme intégré
On peut intégrer la gestion clair/sombre directement dans le fichier SVG, sans avoir besoin de deux fichiers ni de JavaScript :
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> |
Un seul fichier, pas de balise media dans le HTML, tout est géré dans le SVG. C’est la solution la plus propre.
<!-- Un seul link suffit --> |
Changement dynamique par JavaScript
Si vous avez besoin de changer le favicon en fonction d’un bouton utilisateur (pas seulement du thème système) :
function setFavicon(theme) { |
Pour détecter le changement de thème système en temps réel :
window.matchMedia('(prefers-color-scheme: dark)') |
Génération programmatique avec Sharp
Pour ceux qui veulent automatiser la génération de leurs favicons (taille, couleurs, thèmes) :
const sharp = require('sharp'); |
Sharp permet aussi de générer les icônes pour iOS (apple-touch-icon), Android (manifest), etc. Le tout automatisé dans votre build.