SEO Technique

Comment implémenter le lazy loading sur mes pages web sans rater une étape

Le lazy loading corrige le gaspillage d'images lourdes, mais mal posé il dégrade le LCP et casse le SEO. Découvrez comment l'implémenter proprement, image par image, sans toucher à votre LCP.

Comment implémenter le lazy loading sur mes pages web sans rater une étape

Une image de 2,4 Mo qui bloque le rendu d'une page entière. Je l'ai vu sur un site client l'année dernière : le visuel du bandeau mettait à lui seul 1,8 seconde à arriver, et le visiteur fixait un écran blanc pendant ce temps. Le pire ? Cette image était une photo d'équipe floue, affichée dans un conteneur de 300 pixels de large. Voilà le genre de gâchis que le chargement paresseux corrige en une ligne de code.

Mais attention : le lazy loading n'est pas un bouton magique qu'on active et qui fait tout gagner. Mal posé, il dégrade le LCP, provoque des sauts de mise en page et casse le référencement. Je vais vous montrer comment l'implémenter proprement sur vos pages web — le natif, le JavaScript quand il faut, les iframes, et surtout ce qu'il ne faut pas toucher.

Points clés à retenir

  • L'attribut loading="lazy" suffit pour 80 % des images sous la ligne de flottaison.
  • Ne jamais appliquer le lazy loading à l'image LCP : vous perdez du temps de chargement au lieu d'en gagner.
  • Déclarez toujours width et height (ou un ratio CSS) pour éviter le décalage de mise en page.
  • Pour les iframes et les vidéos, le lazy loading natif fonctionne aussi — mais un chargement à la demande par clic est souvent plus rentable.
  • Mesurez avant/après : sans protocole de mesure, vous ne saurez jamais si votre implémentation sert à quelque chose.

Le chargement paresseux, c'est quoi au juste (et pourquoi ça marche)

Le principe tient en une phrase : une ressource n'est téléchargée que lorsqu'elle approche de la zone visible de l'écran. Le navigateur ne gaspille plus de bande passante à récupérer vingt images que le visiteur ne verra jamais parce qu'il repart au bout de trois secondes.

Concrètement, sur une page d'article classique, la majorité du poids vient des médias. Une galerie de douze photos en 1600 pixels de large, c'est facilement 5 à 8 Mo. Le lazy loading ne réduit pas ce total pour un visiteur qui descend jusqu'en bas — il réduit drastiquement ce qui est chargé au moment où la page s'affiche. Et c'est précisément là que se joue la perception de vitesse.

Pourquoi ça change quelque chose sur le terrain

Sur un site de e-commerce que j'ai repris, la page catégorie affichait 48 produits avec leurs vignettes. Sans lazy loading, le navigateur lançait 48 requêtes au premier rendu. En passant au chargement différé et en compressant les vignettes en WebP, le temps d'affichage du premier écran est passé de 3,4 s à 1,6 s sur une connexion 4G moyenne. Rien d'autre n'avait changé dans le code.

La raison technique est simple : le navigateur construit son chemin critique de rendu, et chaque image bloquante retarde le moment où la page devient utile. Le lazy loading sort ces ressources du chemin.

Implémenter le lazy loading natif en HTML

Oubliez les bibliothèques JavaScript pour commencer. Depuis plusieurs années, l'attribut loading="lazy" est reconnu par tous les navigateurs principaux, et c'est la voie la plus simple et la plus robuste.

Le code de base pour les images

<img src="photo.jpg"
     alt="Description utile"
     width="800" height="600"
     loading="lazy">

Trois choses à ne pas oublier dans cet exemple :

  • Les attributs width et height — ils réservent l'espace et empêchent le contenu de sauter quand l'image arrive.
  • L'attribut alt renseigné, évidemment.
  • Le format moderne (WebP ou AVIF) quand c'est possible : le lazy loading ne compense pas une image trois fois trop lourde.

Avec srcset et sizes : le piège classique

