Optimiser les images pour les Core Web Vitals

Apprenez comment les images affectent les Core Web Vitals et comment les optimiser

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2024-11-27

Comment les images peuvent-elles affecter les Core Web Vitals ?

Les images jouent un rôle important dans l'amélioration de l'attrait visuel d'un site web, mais elles peuvent aussi avoir un impact significatif sur sa vitesse de chargement. Les Core Web Vitals sont un ensemble de métriques que Google utilise pour mesurer l'expérience utilisateur d'un site web, et l'optimisation des images est un facteur critique pour obtenir de bons scores. Dans cet article, nous discuterons de la manière d'optimiser les images pour les Core Web Vitals et d'améliorer la vitesse de chargement de votre site web.

Comprendre les Core Web Vitals

core web vitals all metrics

Avant de nous plonger dans l'optimisation des images, passons brièvement en revue les Core Web Vitals. Il s'agit d'un ensemble de métriques centrées sur l'utilisateur qui mesurent la vitesse de chargement, l'interactivité et la stabilité visuelle d'une page web. Les trois métriques clés sont :

Largest Contentful Paint (LCP) : mesure la vitesse de chargement du plus grand élément sur la page.
First Input Delay (FID) : mesure le temps nécessaire pour que la page devienne interactive.
Cumulative Layout Shift (CLS) : mesure la stabilité visuelle de la page.

Quels Core Web Vitals les images peuvent-elles affecter ?

Vous pourriez être surpris d'apprendre que les images peuvent affecter tous les Core Web Vitals. Les images, si elles sont mises en file d'attente pour le téléchargement tardivement lors du rendu ou si elles sont simplement trop volumineuses, entraîneront généralement un score LCP élevé. Si les dimensions de l'image ne sont pas définies ou changent pendant la phase de chargement, les images peuvent également affecter le score CLS. Et enfin, si le décodage de l'image prend trop de travail sur le fil principal, elles peuvent même affecter l'INP. Regardons de plus près :

Largest Contentful Paint

L'un des Core Web Vitals est le Largest Contentful Paint (LCP), qui mesure combien de temps il faut pour que le plus grand élément sur la page (comme une image ou une vidéo) devienne visible pour l'utilisateur. Si une image est mise en file d'attente trop tard ou prend trop de temps à charger, cela peut ralentir considérablement le score LCP de la page.

Cumulative Layout Shift

Un autre Core Web Vital est le Cumulative Layout Shift (CLS), qui mesure à quel point le contenu d'une page se décale pendant son chargement. Les images peuvent provoquer des décalages de mise en page si elles ne sont pas correctement dimensionnées ou si elles sont insérées dans la page après qu'elle a déjà chargé, provoquant le déplacement d'autres éléments .

First Input Delay et INP

Enfin, les images peuvent également impacter le troisième Core Web Vital, l'INP, qui mesure le temps qu'il faut pour qu'une page réponde visuellement après qu'un utilisateur interagisse avec une page. S'il y a trop de grandes images qui doivent être décodées, la page peut prendre plus de temps pour répondre aux interactions de l'utilisateur, conduisant à un mauvais score INP.

Étape 1 : Optimiser l'élément image HTML pour la vitesse

La première chose à vérifier lors de l'optimisation des images est le code HTML pour toutes les images. Les images sont simples et les navigateurs sont excellents pour effectuer des tâches simples. Alors essayez d'éviter les astuces et les solutions intelligentes et utilisez simplement la bonne vieille balise image html <img> et utilisez toutes les options que vous avez pour accélérer vos images !
cwv image and attributes

Attribut Src

Spécifie l'URL de l'image. Cette propriété est essentielle, car elle indique au navigateur où trouver l'image.

Attribut Width et height

Spécifie la largeur et la hauteur de l'image en pixels. Ces propriétés sont importantes pour rendre l'image correctement sur la page, car elles définissent la taille du conteneur de l'image et comment l'image s'adapte à l'intérieur.

Attribut Alt

Spécifie un texte alternatif pour l'image si elle ne peut pas être affichée. C'est important pour l'accessibilité, car cela aide les utilisateurs malvoyants à comprendre de quoi traite l'image. C'est aussi important pour le référencement (SEO), car les moteurs de recherche utilisent le texte alt pour comprendre le contenu de l'image.

Attribut Loading (chargement différé)

Spécifie comment le navigateur doit charger l'image (lazy, eager, ou auto). Cette propriété est importante pour améliorer la performance de la page, car elle permet aux images d'être chargées de manière asynchrone et seulement lorsqu'elles sont nécessaires.

