optimisation core web vitals 7 min

Pourquoi les couleurs de ton site impactent ton LCP et ton CLS

Les couleurs ne sont pas qu'une question de charte graphique. Contraste, mode sombre, dégradés CSS : découvrez leur impact mesurable sur le Core Web Vitals et comment les optimiser.

Par Julien Morel
Partager

On a vu un site e-commerce perdre 15 points de LCP mobile après une refonte dont l’unique changement visible était une nouvelle palette de couleurs. Le design était plus moderne, plus accessible, plus flatteur. Mais le rendu du texte principal bloquait à 2,8 secondes, alors que le précédent s’affichait en 1,4. Le responsable n’était ni un script lourd ni une image mal compressée. C’était une police variable appelée en six graisses pour reproduire un dégradé de couleur dans les titres. Le brief design avait pris le pas sur la compréhension du pipeline de rendu.

Ce qu’on te raconte rarement, c’est que les couleurs de ton site sont du code exécuté par le navigateur. Elles déclenchent des calculs de style, des repaints, parfois des reflows. Elles dictent quelles ressources de police sont chargées, combien de passes de rendu le GPU doit effectuer, et dans quelle mesure l’affichage reste fluide pendant le scroll. Bref, tes choix de couleurs causent des écarts mesurables sur le Core Web Vitals. Et ça, ni la Search Console ni le PM ne te le signaleront.

Le contraste n’est pas qu’une norme d’accessibilité

Un texte gris clair sur fond blanc, c’est illisible pour 4 % des visiteurs, mais c’est aussi un piège à repaint. Les navigateurs traitent le contraste comme une condition de rendu : plus le ratio est faible, plus le lissage des glyphes sollicite le rasterizer. Sur un écran standard, la différence se chiffre en fractions de milliseconde. Sur un mobile milieu de gamme avec un GPU limité, la répétition de ces coûts pendant le scroll fait chuter l’INP.

On a reproduit la situation avec un titre de 48 px en #CCC sur fond #FFF. Le profil DevTools montrait une succession de paint plus longs que ceux générés par un #333. L’effet était encore plus net sur les textes en font-weight: 300. Le moteur de rendu doit anticréneler davantage, ce qui allonge le temps de frame. Tu ne le vois pas sur ton MacBook Pro M3, mais l’utilisateur avec un smartphone Android à 80 euros, lui, subit des saccades.

Corriger le contraste à l’étape du design system évite de réparer après coup avec des hacks CSS. La norme WCAG 2.2 impose un ratio de 4,5:1 pour le texte normal. Respecter ce seuil, c’est améliorer l’accessibilité, certes, mais aussi offrir au navigateur un signal plus net, qui se rastérise plus vite. Et ça, Googlebot le mesure indirectement via les données de terrain du Chrome User Experience Report.

Couleurs système et mode sombre : l’impact sur le first paint

Un site qui force un thème clair pour tous les visiteurs charge l’intégralité de sa feuille de style sans condition. Celui qui exploite prefers-color-scheme ne sert que la moitié des déclarations de couleur lors du premier chargement. La différence sur le First Contentful Paint peut dépasser 200 ms, simplement parce que le navigateur a moins de propriétés à parser et à appliquer avant de pouvoir peindre le premier pixel.

/* Chargé uniquement quand le système est en mode sombre */
@media (prefers-color-scheme: dark) {
  body {
    background-color: #1a1a1a;
    color: #f0f0f0;
  }
}

Ce n’est pas qu’une économie de CSS. En mode sombre sur un écran OLED, la consommation énergétique de l’affichage baisse, ce qui réduit le throttling thermique du processeur. Moins de chaleur, c’est moins de bridage du CPU, donc une exécution plus constante des scripts. Le thème sombre contribue indirectement à stabiliser l’INP. On n’est pas en train de dire qu’un fond noir te fait gagner trois places dans les SERP. On dit que si ton audience mobile utilise le mode sombre par défaut, lui servir un thème clair durera plus longtemps et chauffera son appareil. Et ça, c’est de l’expérience utilisateur au sens strict du terme.

Si votre application React doit gérer un toggle manuel pour le thème, stocker la préférence dans un store comme Zustand évite les re-rendus en cascade, car la mise à jour est atomique et ne traverse pas toute l’arborescence.

Dégradés et ombres : quand le CSS coûte plus cher que des images

Un linear-gradient avec quatre points d’arrêt, posé sur un bloc en position: fixed, oblige le navigateur à recalculer la texture du fond à chaque frame de défilement si le moindre paramètre du stacking context est modifié. Le coût est d’autant plus élevé que le dégradé couvre une grande surface, comme un hero banner de 100 vh.

On a remplacé un dégradé de ce type par un SVG statique chargé en background-image avec will-change: transform sur le parent. Résultat : la durée moyenne d’une frame de scroll est passée de 28 ms à 12 ms, ce qui a ramené l’INP sous le seuil des 200 ms. Le SVG pesait 800 octets de plus que le code CSS, mais le navigateur n’avait plus à en interpréter le rendu à chaque rafraîchissement. Le compromis était gagnant.

Ce constat vaut aussi pour les box-shadow appliquées sur des cartes en grille. Une ombre floue avec un rayon de 20 px sur 30 éléments visibles dans le viewport provoque un paint composite qui étrangle le budget de 16 ms d’une frame. Désactiver ces ombres lors du scroll, via un media query de préférence de mouvement ou une classe temporaire, peut faire disparaître un INP dégradé en mobile. L’utilisateur ne perçoit pas l’absence d’ombre pendant le défilement, mais il perçoit une interface qui ne lag plus.

Polices de caractères, graisses et couleurs : le cocktail du CLS

