Addy Osmani est un directeur technique travaillant sur Google Chrome. Son équipe se concentre sur les outils et les cadres de vitesse, aidant à garder le Web rapide. Consacré au… En savoir plus sur Addy ↬
Les images ont également été un élément clé du Web. Ils communiquent des idées instantanément, mais ils sont aussi beaucoup plus lourds que du texte à charger. Cela signifie qu'il est essentiel de bien les charger et de les afficher, si vous voulez donner à vos utilisateurs une première impression fantastique. Un extrait du nouveau livre d'Addy (consultez également un aperçu PDF gratuit ).
L'humble élément a acquis quelques super pouvoirs au fil des ans. Compte tenu de son importance pour l'optimisation des images sur le Web, voyons ce qu'il peut faire et comment il peut contribuer à améliorer l'expérience utilisateur et les Core Web Vitals . J'aborderai l'optimisation d'image plus en détail dans le nouveau livre de Smashing Magazine sur l'optimisation d'image .
Évitez les images provoquant des conflits de réseau avec d'autres ressources critiques comme CSS et JS . Bien qu'elles ne bloquent pas le rendu, elles peuvent avoir un impact indirect sur les performances de rendu.
Remarque : Composants d'image modernes basés sur comme Next.js (pour React) et Nuxt image (pour Vue) essaie d'introduire autant de ces concepts que possible par défaut. Nous en parlerons plus tard. Vous pouvez bien sûr également le faire manuellement en utilisant directement l'élément . Si vous utilisez 11ty pour vos sites statiques, essayez le modèle de blog haute performance 11ty .
Quel est l'impact des images sur l'expérience utilisateur et les éléments vitaux du Web?
Vous avez peut-être entendu parler de Core Web Vitals ( CWV). Il s'agit d'une initiative de Google visant à partager des conseils unifiés pour les signaux de qualité qui peuvent être essentiels pour offrir une excellente expérience utilisateur sur le Web. CWV fait partie d'un ensemble de signaux d'expérience de page La recherche Google évaluera pour le classement. Les images peuvent avoir un impact sur la CWV de plusieurs façons.
Dans de nombreuses expériences Web modernes, les images ont tendance à être le plus grand élément visible à la fin du chargement d'une page. Ceux-ci incluent des images de héros, des images de carrousels, des histoires et des bannières. Largest Contentful Paint (LCP) est une métrique Core Web Vitals qui mesure le moment où le plus grand élément de contenu (images, texte) dans la fenêtre d'affichage d'un utilisateur, comme l'une de ces images, devient visible.
Cela permet un navigateur pour déterminer quand le contenu principal de la page a fini de s'afficher . Lorsqu'une image est le plus grand élément de contenu, la lenteur du chargement de l'image peut avoir un impact sur LCP. En plus d'appliquer la compression d'image (par exemple en utilisant Squoosh Sharp ImageOptim ou une image CDN ), et en utilisant un format d'image moderne , vous pouvez modifier l'élément pour afficher la version responsive la plus appropriée d'une image ou la charger différemment.
Les changements de disposition peuvent distraire les utilisateurs. Imaginez que vous ayez commencé à lire un article quand tout d'un coup des éléments se déplacent autour de la page, vous déconcertant et vous obligeant à retrouver votre place. Cumulative Layout Shift (CLS, une métrique Core Web Vitals) mesure l'instabilité du contenu. Les causes les plus courantes de CLS incluent les images sans dimensions (voir ci-dessous) qui peuvent pousser le contenu vers le bas lorsqu'elles se chargent et se mettent en place; les ignorer signifie que le navigateur ne pourra peut-être pas réserver suffisamment d'espace avant leur chargement.
Il est possible que les images bloquent la bande passante et le processeur d'un utilisateur lors du chargement de la page. Ils peuvent entraver la charge des ressources critiques, en particulier sur les connexions lentes et les appareils mobiles bas de gamme, entraînant une saturation de la bande passante. Premier délai d'entrée (FID) est une métrique Core Web Vitals qui capture la première impression d'un utilisateur sur l'interactivité et la réactivité d'un site. En réduisant l'utilisation du CPU du thread principal, le FID peut également être réduit.
Lighthouse
Dans ce guide, nous utiliserons Lighthouse pour identifier les opportunités d'améliorer les Core Web Vitals. Lighthouse est un outil automatisé open source pour améliorer la qualité des pages Web. Vous pouvez le trouver dans la suite d'outils de débogage Chrome DevTools et l'exécuter sur n'importe quelle page Web, publique ou nécessitant une authentification. Vous pouvez également trouver Lighthouse dans PageSpeed Insights CI et WebPageTest .
Gardez à l'esprit que Lighthouse est un outil de laboratoire. Bien que ce soit parfait pour examiner les possibilités d'améliorer votre expérience utilisateur, essayez toujours de consulter données du monde réel pour une image complète de ce que voient les utilisateurs réels.
Les bases
Pour placer une image sur une page Web, nous utilisons l'élément . C'est un élément vide – il n'a aucune balise de fermeture – nécessitant au moins un attribut pour être utile: src la source. Si une image s'appelle donut.jpg et qu'elle existe dans le même chemin que votre document HTML, elle peut être incorporée comme suit:
Pour nous assurer que notre image est accessible, nous ajoutons le alt attribut . La valeur de cet attribut doit être une description textuelle de l'image et est utilisée comme alternative à l'image lorsqu'elle ne peut pas être affichée ou vue; par exemple, un utilisateur accédant à votre page via un lecteur d'écran. Le code ci-dessus avec un alt spécifié se présente comme suit:
Ensuite, nous ajoutons les attributs width et height ] pour spécifier la largeur et la hauteur de l'image, également appelées dimensions de l'image. Les dimensions d'une image peuvent généralement être trouvées en regardant ces informations via l'explorateur de fichiers de votre système d'exploitation ( Cmd + I sur macOS).
Lorsque width et height sont spécifiés sur une image, le navigateur sait combien d'espace réserver pour l'image jusqu'à ce qu'elle soit téléchargée. Oublier d'inclure les images Les dimensions peuvent entraîner des changements de mise en page car le navigateur ne sait pas combien d'espace l'image aura besoin.
Les navigateurs modernes définissent désormais le rapport hauteur / largeur par défaut des images en fonction de la largeur d'une image et height attributs, il est donc utile de les définir pour éviter de tels changements de disposition.
Identifier le plus grand élément de peinture de contenu
Lighthouse dispose d'un audit «Élément de peinture de plus grand contenu» qui identifie l'élément qui était le plus grand peinture pleine de contenu. Le survol de l'élément le mettra en surbrillance dans la fenêtre principale du navigateur.
Si cet élément est une image, ces informations sont un indice utile pour optimiser le chargement de cette image. Vous pouvez également trouver ce Signet LCP par Annie Sullivan utile pour identifier rapidement l'élément LCP avec un rectangle rouge en un seul clic.
Remarque: L'élément de peinture le plus grand contenu candidat peut changer via le chargement de la page. Pour cette raison, il est utile non seulement de regarder ce que les outils synthétiques comme Lighthouse peuvent dire, mais aussi de consulter ce que vrais utilisateurs voient.
Survol d'une image dans Chrome DevTools Elements ] affichera les dimensions de l'image ainsi que la taille intrinsèque de l'image.
Identification des décalages de mise en page à partir d'images sans dimensions
À limite Décalage cumulé de mise en page causé par des images sans dimensions, incluez les attributs de largeur et de hauteur sur vos images et des éléments vidéo. Cette approche garantit que le navigateur peut allouer la bonne quantité d'espace dans le document pendant le chargement de l'image. Lighthouse mettra en évidence les images sans largeur ni hauteur:
Qu'en est-il du changement de résolution d'image? Une norme nous permet uniquement de fournir un seul fichier source au navigateur. Mais avec les attributs srcset et tailles nous pouvons fournir de nombreuses images sources supplémentaires (et des indices) afin que le navigateur puisse choisir la plus appropriée. Cela nous permet de fournir des images plus petites ou plus grandes.
L'attribut srcset définit l'ensemble d'images parmi lesquelles le navigateur peut sélectionner, ainsi que la taille de chaque image. Chaque chaîne d'image est séparée par une virgule et comprend:
un nom de fichier source ( donut-400w.jpg );
un espace;
et la largeur intrinsèque de l'image spécifiée en pixels ( 400w ), ou un descripteur de densité de pixels ( 1x 1,5x 2x etc.).
L'attribut tailles spécifie un ensemble de conditions, telles que les largeurs d'écran, et quelle taille d'image est préférable de sélectionner lorsque ces conditions sont remplies. Ci-dessus, ( max-width: 640px ) est une condition de support demandant «si la largeur de la fenêtre est de 640 pixels ou moins», et 400px est la largeur de la fente, l'image est va remplir lorsque la condition du support est vraie. Cela correspond généralement aux points d'arrêt réactifs de la page.
Ratio de pixels de l'appareil (DPR) / plafonnement de la densité de pixels
Le ratio de pixels de l'appareil (DPR) représente la façon dont un pixel CSS est converti en pixels physiques sur un écran matériel. Les écrans haute résolution et rétine utilisent plus de pixels physiques pour représenter les pixels CSS pour des images plus nettes et plus détaillées.
L'œil humain peut ne pas être capable de distinguer la différence entre les images qui sont au format 2x -3x DPR par rapport à une résolution encore plus élevée. La diffusion d'images DPR trop élevées est un problème courant pour les sites exploitant et une suite de tailles d'image.
Il peut être possible d'utiliser le plafonnement DPR pour fournir à vos utilisateurs une image avec une fidélité 2x ou 3x afin d'éviter les charges utiles d'image volumineuses. Twitter a plafonné leur fidélité d'image à 2x, ce qui se traduit par des temps de chargement d'image chronologique 33% plus rapides. Ils ont constaté que 2x était un point idéal pour les deux bonnes performances gagnantes sans dégradation des mesures de qualité.
Remarque: Cette approche du plafonnement DPR n'est actuellement pas possible si vous utilisez des descripteurs «w». [19659082] différence entre les images à l'échelle 1x, 2x, 3x. « /> Éléments de Twitter pour les échelles 1 ×, 2 × et 3 ×. ( Grand aperçu )
Identifier les images qui peuvent être mieux dimensionnées
Lighthouse inclut un certain nombre d'audits d'optimisation d'image pour vous aider à comprendre si vos images pourraient être mieux compressées, livrées dans une image moderne plus optimale
Même les images réactives (c'est-à-dire dimensionnées par rapport à la fenêtre) doivent avoir une largeur et une hauteur définies. Dans les navigateurs modernes, ces attributs établissent un rapport hauteur / largeur qui aide à éviter les changements de mise en page, même si les tailles absolues sont remplacées par CSS.
Lorsque je n'utilise pas de CDN ou de framework d'image, j'aime utiliser responsivebreakpoints.com pour déterminer les points d'arrêt d'image optimaux et générer le code srcset pour mon images responsive.
Servir des formats d'image modernes
La direction artistique nous permet de servir différentes images en fonction de l'affichage de l'utilisateur. Alors que les images responsives chargent différentes tailles de la même image, la direction artistique peut charger des images très différentes en fonction de l'affichage.
Le navigateur peut choisir le format d'image à afficher à l'aide de l'élément . L'élément prend en charge plusieurs éléments et un seul élément qui peuvent référencer des sources pour différents formats, y compris AVIF, WebP et éventuellement JPEG XL.
Dans cet exemple, le navigateur commencera à analyser les sources et s'arrêtera lorsqu'il aura trouvé la première correspondance prise en charge. Si aucune correspondance n'est trouvée, le navigateur charge la source spécifiée dans comme solution de secours. Cette approche fonctionne bien pour servir tout format d'image moderne non pris en charge dans tous les navigateurs. Soyez prudent lorsque ordonne les éléments car l'ordre est important. Ne placez pas les sources modernes après les anciens formats, mais placez-les plutôt avant. Les navigateurs qui le comprennent les utiliseront et ceux qui ne le feront pas passeront à des frameworks plus largement pris en charge.
Comprendre la myriade d'options de format d'image disponibles aujourd'hui peut être un processus déroutant, mais vous pouvez trouver la comparaison de Cloudinary de formats d'image modernes utile:
Vous pouvez également trouver le sélecteur de paramètres de qualité AVIF et WebP de Malte Ubl utile pour sélectionner les paramètres de qualité correspondant à la qualité d'un JPEG à un paramètre de qualité donné.
Identifier les images qui pourraient être diffusées dans un format plus moderne
Lighthouse (ci-dessous) met en évidence les économies potentielles liées à la diffusion d'images dans un format de nouvelle génération.
Remarque: Nous avons un numéro ouvert pour mieux mettre en évidence les économies potentielles d'AVIF dans Lighthouse.
Vous pouvez également trouver un intérêt à utiliser des outils d'audit d'image tels que l'outil d'analyse d'image de Cloudinary pour un examen plus approfondi des possibilités de compression d'image pour toutes les images d'une page. En prime, vous pouvez télécharger des versions compressées des formats d’image suggérés tels que WebP:
J'aime aussi utiliser Squoosh pour sa prise en charge des formats de pointe, tels que JPEG XL, car il offre un moyen à faible friction d'expérimenter les formats modernes en dehors d'une CLI ou d'un CDN.
Il y a plusieurs façons d'aborder les problèmes de dimensionnement car le srcset et les tailles sont tous deux utilisables sur et . en cas de doute, utilisez avec srcset / tailles pour des images uniques qui ont une mise en page simple. Utilisez pour servir plusieurs formats, une mise en page complexe et une direction artistique.
Chrome DevTools vous permet de désactiver les formats d'image modernes ( démo ), comme WebP, AVIF ou JPEG XL, pour tester différentes solutions de secours pour dans le panneau Rendu :
CanIUse dispose des derniers détails de prise en charge du navigateur pour WebP AVIF et JPEG XL .
Contenu Négociation
Une alternative à la gestion manuelle de la sélection de format d'image en utilisant consiste à s'appuyer sur l'en-tête d'acceptation . Celui-ci est envoyé par le client, ce qui permet au serveur de fournir un format d'image qui convient le mieux à l'utilisateur. Les CDN tels que Akamai Cloudinary et Cloudflare le prennent en charge.
Image Lazy Loading
Qu'en est-il des images hors écran qui ne sont pas visibles tant qu'un utilisateur ne fait pas défiler l'écran en bas de la page? Dans l'exemple ci-dessous, toutes les images de la page sont «chargées avec impatience» (la valeur par défaut dans les navigateurs aujourd'hui), ce qui oblige l'utilisateur à télécharger 1,1 Mo d'images. Cela peut nuire aux plans de données des utilisateurs en plus d'affecter les performances.
En utilisant l'attribut de chargement sur nous pouvons contrôler le comportement du chargement d'image. loading = "lazy" charge paresseusement les images, reportant leur chargement jusqu'à ce qu'elles atteignent une distance calculée de la fenêtre. loading = "eager" charge les images immédiatement, quelle que soit leur visibilité dans la fenêtre. eager est la valeur par défaut, il n'est donc pas nécessaire d'ajouter explicitement (c'est-à-dire, utilisez simplement pour un chargement hâtif).
Voici un exemple de chargement paresseux d'un avec un source unique:
Avec le chargement paresseux natif l'exemple précédent ne télécharge désormais qu'environ 90 Ko d'images! Le simple fait d'ajouter loading =" lazy " à nos images hors écran a un impact énorme. Dans l'idéal, vous voulez charger paresseusement toutes les images présentes en dehors de la fenêtre initiale et l'éviter pour tout ce qui se trouve dans la fenêtre initiale.