Attribut Srcset

Spécifie une liste séparée par des virgules de sources d'image et leurs tailles, ce qui permet au navigateur de choisir la meilleure source d'image en fonction de la taille de l'écran et de la résolution de l'appareil. Cette propriété est importante pour le responsive design, car elle assure que les utilisateurs obtiennent la meilleure qualité d'image possible quel que soit leur appareil.

Attribut Sizes

Spécifie les tailles de la source d'image à utiliser en fonction de la taille de la fenêtre d'affichage (viewport). Cette propriété fonctionne en tandem avec srcset pour assurer que la taille d'image correcte est chargée sur différents appareils et tailles d'écran, améliorant la performance globale de la page.

Attribut Decoding

Spécifie comment le navigateur doit décoder l'image (async, sync, ou auto). Cette propriété est aussi importante pour améliorer la performance de la page, car elle permet au navigateur de (dé)prioriser le décodage de l'image par rapport au rendu du reste de la page.

Attribut Fetchpriority

L'attribut fetchpriority spécifie la priorité de la récupération d'une ressource par rapport aux autres ressources sur la page. L'attribut priority peut avoir l'une des trois valeurs : "high", "medium", ou "low". Une ressource avec une priorité haute (high) est chargée avant les ressources avec des priorités moyenne (medium) ou basse (low). Une ressource avec une priorité moyenne est chargée avant les ressources avec une priorité basse. Les ressources avec la même priorité sont chargées dans l'ordre où elles apparaissent dans le HTML.

Étape 2 : Assurez-vous que l'image est mise en file d'attente pour le téléchargement le plus tôt possible

La deuxième chose à faire, après avoir optimisé le html, est de regarder la planification des images. Dans de nombreux cas, le plus grand goulot d'étranglement, quand il s'agit d'images affectant la métrique LCP, est la planification tardive. Si un navigateur a une chance de télécharger l'élément LCP tôt pendant le processus de rendu, l'image sera disponible pour le navigateur le plus tôt possible et le navigateur peut commencer à peindre cet élément tôt dans le processus de rendu.

Ça semble simple, non ? Eh bien, comment nous assurons-nous que l'image est mise en file d'attente pour le téléchargement le plus tôt possible.

Précharger l'élément LCP

Le moyen le plus efficace d'assurer un téléchargement précoce est de précharger l'image. Le préchargement de l'image se fait avec une simple balise au début de l'élément <head>. Par exemple :

<link rel="preload" as="image" href="image.jpg">

Cette simple balise dira au navigateur que nous aurons besoin de "image.jpg" assez bientôt et le navigateur commencera à télécharger ce fichier immédiatement.

Charger en mode Eager l'élément LCP

Vous devriez toujours éviter le chargement différé (lazy loading) de l'élément LCP. Si vous faites du chargement différé de l'élément LCP, le chargement différé basé sur JavaScript est particulièrement mauvais pour la vitesse de page ! Le chargement différé basé sur JavaScript repose sur un script pour réécrire votre balise <img>. Habituellement, l'img aura un attribut data-src qui est réécrit en un attribut src par JavaScript. Le problème avec cela est double
1. Le scanner de préchargement du navigateur ne reconnaît pas l'attribut data-src et ne déclenchera pas proactivement l'élément pour un téléchargement précoce.
2. Le chargement différé basé sur JS doit attendre qu'un JavaScript soit chargé et exécuté. Cela se produit généralement relativement tard pendant le processus de rendu. Cela cause un délai encore plus grand pour l'image.

Pour éviter ce problème complètement, assurez-vous que l'élément LCP est toujours chargé en mode eager. Puisque 'eager' est la valeur par défaut pour toute image, vous devez seulement vous assurer que l'image n'est pas chargée en différé (lazy loaded). Faites cela en supprimant l'attribut natif 'loading="lazy"' ou si vous utilisez un plugin d'optimisation, vérifiez la documentation sur comment sauter le chargement différé pour une image !

Utiliser fetchpriority high

Si, pour une raison quelconque, vous ne pouvez pas précharger l'élément LCP, assurez-vous au moins que l'élément a l'attribut fetchpriority défini sur high. Cela indiquera au navigateur que cette image est importante pour la page et le navigateur la téléchargera avec une haute priorité. Veuillez noter que l'utilisation de fetchpriority="high" n'est généralement pas aussi efficace que le préchargement d'une image !