Revenons au cas d’ouverture. Le designer avait spécifié un dégradé de couleurs appliqué sur un h1 en background-clip: text. Pour que l’effet soit visible, la police devait être chargée en font-weight: 900, ce qui nécessitait une graisse supplémentaire dans la déclaration @font-face. Cette graisse, absente du premier chargement, a été ajoutée au font-display: swap sans réserve d’espace suffisante. Résultat : le titre a changé de hauteur de ligne après le chargement de la police, décalant tout le contenu en dessous. Un CLS de 0,18, constant sur toutes les pages de la campagne produit.

La correction a consisté à réserver une hauteur minimale via min-height calqué sur la métrique line-height de la police de fallback. Le dégradé n’a pas été supprimé, mais le nombre de graisses a été réduit à deux, les autres effets étant simulés par une opacité sur un pseudo-élément qui ne dépendait pas d’une ressource réseau. Le CLS est passé à zéro, le LCP a perdu 600 ms, et l’effet visuel restait identique pour l’œil.

La leçon : une couleur n’est jamais qu’une couleur. Elle peut déclencher une dépendance réseau, un téléchargement de police, une modification de layout. Chaque choix de teinte dans un mockup Figma doit être traduit en contrainte de chargement pour le navigateur. Sans ça, on empile du CLS sans le savoir.

Mesurer l’impact des couleurs sur le Core Web Vitals

Le premier réflexe, c’est d’ouvrir l’onglet Performance des DevTools, de cocher « Screenshots », puis de lancer un enregistrement en mode « Navigation ». Le filmstrip montre exactement à quel moment le texte devient lisible, et si un flash de couleurs non stylé précède l’affichage des vrais styles. Si un fond blanc éclate avant le fond bleu marine définitif, c’est que la règle de couleur arrive trop tard dans la cascade CSS.

Ensuite, il faut isoler les longues paint frames. Dans la section « Frame Rendering Stats », on repère les frames où le script et le layout sont minces, mais où le paint et le composite explosent. Une barre violette large indique un coût de rasterization. C’est là que les couleurs coûtent cher : dégradés, ombres, mélanges de modes mix-blend-mode. Un site dont les couleurs sont gérées uniquement via des variables CSS natives (--primary) facilite le diagnostic, car une seule modification dans le panneau Styles permet de mesurer l’effet d’un changement de contraste ou d’opacité sur la durée de frame.

Enfin, on corrèle ces relevés avec les données de terrain, via l’API CrUX ou la Search Console. Pour approfondir la collecte et l’interprétation de ces signaux, notre guide sur l’optimisation des Core Web Vitals détaille les méthodes de lab et de terrain.

💡 Conseil : testez toujours vos palettes sur un Moto G4 en throttling CPU 4x via DevTools. Ce que vous voyez fluide sur une machine de développement est souvent cassé sur le hardware majoritaire de vos visiteurs.

Le mythe des couleurs « web safe » et l’optimisation du rendu

Il n’y a plus de palette web safe depuis longtemps. Mais un mythe persistant consiste à croire que réduire le nombre de couleurs accélère le rendu. Le moteur de rendu d’un navigateur moderne n’a pas de limite sur le nombre de couleurs uniques qu’il peut afficher. Ce qui pèse, c’est la complexité du rendu, pas la diversité des valeurs hexadécimales.

En revanche, il y a un grain de vérité dans le choix d’un espace colorimétrique plus large, comme le display-p3. Sur les écrans compatibles, les couleurs P3 nécessitent un profilage différent. Si votre CSS embarque des dizaines de dégradés en oklch() ou color(display-p3 …), le parsing est plus lourd que celui des traditionnelles #RRGGBB. La conversion vers l’espace standard du navigateur introduit une étape de calcul supplémentaire, visible dans les relevés de blaze. On ne vous dira pas d’abandonner le wide-gamut. On vous dit : mesurez avant de généraliser un design system basé sur P3, surtout si votre LCP est déjà sous pression.

Questions fréquentes

Faut-il limiter le nombre de couleurs pour améliorer le temps de rendu ? Non. Le nombre de couleurs déclarées dans la CSS n’est pas un facteur de performance en soi. C’est l’usage qui en est fait qui compte : un background-color uniforme ne coûte rien, alors qu’un radial-gradient multicouche sur une surface animée pénalise le rendu. Concentrez-vous sur les opérations de peinture et de composition plutôt que sur la taille de la palette.

Le choix des couleurs impacte-t-il directement le classement Google ? Pas directement comme un signal de classement dédié. En revanche, les couleurs influencent l’accessibilité (contraste), la stabilité visuelle (CLS), la vitesse d’affichage (LCP) et l’interactivité (INP), autant de signaux mesurés par Google via les Core Web Vitals. Une palette qui dégrade un ou plusieurs de ces signaux finit par peser sur la visibilité.

Peut-on appliquer les couleurs dynamiquement sans pénaliser l’indexation ? Oui, à condition que la version statique serve une base lisible sans JavaScript. Si l’application modifie les couleurs via Zustand ou un contexte React après l’hydratation, assurez-vous que le rendu côté serveur produit déjà une feuille de style complète avec des valeurs par défaut. Googlebot ne déclenche pas de toggle du thème, mais il lit la version SSR.

Articles similaires

Julien Morel

Julien Morel

Ancien dev front React passé SEO technique après une migration e-commerce qui a fait perdre 60% du trafic organique à son employeur en une nuit (fichier robots.txt oublié en staging). Depuis, il écrit pour que ça n'arrive à personne d'autre et teste sur ses propres side-projects avant de publier quoi que ce soit.

Cet article est publie a titre informatif. Faites vos propres recherches avant toute decision.