
Un site e-commerce affiche 47 images sur sa page catégorie. Sans lazy loading, le navigateur tente de toutes les charger d’un coup : 8,3 Mo transférés avant même que le visiteur ne commence à scroller. Avec l’attribut loading="lazy", seules les images visibles se chargent immédiatement, et le reste suit à la demande. Résultat : un First Contentful Paint divisé par deux. Pourtant, sur la page d’accueil du même site, ce même attribut appliqué sans discernement retarde l’affichage du hero banner et fait chuter le score Largest Contentful Paint. Le lazy loading n’est pas un interrupteur magique : il faut savoir où le placer et où l’éviter.
Dans cet article
- L’attribut natif
loading="lazy"est supporté par plus de 92 % des navigateurs en 2026 - Le lazy loading peut réduire le poids initial d’une page de 40 à 70 % sur les pages riches en images
- Appliquer le lazy loading sur les images above the fold dégrade le LCP de 5 à 15 % en moyenne
- WordPress ajoute
loading="lazy"par défaut depuis la version 5.5, y compris parfois sur le hero - L’attribut
fetchpriority="high"combiné àloading="eager"corrige le problème sur les images critiques - Le lazy loading mal configuré peut provoquer des décalages de mise en page (CLS) si les dimensions ne sont pas déclarées
Sommaire
- Le principe du lazy loading en quelques lignes
- Quand le lazy loading accélère réellement le site
- Quand le lazy loading pénalise les performances
- Comparatif lazy vs eager : quel attribut pour quel usage
- Implémentation native en HTML : la méthode recommandée
- Lazy loading et WordPress : ce que le CMS fait automatiquement
- Lazy loading et SEO : ce que Google en dit vraiment
- Les erreurs fréquentes qui ruinent le bénéfice
- Checklist pour auditer le lazy loading de votre site
Le principe du lazy loading en quelques lignes
Le lazy loading, ou chargement différé, consiste à retarder le téléchargement d’une ressource jusqu’à ce qu’elle soit sur le point d’entrer dans la zone visible du navigateur (le viewport). Au lieu de télécharger toutes les images dès l’ouverture de la page, le navigateur ne récupère que celles qui sont immédiatement visibles, puis charge les suivantes au fur et à mesure que l’utilisateur défile.
Le mécanisme repose sur l’API Intersection Observer. Le navigateur surveille la position de chaque élément marqué comme lazy. Quand un élément s’approche du viewport (généralement à quelques centaines de pixels de distance), le téléchargement se déclenche. Cette marge de sécurité évite que l’image apparaisse vide au moment précis où elle entre dans le champ de vision.
Historiquement, ce comportement nécessitait des bibliothèques JavaScript comme lazysizes ou lozad.js. Depuis 2019, l’attribut HTML natif loading="lazy" permet d’obtenir le même résultat sans une seule ligne de JavaScript. C’est aujourd’hui la méthode recommandée par le guide technique de web.dev sur le lazy loading natif.
Le concept s’applique aux images (<img>), aux iframes (<iframe>) et, via JavaScript, à peu près n’importe quel élément lourd : vidéos, cartes interactives, widgets tiers. Dans cet article, je me concentre sur les images, car c’est là que le lazy loading images intérêt se mesure le plus directement en performance.
Quand le lazy loading accélère réellement le site
Le lazy loading donne ses meilleurs résultats dans des cas bien précis. Si votre page ne contient que deux ou trois images, le gain sera négligeable. En revanche, dans les scénarios suivants, l’impact est mesurable :
Pages longues avec beaucoup d’images sous la ligne de flottaison
Les articles de blog illustrés, les portfolios photo, les fiches produit avec galeries : toutes ces pages affichent des dizaines d’images dont la majorité se trouve en dessous du premier écran. Sur un article contenant 20 images, seules 2 ou 3 sont visibles à l’arrivée. Le lazy loading évite de télécharger les 17 autres immédiatement, ce qui réduit le volume de données initial de manière significative. Sur des connexions mobiles 3G/4G, cette différence se traduit par plusieurs secondes de chargement en moins.
Pages catégories et résultats de recherche
Une page de catalogue e-commerce affichant 30 à 60 produits avec vignettes représente un cas d’école. J’ai mesuré sur un projet client un passage de 6,2 secondes à 2,8 secondes de temps de chargement initial simplement en activant le lazy loading sur les vignettes situées en dessous de la troisième ligne de produits. Le serveur consommait aussi moins de bande passante, un avantage non négligeable sur un hébergement mutualisé.
Pages avec iframes et contenus embarqués
Les vidéos YouTube intégrées, les cartes Google Maps ou les widgets de réseaux sociaux sont souvent plus lourds que les images. Un seul embed YouTube charge environ 500 Ko de ressources. Si votre page en contient trois, le lazy loading sur ces iframes évite 1,5 Mo de transfert inutile au chargement initial.
Sites consultés majoritairement sur mobile
Sur mobile, l’écran est plus petit, donc moins d’images sont visibles simultanément. Le ratio entre images visibles et images hors écran est plus favorable au lazy loading. De plus, la bande passante mobile reste souvent inférieure à celle du Wi-Fi. Le lazy loading images intérêt est donc maximal sur les audiences mobiles, qui représentent aujourd’hui plus de 60 % du trafic web en France selon les données de StatCounter sur la répartition mobile/desktop en France.
Quand le lazy loading pénalise les performances
C’est le point que la plupart des guides oublient de traiter en profondeur. Le lazy loading peut dégrader l’expérience utilisateur et les Core Web Vitals s’il est appliqué sans réflexion.
Le piège du Largest Contentful Paint (LCP)
Le LCP mesure le temps nécessaire pour afficher le plus grand élément visible dans le viewport initial. Dans la majorité des cas, cet élément est une image : le hero banner, la photo produit principale, la miniature d’un article. Si vous appliquez loading="lazy" à cette image, le navigateur retarde volontairement son téléchargement au lieu de le prioriser. Résultat : le LCP augmente, parfois de 5 à 15 %, et votre score PageSpeed chute.
La règle est simple : toute image visible sans scroller ne doit jamais être en lazy loading. Cela concerne le logo, le hero banner, la première image d’un article, la photo principale d’une fiche produit. Ces images doivent rester en loading="eager" (le comportement par défaut) ou, mieux encore, recevoir l’attribut fetchpriority="high" pour signaler au navigateur qu’elles sont prioritaires. Pour aller plus loin sur le diagnostic, consultez mon guide sur comment diagnostiquer un site lent.
Le problème du Cumulative Layout Shift (CLS)
Quand une image en lazy loading se charge, elle passe d’une hauteur nulle à sa hauteur réelle. Si les attributs width et height ne sont pas déclarés dans le HTML, le navigateur ne peut pas réserver l’espace à l’avance. Le contenu en dessous se décale brutalement : c’est le layout shift. Ce décalage dégrade le score CLS, l’un des trois Core Web Vitals.
La solution est systématique : toujours déclarer les dimensions de l’image dans le HTML, soit via les attributs width et height, soit via un aspect-ratio en CSS. Le navigateur réserve alors l’espace avant même de télécharger l’image.
Pages courtes : un gain inexistant
Sur une page qui ne contient que deux images, toutes deux visibles dans le viewport, le lazy loading n’a aucune image à différer. Il ajoute simplement une couche de logique inutile. Pire, si l’une de ces images est l’élément LCP, il la retarde. Sur les pages courtes, mieux vaut laisser le comportement par défaut.
Comparatif lazy vs eager : quel attribut pour quel usage
L’attribut loading accepte deux valeurs : lazy et eager. Voici un tableau récapitulatif pour trancher rapidement :
| Situation | Valeur recommandée | Raison |
|---|---|---|
| Hero banner / image principale | loading="eager" + fetchpriority="high" |
Élément LCP, doit se charger en priorité absolue |
| Logo du site dans le header | loading="eager" |
Toujours visible au premier affichage |
| Première image d’un article | loading="eager" |
Souvent dans le viewport initial |
| Images sous la ligne de flottaison | loading="lazy" |
Pas visibles immédiatement, gain de bande passante |
| Vignettes de galerie (après la 1re ligne) | loading="lazy" |
Nombreuses et hors écran |
| Iframes YouTube/Maps | loading="lazy" |
Très lourdes, rarement dans le viewport initial |
| Image de fond CSS (background-image) | Non applicable | L’attribut loading ne fonctionne que sur <img> et <iframe> |
| Images dans un carrousel | loading="lazy" sauf la première slide |
Seule la slide active est visible |
Une erreur que je vois régulièrement : appliquer loading="lazy" à toutes les images du site via un script global. C’est exactement ce qu’il ne faut pas faire. La démarche correcte consiste à identifier les images above the fold, les exclure du lazy loading, puis appliquer le chargement différé au reste.
Implémentation native en HTML : la méthode recommandée
L’implémentation native du lazy loading est d’une simplicité remarquable. Aucune bibliothèque, aucun plugin, aucun fichier JavaScript supplémentaire :
<!-- Image sous la ligne de flottaison : lazy -->
<img src="photo-produit.webp"
alt="Description du produit"
width="800"
height="600"
loading="lazy">
<!-- Image hero : eager avec priorité haute -->
<img src="hero-banner.webp"
alt="Bannière principale"
width="1200"
height="675"
loading="eager"
fetchpriority="high">
Quelques points techniques à respecter :
- Toujours déclarer width et height : cela permet au navigateur de calculer le ratio et réserver l’espace, évitant ainsi les sauts de mise en page
- Utiliser des formats modernes : le lazy loading fonctionne avec tous les formats, mais couplé au WebP ou à l’AVIF, le gain de poids est encore plus important
- Ne pas combiner avec un polyfill JS : les navigateurs modernes gèrent nativement l’attribut. Ajouter lazysizes par-dessus crée une double logique inutile
- Tester avec l’onglet Network de Chrome DevTools : filtrez par images, scrollez lentement et vérifiez que les images se chargent bien au bon moment
Pour les images de fond en CSS, l’attribut loading ne s’applique pas. Il faut alors utiliser l’Intersection Observer en JavaScript ou, plus simplement, convertir ces fonds en balises <img> avec du CSS object-fit pour profiter du lazy loading natif.
La balise picture et le lazy loading
Avec la balise <picture>, l’attribut loading se place sur le <img> de fallback, pas sur les <source> :
<picture>
<source srcset="photo.avif" type="image/avif">
<source srcset="photo.webp" type="image/webp">
<img src="photo.jpg"
alt="Description"
width="800"
height="600"
loading="lazy">
</picture>
Lazy loading et WordPress : ce que le CMS fait automatiquement
Depuis WordPress 5.5 (août 2020), le CMS ajoute automatiquement loading="lazy" à toutes les images insérées via l’éditeur. Depuis WordPress 5.9, le comportement a été affiné : la première image de contenu reçoit loading="eager" pour protéger le LCP. Cependant, cette logique n’est pas toujours fiable.
Les cas où WordPress se trompe
- Le hero banner du thème : s’il est codé dans le template PHP et non inséré via l’éditeur de contenu, WordPress ne le détecte pas comme première image. Il reste en lazy par défaut du thème
- Les images ajoutées par des builders : Elementor, Divi ou WPBakery ajoutent parfois leur propre lazy loading en plus de celui de WordPress, créant des conflits
- Les vignettes WooCommerce : la première image produit peut être traitée comme lazy alors qu’elle est l’élément LCP de la fiche
Corriger manuellement dans WordPress
Pour forcer le comportement eager sur une image critique, ajoutez ce filtre dans votre fichier functions.php :
// Retirer le lazy loading sur l'image mise en avant
add_filter('wp_img_tag_add_loading_attr', function($value, $image, $context) {
if ($context === 'the_content') {
// Conserver lazy pour les images du contenu
return $value;
}
// Eager pour le reste (header, featured image)
return 'eager';
}, 10, 3);
Si vous utilisez un plugin de cache, vérifiez qu’il ne réécrit pas les attributs loading que vous avez définis. Certains plugins comme WP Rocket ou LiteSpeed Cache proposent leur propre gestion du lazy loading qui peut écraser la configuration native.
Mon conseil après avoir travaillé sur des dizaines de sites WordPress : désactivez le lazy loading des plugins tiers et reposez-vous sur le comportement natif du navigateur. C’est plus léger, plus fiable et plus facile à déboguer. Pour optimiser davantage, pensez aussi à mettre à jour votre version de PHP, ce qui impacte directement le temps de génération des pages.
Lazy loading et SEO : ce que Google en dit vraiment
La question revient systématiquement : le lazy loading empêche-t-il Google d’indexer les images ? La réponse courte est non, à condition d’utiliser la méthode native. Voici pourquoi.
Googlebot utilise un moteur de rendu basé sur Chrome à jour. Il exécute le JavaScript, il comprend l’Intersection Observer, et il supporte l’attribut loading="lazy". Les images en lazy loading natif sont donc correctement découvertes et indexées par Google, comme le confirme la documentation officielle de Google sur le rendu JavaScript.
En revanche, certaines implémentations JavaScript personnalisées peuvent poser problème :
- Les scripts qui utilisent un placeholder dans
srcet déplacent l’URL réelle dans un attributdata-src: si le script ne s’exécute pas correctement côté Googlebot, l’image reste invisible - Les bibliothèques qui nécessitent un scroll pour déclencher le chargement : Googlebot ne simule pas toujours le défilement complet de la page
- Les implémentations sans noscript : même si c’est de moins en moins pertinent, un fallback
<noscript>reste une bonne pratique
Pour le référencement naturel, le lazy loading natif est donc sans risque. Il améliore même indirectement le SEO en améliorant les Core Web Vitals (à condition de ne pas dégrader le LCP, comme expliqué plus haut).
Impact sur Google Images
Les images en lazy loading apparaissent normalement dans Google Images si elles remplissent ces conditions : un attribut src valide (pas un placeholder transparent), un attribut alt descriptif, et des dimensions déclarées. Le sitemap images reste recommandé pour les sites où les visuels constituent un levier de trafic important.
Les erreurs fréquentes qui ruinent le bénéfice
En auditant des sites clients, je retrouve régulièrement les mêmes erreurs. Voici les plus courantes :
1. Lazy loading sur toutes les images sans exception
C’est l’erreur numéro un. Un plugin ou un script applique loading="lazy" à 100 % des images, y compris le logo, le hero et la première image du contenu. Le LCP s’effondre. La correction est simple : exclure les 2 à 4 premières images visibles.
2. Absence de dimensions déclarées
Sans width et height, chaque image qui se charge provoque un saut de layout. Sur une page avec 15 images en lazy, cela crée 15 micro-décalages qui s’accumulent dans le score CLS. C’est particulièrement visible sur mobile.
3. Double lazy loading
WordPress ajoute loading="lazy" nativement. Le thème ajoute lazysizes.js. Le plugin de cache ajoute sa propre surcouche. Résultat : trois mécanismes concurrents qui se marchent dessus, avec parfois des images qui ne se chargent jamais parce que chaque script attend que l’autre déclenche le chargement.
4. Images critiques avec src placeholder
Certaines bibliothèques JS remplacent le src par un pixel transparent et stockent l’URL réelle dans data-src. Si le JavaScript échoue (erreur réseau, bloqueur de pub), l’image reste un pixel vide. L’attribut natif loading="lazy" n’a pas ce problème car l’URL reste dans src.
5. Lazy loading sur les images CSS background
L’attribut loading ne fonctionne pas sur les images de fond CSS. Certains développeurs l’ajoutent sur un <div> en pensant que cela aura un effet : ce n’est pas le cas. Pour les fonds CSS, il faut passer par l’Intersection Observer ou repenser le markup.
6. Seuil de déclenchement trop court
Si le navigateur déclenche le chargement trop tard (quand l’image est déjà dans le viewport), l’utilisateur voit un espace vide le temps du téléchargement. Les navigateurs modernes gèrent cela avec une marge automatique d’environ 1 250 pixels sur connexion rapide et davantage sur connexion lente. Les anciennes bibliothèques JS avec un seuil fixe de 100 px n’offrent pas cette adaptation.
Checklist pour auditer le lazy loading de votre site
Avant de modifier quoi que ce soit, un audit rapide permet d’identifier les problèmes. Voici la démarche que je suis systématiquement :
- Ouvrir Chrome DevTools (F12), onglet Network, filtrer par “Img”
- Recharger la page en cache vide (Ctrl+Maj+R) et observer combien d’images se chargent avant tout scroll
- Identifier l’élément LCP via l’onglet Performance ou Lighthouse : est-ce une image ? A-t-elle
loading="lazy"? Si oui, c’est un problème - Scroller lentement et vérifier que les images se chargent avant d’apparaître (pas de flash blanc)
- Vérifier le CLS dans Lighthouse : si des images provoquent des sauts, vérifier que
widthetheightsont déclarés - Compter les mécanismes de lazy loading : inspecter le HTML pour repérer si
loading="lazy",data-srcet un script JS coexistent - Tester sur mobile : utiliser la simulation mobile de DevTools pour vérifier que le seuil de déclenchement est correct sur petit écran
Pour un diagnostic plus complet, mon guide sur les causes d’un site lent couvre d’autres pistes au-delà du lazy loading. Et si vos images sont trop lourdes avant même d’être chargées, la compression en WebP ou AVIF est le complément indispensable.
Pour les sites servis via un CDN, vérifiez que le lazy loading n’entre pas en conflit avec les mécanismes de cache et de transformation d’images du CDN. Certains CDN comme Cloudflare proposent leur propre système de lazy loading côté serveur.
À retenir
- Ne jamais appliquer
loading="lazy"sur les 2 à 4 premières images visibles sans scroller - Utiliser
fetchpriority="high"sur l’image hero pour accélérer le LCP - Toujours déclarer width et height sur chaque image pour éviter les sauts de mise en page
- Privilégier l’attribut natif
loading="lazy"plutôt qu’une bibliothèque JavaScript tierce - Auditer avec Chrome DevTools onglet Network avant et après activation pour mesurer le gain réel
Questions fréquentes
Le lazy loading empêche-t-il Google d’indexer les images ?
Non. Googlebot utilise un moteur de rendu basé sur Chrome qui supporte l’attribut natif loading="lazy". Les images sont correctement découvertes et indexées, à condition d’utiliser un src valide et non un placeholder. Les implémentations JavaScript avec data-src peuvent en revanche poser problème si le script ne s’exécute pas correctement.
Faut-il un plugin pour activer le lazy loading sur WordPress ?
Non, WordPress ajoute automatiquement loading="lazy" sur toutes les images depuis la version 5.5 et gère partiellement l’exclusion de la première image depuis la version 5.9. Un plugin n’est utile que si vous avez besoin de contrôler finement quelles images sont exclues du lazy loading, notamment le hero banner géré par le thème.
Le lazy loading dégrade-t-il le score PageSpeed Insights ?
Il peut le dégrader si l’image la plus grande du viewport initial (l’élément LCP) est en lazy loading. Dans ce cas, le navigateur retarde son chargement, ce qui augmente le temps du Largest Contentful Paint. La solution consiste à exclure les images above the fold et à leur ajouter fetchpriority="high".
Quelle est la différence entre loading=”lazy” et loading=”eager” ?
loading="eager" est le comportement par défaut : le navigateur télécharge l’image dès qu’il la découvre dans le HTML, quelle que soit sa position dans la page. loading="lazy" diffère le téléchargement jusqu’à ce que l’image s’approche du viewport. On utilise eager pour les images critiques visibles immédiatement et lazy pour tout ce qui est sous la ligne de flottaison.
Le lazy loading fonctionne-t-il avec les images de fond CSS ?
Non, l’attribut loading ne s’applique qu’aux balises <img> et <iframe>. Pour différer le chargement des images de fond CSS, il faut utiliser l’API Intersection Observer en JavaScript ou convertir le fond en balise <img> avec la propriété CSS object-fit pour bénéficier du lazy loading natif.
Combien d’images faut-il exclure du lazy loading ?
En règle générale, les 2 à 4 premières images visibles sans scroller doivent rester en loading="eager". Ce nombre dépend de la mise en page : sur un site avec un grand hero plein écran, seule cette image est à exclure. Sur une page catégorie affichant une grille, les 4 à 6 premières vignettes doivent être en eager.
Ingénieur système et expert hébergement web. Fondateur de web-city.fr, il partage guides pratiques, comparatifs objectifs et outils gratuits pour choisir le bon hébergeur et créer son site WordPress.