Éviter le chargement différé basé sur JavaScript

Vous devriez toujours éviter le chargement différé de l'élément LCP. Si vous faites du chargement différé de l'élément LCP, le chargement différé basé sur JavaScript est particulièrement mauvais pour la vitesse de page ! Le chargement différé basé sur JavaScript repose sur un script pour réécrire votre balise <img>. Habituellement, l'img aura un attribut data-src qui est réécrit en un attribut src par JavaScript. Le problème avec cela est double
1. Le scanner de préchargement du navigateur ne reconnaît pas l'attribut data-src et ne déclenchera pas proactivement l'élément pour un téléchargement précoce.
2. Le chargement différé basé sur JS doit attendre qu'un JavaScript soit chargé et exécuté. Cela se produit généralement relativement tard pendant le processus de rendu. Cela cause un délai encore plus grand pour l'image.

Étape 3 : Assurez-vous que l'image est téléchargée aussi vite que possible

La troisième chose à faire est de vous assurer que vous ne gaspillez pas de précieuses ressources réseau sur des images qui sont plus grandes qu'elles ne devraient l'être. Vous pouvez faire cela en utilisant des images réactives, en utilisant la compression et en utilisant de nouveaux conteneurs d'images plus rapides

Images réactives

L'un des problèmes les plus courants avec le LCP est l'envoi d'une 'image héro' de taille bureau complète de 1920x1200px vers un appareil mobile qui rend l'image à environ 360x225. Cela signifie que l'image est environ 28 fois plus grande que ce qu'elle devrait être (bien sûr, vous pourriez envoyer des images à un DPI plus élevé, alors l'image pleine taille serait 7 fois plus grande !) !
C'est là que les images réactives entrent en jeu ! Les images réactives envoient une version différente d'une image à différentes fenêtres d'affichage. Cela signifie que nous pouvons envoyer une petite image à un navigateur mobile, une image légèrement plus grande à une tablette et une image pleine taille à un ordinateur de bureau pour nous assurer qu'aucun octet inutile n'est envoyé !

Compression d'image

La compression d'image vous permet de réduire la taille de fichier d'une image tout en préservant la majeure partie de sa qualité visuelle. Elle implique diverses techniques qui éliminent les données redondantes ou non pertinentes. La plupart des systèmes CMS modernes appliquent une compression d'image lorsque les images sont téléchargées dans la bibliothèque. Cependant, si vous contournez la bibliothèque ou utilisez votre propre solution personnalisée, vérifiez toujours que les images ont le bon niveau de compression !

Nouveaux conteneurs d'images plus rapides

jpg web avif

Les images sont souvent l'une des plus grandes ressources sur une page web, et elles peuvent ralentir considérablement la vitesse de chargement d'une page si elles ne sont pas optimisées. Des conteneurs d'images plus récents et plus rapides, tels que les formats WebP et AVIF, peuvent aider à réduire la taille de fichier des images sans sacrifier leur qualité. Cela signifie qu'elles peuvent être chargées plus rapidement, ce qui peut améliorer la vitesse de chargement de la page.

Étape 4 : Éliminez le Layout Shift !

Les images qui changent de taille pendant qu'elles chargent causeront un layout shift (décalage de mise en page). C'est aussi simple que cela. Il y a 3 raisons principales pour lesquelles les images causent un layout shift (il y en a beaucoup plus en fait, mais ces 3 sont les plus courantes)

1. Dimensions d'image manquantes

Les dimensions de l'image sont l'attribut width et l'attribut height de l'image. Si l'attribut width ou l'attribut height n'est pas défini, le navigateur ne sait pas combien d'espace réserver pour l'image pendant le rendu et il réservera 0 pixels pour toute dimension manquante.

Cela signifie qu'une image sans largeur et hauteur définies sera rendue à 0x0 pixels et ensuite, quand l'image aura été chargée et décodée, le navigateur recalculera la mise en page pour utiliser la quantité correcte d'espace pour l'image.

2. Problèmes de style

Habituellement, on empêche les images de devenir plus grandes que la fenêtre d'affichage par une simple astuce CSS

img{\r\n   max-width:100%;   height:auto;\r\n}

C'est une excellente astuce et vous devriez l'utiliser. Malheureusement, je vois régulièrement des variantes de cette astuce qui causent un layout shift. Par exemple en ajoutant width:auto :

img{\r\n   max-width:100%;   height:auto;\r\n   width:auto;\r\n}

Cela fera rendre n'importe quelle image avec une largeur et une hauteur auto. Cela signifie généralement que le navigateur rendra l'image à 0x0px avant que l'image n'ait été téléchargée

3. Espaces réservés (Placeholders)

Certains scripts de chargement différé basés sur JavaScript utilisent des espaces réservés. Si vous utilisez une sorte d'astuce CSS comme celle mentionnée ci-dessus max-width:100% et height:auto, alors la hauteur auto de l'espace réservé carré ne correspondra pas à la hauteur de l'image. Fondamentalement, l'image sera d'abord rendue avec l'espace réservé carré à 720x720 et quand l'image finale aura été téléchargée, elle sera rendue à 720*180

<img 
  src="1x1placeholder.png" 
  data-src="hero.png" 
  width="720" 
  height="180"
  style="height:auto;max-width:100%"
>


Étape 5 : Protéger le fil principal (main thread)

La prochaine chose à s'assurer est que pas trop d'images ne sont décodées sur le fil principal en même temps. Habituellement, ce ne sera pas un problème mais je l'ai vu arriver de nombreuses fois sur des pages de liste de produits (où parfois jusqu'à 500 images sont en compétition pour les ressources !).

