Optimiser ses Core Web Vitals avec le CSS
Mise en page, images, polices et animations : découvrez les techniques CSS qui améliorent le CLS et le LCP de vos pages.
La façon dont vous écrivez vos styles et construisez vos mises en page a un impact majeur sur les Core Web Vitals, en particulier sur le Cumulative Layout Shift (CLS) et le Largest Contentful Paint (LCP). Le CSS n’est pas qu’une affaire d’esthétique : il conditionne la stabilité visuelle et la vitesse d’affichage du contenu principal. Bien maîtrisé, il évite des problèmes courants qui frustrent les visiteurs et pénalisent le SEO.
Les optimisations CSS se répartissent selon les grands aspects d’une page : mise en page, images, polices, animations et chargement. Beaucoup de gains se font sans réécrire l’application : il s’agit souvent de réserver de l’espace, de définir des dimensions ou de remplacer une technique coûteuse par une alternative native plus légère. Ce tutoriel passe en revue ces leviers, de la mise en page au CSS critique.
On sous-estime énormément le CSS quand on parle performance, comme s’il ne s’agissait que d’esthétique. C’est une erreur : la façon dont vous gérez vos images, vos polices et vos mises en page conditionne directement le CLS et le LCP. Le bon côté, c’est que beaucoup de ces gains se font sans toucher au JavaScript, juste en écrivant des styles qui réservent l’espace et ne bloquent pas le rendu.
Les leviers CSS par aspect de page
Avant d’entrer dans le détail, voici une vue d’ensemble des principaux leviers CSS, regroupés par aspect de la page, avec la métrique qu’ils améliorent en priorité.
| Aspect de la page | Levier CSS | Métrique améliorée |
|---|---|---|
Mise en page |
Positionner ou réserver l’espace du contenu inséré |
CLS |
Images |
Définir width et height ; remplacer une image décorative par un dégradé |
CLS et LCP |
Polices |
Charger via link et preconnect ; choisir des proportions proches |
FCP, LCP et CLS |
Animations |
Utiliser transform, opacity et filter plutôt que la mise en page |
CLS |
Chargement |
Intégrer le CSS critique et différer le CSS non critique |
LCP |
Stabiliser la mise en page
Insérer du contenu dans une page déjà chargée pousse tout le reste vers le bas et provoque des décalages de mise en page. Les notifications de cookies placées en haut de page en sont un exemple classique, tout comme les publicités et les éléments intégrés. L’audit Lighthouse Éviter les grands décalages de mise en page aide à repérer les éléments concernés, même si certains, comme une bannière de cookies, ne se déplacent pas eux-mêmes mais font glisser le contenu situé en dessous. Pour traiter ce signal en profondeur, voyez comment optimiser le CLS.
La correction consiste à positionner la notification en bas de page avec un positionnement fixe, ou à réserver de l’espace pour elle en haut de l’écran. Les deux approches sont aussi efficaces l’une que l’autre. Voici la modification CSS recommandée pour déplacer une bannière sans provoquer de décalage.
/* Avant */
.banner {
position: sticky;
top: 0;
}
/* Après */
.banner {
position: fixed;
bottom: 0;
}
Maîtriser les images
Les images sont souvent l’élément LCP d’une page. Premier réflexe : éviter de charger une image lourde quand un effet visuel suffit. Dans l’exemple de Google, l’arrière-plan d’une bannière reposait sur une grande image, remplaçable par un simple dégradé CSS, bien plus léger et instantané à afficher.
Les images sont aussi une cause majeure de décalage de mise en page : le navigateur ne connaît leur taille qu’une fois chargées. Sans espace réservé, leur apparition décale le contenu. La solution est de définir les attributs width et height sur chaque image, ce que signale l’audit Lighthouse correspondant. Le navigateur peut alors allouer le bon espace dès le départ. L’exemple ci-dessous montre la correction à appliquer.
<!-- Avant -->
<img src="https://source.unsplash.com/random/800x600" alt="image à charger">
<!-- Après -->
<img src="https://source.unsplash.com/random/800x600" width="800" height="600" alt="image à charger">
Charger les polices sans bloquer le rendu
Les polices Web peuvent retarder l’affichage du texte et provoquer des décalages de mise en page. Par défaut, un navigateur n’affiche pas le texte tant que la police associée n’est pas chargée, afin d’éviter un flash de texte sans style : cela retarde souvent le FCP, parfois le LCP. Les navigateurs basés sur Chromium et Firefox bloquent le rendu jusqu’à trois secondes, puis affichent une police de remplacement ; Safari le bloque indéfiniment.
Pour fournir les polices plus vite, préférez le chargement via des balises link avec un indice preconnect plutôt qu’une instruction @import, plus lente. Utiliser des polices de proportions proches de la police de remplacement limite aussi l’ampleur des décalages lors de l’échange. L’inspection se fait via l’onglet Réseau des DevTools, filtré par police ; pour aller plus loin, consultez notre guide pour optimiser le chargement des polices. Voici la mise en place recommandée pour Google Fonts.
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap" rel="stylesheet">
Animations et CSS critique
Les animations pèsent surtout sur les Core Web Vitals lorsqu’elles déclenchent des recalculs de mise en page ou déplacent des éléments. Préférez des propriétés performantes comme transform, opacity et filter, qui s’exécutent sans recalculer la mise en page. Par exemple, une animation d’entrée doit utiliser transform: translateX() plutôt qu’une transition sur margin-left. Attention : l’audit Lighthouse Éviter les animations non composées ne détecte que les animations CSS, pas celles pilotées par JavaScript.
Enfin, les feuilles de style bloquent le rendu : quand le navigateur rencontre un fichier CSS, il interrompt le téléchargement d’autres ressources jusqu’à l’avoir analysé, ce qui peut retarder le LCP. Pour limiter cet effet, supprimez le CSS inutilisé, intégrez le CSS critique directement dans la page et différez le CSS non critique ; voyez aussi comment éviter le CSS bloquant l’affichage.
L’audit Éviter les animations non composées ne signale que les animations CSS non performantes. Les animations pilotées par JavaScript, par exemple celles qui modifient un élément avec setInterval, nuisent aux performances mais ne sont pas détectées par cet audit. Vérifiez-les manuellement et remplacez-les autant que possible par des animations CSS reposant sur transform, opacity ou filter.
À faire
- réserver l’espace du contenu inséré
- définir width et height sur les images
- précharger les polices avec preconnect
- intégrer le CSS critique
À éviter
- insérer une bannière qui pousse le contenu
- oublier les dimensions des images
- charger les polices via @import
- animer margin-left plutôt que transform
Points clés à retenir
- Réserver l'espace ou positionner le contenu inséré en bas
- Définir les dimensions de toutes les images
- Remplacer les images décoratives lourdes par du CSS
- Charger les polices tôt avec preconnect
- Animer avec transform, opacity et filter
Un CSS bien pensé stabilise la page et accélère l’affichage.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Comment éviter les décalages de mise en page provoqués par une bannière de cookies en haut de page ?
- Animer la bannière avec margin-left plutôt qu'avec transform
- Réserver l'espace du contenu inséré pour qu'il ne pousse pas le reste de la page
- Charger la bannière le plus tard possible une fois la page affichée
Insérer du contenu dans une page déjà chargée pousse le reste vers le bas et provoque du CLS. Réserver l’espace du contenu inséré évite ces décalages.
-
Quel réflexe CSS permet d'alléger une image qui sert d'élément LCP ?
- Omettre les attributs width et height pour laisser le navigateur décider
- Remplacer une grande image d'arrière-plan par un simple dégradé CSS quand un effet visuel suffit
- Charger l'image via @import pour la mettre en cache plus tôt
Premier réflexe : éviter une image lourde quand un effet suffit. Dans l’exemple de Google, l’arrière-plan d’une bannière a été remplacé par un dégradé CSS bien plus léger.
-
Quelles propriétés CSS faut-il privilégier pour des animations qui ne pèsent pas sur les Core Web Vitals ?
- transform, opacity et filter, qui s'exécutent sans recalculer la mise en page
- margin-left et top, qui déplacent directement les éléments
- width et height, qui ajustent la taille à chaque image
Les animations pèsent quand elles déclenchent des recalculs de mise en page. Privilégier transform, opacity et filter permet de les exécuter sans recalculer la mise en page.
Besoin d'un accompagnement SEO ?
Votre page saute ou s'affiche trop lentement ? Voyons ensemble quels réglages CSS stabiliseront l'expérience.