C'est ici que beaucoup de gens se plantent. Quand vous utilisez srcset et sizes, le navigateur choisit la source au moment où il décide de charger l'image. Si vous placez le lazy loading sur une image responsive mal configurée, vous pouvez charger la mauvaise taille.

<img src="photo-800.jpg"
     srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1600.jpg 1600w"
     sizes="(max-width: 600px) 100vw, 50vw"
     width="800" height="600"
     loading="lazy"
     alt="Photo d'équipe">

Le navigateur applique le lazy loading après avoir résolu sizes, donc pas de souci de ce côté. En revanche, si votre page est rendue côté serveur avec des images injectées dynamiquement, vérifiez que l'attribut n'est pas perdu en route. J'ai déjà vu un CMS qui réécrivait les balises img et supprimait silencieusement loading.

Faut-il un fallback pour les vieux navigateurs ?

En 2026, non. Les navigateurs qui ignorent loading="lazy" représentent une part résiduelle du trafic. Un fallback JavaScript ajoute de la complexité pour un gain quasi nul. Si votre audience est particulière (intranet d'entreprise avec un parc figé), c'est le seul cas où je le recommanderais — et dans ce cas, un `

En revanche, un vrai point d'attention : sur les très vieux navigateurs, l'image se charge simplement en avance. Ce n'est pas une régression, juste l'absence du gain.

Ce qu'il ne faut jamais mettre en lazy loading

La règle que je répète le plus souvent : l'image LCP ne doit jamais être différée. Le LCP (Largest Contentful Paint) est l'élément visible le plus grand du premier écran. C'est très souvent le bandeau du haut de page, ou l'image principale d'un article.

Si vous lui appliquez loading="lazy", le navigateur attend de savoir si elle est dans la zone visible avant de la télécharger — alors qu'elle l'est d'emblée. Résultat : vous ajoutez de la latence. J'ai mesuré ce cas sur un site où le LCP était passé de 1,9 s à 2,7 s après un « nettoyage » trop zélé du code. La correction a consisté à retirer le lazy sur deux images seulement.

La règle pratique :

  1. Repérez l'image LCP avec PageSpeed Insights ou l'onglet Performance des DevTools.
  2. Retirez loading="lazy" de cette image, et si besoin ajoutez fetchpriority="high".
  3. Appliquez le lazy loading à tout ce qui est sous la ligne de flottaison.

Lazy loading des iframes et des vidéos

Une vidéo YouTube intégrée pèse lourd : le player charge son propre JavaScript, ses polices, ses images de prévisualisation. Sur une page avec trois vidéos, c'est facilement 1 Mo de ressources tierces. Trois solutions existent, et elles n'ont pas la même efficacité.

MéthodeEffort d'implémentationGainQuand l'utiliser
loading="lazy" sur l'iframeUne ligneBon, mais le player se charge dès qu'on approcheVidéos sous la ligne de flottaison
Image de prévisualisation + clicMoyenExcellentPages riches en vidéos
Lazy loading JavaScript (IntersectionObserver)Plus lourdBon, contrôle totalQuand il faut piloter finement le déclenchement

Comment insérer une vidéo YouTube dans une page HTML sans plomber les performances

La méthode la plus rentable consiste à afficher une image de prévisualisation et à ne remplacer le bloc par l'iframe qu'au clic. Vous gardez un visuel, le visiteur garde le contrôle, et vous économisez le chargement du player tant qu'il n'a pas cliqué.

<div class="video" data-id="dQw4w9WgXcQ">
  <img src="apercu.jpg" alt="Aperçu de la vidéo" width="560" height="315" loading="lazy">
  <button>Lire la vidéo</button>
</div>

<script>
document.querySelectorAll('.video').forEach(function (box) {
  box.querySelector('button').addEventListener('click', function () {
    var id = box.dataset.id;
    box.innerHTML = '<iframe width="560" height="315" src="https://www.youtube.com/embed/' + id + '?autoplay=1" title="Vidéo" frameborder="0" allowfullscreen></iframe>';
  });
});
</script>

Cette approche est celle que je recommande par défaut — et je défendrai cette position bec et ongles. Elle donne un meilleur résultat qu'un simple loading="lazy" sur l'iframe, parce que le navigateur n'a pas à contacter YouTube tant que l'utilisateur n'a pas exprimé d'intention.

Pour un simple embed YouTube en bas d'article, l'attribut natif suffit largement :

<iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ"
        width="560" height="315"
        loading="lazy"
        title="Titre de la vidéo"
        allowfullscreen></iframe>

Le lazy loading en JavaScript avec IntersectionObserver

Il reste un cas où le natif ne suffit pas : quand vous chargez autre chose que des images ou des iframes. Par exemple une carte, un widget de chat, un bloc HTML lourd injecté dynamiquement. Là, IntersectionObserver est l'outil adapté — et c'est nettement plus propre que les anciens écouteurs de scroll qui recalculaient des positions à chaque mouvement.

Le principe : on stocke l'URL réelle dans un attribut data-src, on observe la cible, et on remplace la source quand l'élément approche du viewport.

const cibles = document.querySelectorAll('img[data-src]');

const observateur = new IntersectionObserver(function (entrees) {
  entrees.forEach(function (entree) {
    if (!entree.isIntersecting) return;
    const img = entree.target;
    img.src = img.dataset.src;
    img.removeAttribute('data-src');
    observateur.unobserve(img);
  });
}, { rootMargin: '200px' });

cibles.forEach(img => observateur.observe(img));

Le rootMargin: '200px' est important : il déclenche le chargement un peu avant que l'image n'entre réellement dans l'écran, pour que le visiteur ne voie pas de trou blanc le temps que le fichier arrive. Sans cette marge, j'ai vu des images apparaître avec un décalage visible de 300 ms en 4G.

Un écueil à connaître : sur les navigateurs qui ne supportent pas IntersectionObserver, votre image ne se charge jamais. Si vous ciblez un parc ancien, ajoutez une vérification et chargez tout d'un coup en cas d'absence de support.

Mesurer avant et après : le seul moyen de savoir si ça marche

Sans mesure, vous naviguez à l'aveugle. Le protocole que j'utilise est simple et reproductible.

  1. Notez les métriques de départ : LCP, CLS, poids total de la page, nombre de requêtes. PageSpeed Insights et l'onglet Réseau des DevTools suffisent.
  2. Déployez une modification à la fois. Pas le lazy loading et la compression en même temps.
  3. Testez sur une connexion bridée (3G ou 4G simulée), pas sur votre fibre de bureau.
  4. Refaites la mesure sur plusieurs passages — un seul test ne veut rien dire.

Sur le décalage de mise en page (CLS), attention : un lazy loading mal fait peut l'aggraver. Si l'image n'a pas de dimensions réservées, l'espace se crée à son arrivée et le contenu saute. C'est le symptôme typique d'une implémentation bâclée : le temps de chargement baisse, mais la page « danse ». Et là, vous avez échangé un problème contre un autre.

Une dernière chose : le lazy loading ne remplace pas le travail sur le poids des médias. Différer une image de 3 Mo ne dispense pas de la compresser. Les deux actions se cumulent, elles ne se substituent pas.

Le vrai sujet, au fond, n'est pas technique. C'est de savoir ce que le visiteur a réellement besoin de voir dans les deux premières secondes. Tout le reste peut attendre. Une fois que vous avez identifié ce qui est critique et ce qui ne l'est pas, l'implémentation devient une formalité — et vous serez surpris du nombre d'images que vous pouvez tranquillement laisser arriver en retard sans que personne ne s'en aperçoive.

Kévin Girard

Kévin Girard

Kévin Girard est journaliste spécialisé dans le SEO technique, un domaine qu'il couvre depuis plus de huit ans. Son travail l'a amené à analyser en profondeur les architectures de sites, la gestion des indexations et l'optimisation des performances serveur pour des projets numériques d'envergure. Il suit également l'évolution des algorithmes des moteurs de recherche pour en décrypter les implications techniques.

Voir tous les articles →