L'astuce est d'ajouter decoding="async" à toutes les images pour s'assurer que ces images peuvent être décodées sur un fil séparé. Essayez aussi d'éviter qu'autant d'images soient décodées toutes en même temps en ajoutant loading="lazy" à toutes les images en dessous de la ligne de flottaison et cachées.

Étape 6 : Choisissez la bonne stratégie pour chaque image !

L'étape finale, et parfois la plus importante, est de prioriser les images importantes et de dé-prioriser les images non importantes !

Stratégies d'image pour l'élément LCP

L'élément LCP est généralement l'élément visuel le plus important. Nous devons donc vraiment prioriser celui-ci."

  1. Préchargez l'image tôt dans le head de la page avec ce code : <link rel="preload" as="image" href="path-to-img.png">
  2. Dites au navigateur que cette image ne doit pas être chargée en différé en définissant loading="eager" ou en omettant l'attribut loading
  3. Indiquez au navigateur que cette image doit être téléchargée avec une haute priorité en utilisant fetchpriority="high" (si vous préchargez l'image, vous pouvez sauter cette partie)
  4. Définissez decoding="sync" puisque cet élément est si important que nous voulons le décoder sur le fil principal

Stratégie d'image pour les logos et autres images visibles (non-LCP)

Les images visibles devraient être chargées assez tôt pendant le chargement de la page mais de préférence après l'élément LCP. Nous pouvons y parvenir en préchargeant l'élément LCP. Cela donnera à ces images visibles leur ordre de téléchargement naturel et correct.

  1. Dites au navigateur que cette image ne doit pas être chargée en différé en définissant loading="eager" ou en omettant l'attribut loading
  2. Définissez decoding="async" puisque cet élément peut être décodé en toute sécurité hors du fil principal !

Stratégie d'image pour les images en dessous de la ligne de flottaison

Toutes les images en dessous de la ligne de flottaison devraient être chargées en différé (lazy loaded). C'est aussi simple que cela ! Il n'y a pas d'exceptions !

  1. Dites au navigateur que cette image doit être chargée en différé en définissant loading="lazy"
  2. Définissez decoding="async" puisque cet élément peut être décodé en toute sécurité hors du fil principal !

Éviter les images d'arrière-plan

Si vous utilisez des images d'arrière-plan, vous devez reconsidérer. Les images d'arrière-plan ne peuvent pas être chargées en différé et vous ne pouvez pas contrôler la propriété decoding et vous ne pouvez pas définir le fetchpriority. Les images d'arrière-plan ne sont généralement pas réactives, ce qui vous coûtera probablement beaucoup de bande passante. Mais le plus important, les images d'arrière-plan sont généralement découvertes après que le navigateur a téléchargé les fichiers CSS. Ce n'est presque jamais le bon moment pour déclencher un téléchargement d'image !

Vous pouvez utiliser des balises d'image normales en combinaison avec le CSS object-fit:cover pour faire en sorte que les images normales se comportent comme des images d'arrière-plan !

CrUX data is 28 days late.

Google provides data 28 days late. CoreDash provides data in real-time. Debug faster.

Get Real-Time Data >>

  • Real-Time Insights
  • Faster Debugging
  • Instant Feedback
Optimiser les images pour les Core Web VitalsCore Web Vitals Optimiser les images pour les Core Web Vitals