Lazysizes vs loading='lazy' – Pourquoi la librairie a encore sa place

mahmoud Nbetmahmoud Nbet
5 min read

À quoi sert lazysizes ?

  1. Lazy Loading des images/iframes :

    • Charge les images uniquement quand elles sont nécessaires (quand l'utilisateur scroll vers elles).

    • Réduit le temps de chargement initial de la page.

    • Économise la bande passante (surtout utile pour les mobiles).

  2. Support natif du lazy loading :

    • Si le navigateur supporte nativement loading="lazy" (Chrome, Firefox, Edge), lazysizes l'utilise automatiquement.

    • Sinon, il fournit une solution de repli (fallback) en JavaScript.

  3. Optimisation du SEO :

    • Contrairement à certaines solutions maison, lazysizes est conçu pour être compatible avec le référencement (Google comprend le lazy loading).
  4. Prise en charge des placeholders et des images responsives :

    • Peut afficher une image floue de faible qualité en premier (technique Low-Quality Image Placeholder - LQIP).

    • Fonctionne bien avec srcset pour les images responsives.

Comment l'utiliser ?

1. Installation

npm install lazysizes

ou via CDN :

<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js" async></script>

2. Modification du HTML

Remplacez src par data-src et ajoutez la classe lazyload :

<img 
  data-src="image.jpg" 
  class="lazyload" 
  alt="Description de l'image"
/>

<!-- Pour les images responsives -->
<img
  data-srcset="small.jpg 300w, medium.jpg 600w, large.jpg 1200w"
  class="lazyload"
  alt="Image responsive"
/>

3. Initialisation (automatique)

Pas besoin d'initialisation manuelle, lazysizes se charge dès qu'il est inclus dans la page.


Fonctionnalités avancées

  • Pré-chargement : Charge les images un peu avant qu'elles n'entrent dans la zone visible (data-expand).

  • Effets de transition : Peut ajouter un effet quand l'image est chargée (ex: fade-in).

  • Support des WebP/AVIF : Compatible avec les formats modernes.


Pourquoi choisir lazysizes ?

Léger (~4 Ko minifiés)
Compatibilité large (IE9+, tous les navigateurs modernes)
Évite les "reflows" (meilleure expérience utilisateur)
Intégrable avec React, Vue, etc.

Gestion de l'attribut loading avec lazysizes

Lazysizes est conçu pour être rétro compatible et intelligent dans sa gestion du lazy loading. Voici comment il interagit avec l'attribut loading :

1. Comportement par défaut de lazysizes

  • Si tu utilises simplement class="lazyload" avec data-src, lazysizes :

    • Priorise le lazy loading natif si le navigateur le supporte (loading="lazy").

    • Fournit un fallback JS pour les anciens navigateurs (comme IE11).

2. Contrôler explicitement loading avec lazysizes

Pour forcer un comportement spécifique, tu peux utiliser data-loading (propre à lazysizes) ou l'attribut natif loading :

<!-- Chargement paresseux (par défaut) -->
<img data-src="image.jpg" class="lazyload" loading="lazy" alt="...">

<!-- Chargement immédiat (ignorer lazysizes) -->
<img data-src="image.jpg" class="lazyload" loading="eager" alt="...">

<!-- Décision laissée au navigateur (équivalent à "auto") -->
<img data-src="image.jpg" class="lazyload" loading="auto" alt="...">

Règles d'interprétation

  • Si loading="lazy" ou loading="auto" :
    Lazysizes applique son mécanisme (natif ou JS) pour le lazy loading.

  • Si loading="eager" :
    Lazysizes ignore le lazy loading et charge l’image immédiatement (comportement traditionnel).

Comparaison : loading natif vs lazysizes

Critèreloading="lazy" natiflazysizes
Support navigateurChrome, Firefox, Edge, Safari 15+Tous navigateurs (fallback JS)
PersonnalisationLimité (seuil natif)Contrôle fin (seuil, pré-chargement, LQIP, etc.)
PerformancesOptimisé par le navigateurLéger (~4 KB) mais requiert JS
SEOParfaitement comprisTout aussi bien compris
Images responsivesNécessite srcsetGère data-srcset + optimisations

Quand utiliser quoi ?

1. Utiliser loading="lazy" natif uniquement si :

  • Tu cibles uniquement des navigateurs modernes (Safari 15+, Chrome, Firefox, etc.).

  • Tu veux une solution 0 JS et que tu n’as pas besoin de fonctionnalités avancées (comme les placeholders).

2. Utiliser lazysizes si :

  • Tu veux une compatibilité maximale (IE11, anciens Safari).

  • Tu as besoin de fonctionnalités avancées :

    • Placeholders (LQIP).

    • Pré-chargement personnalisé (data-expand="200" pour charger plus tôt).

    • Support des data-srcset avec gestion fine.

  • Tu veux un comportement cohérent sur tous les navigateurs.

Meilleur choix

  • Pour la majorité des projets modernes :
    Combine les deux ! Utilise loading="lazy" natif avec lazysizes comme fallback :

      <img
        src="placeholder.jpg"
        data-src="image.jpg"
        class="lazyload"
        loading="lazy"
        alt="..."
      >
    
    • ✅ Les navigateurs modernes utiliseront le natif.

    • ✅ Les anciens navigateurs utiliseront le JS de lazysizes.

  • Pour les projets critiques en perf/SEO :
    Lazysizes reste la solution la plus fiable (notamment pour le contrôle du pré-chargement et les placeholders).

Comment les navigateurs priorisent entre loading="lazy" natif et lazysizes ?

Lorsque tu combines les deux méthodes (loading="lazy" natif + lazysizes), le navigateur et lazysizes adoptent un comportement intelligent pour éviter les conflits. Voici comment ça fonctionne :

Lazysizes vs loading="lazy"

1. Mécanisme de priorisation automatique

Cas 1 : Le navigateur supporte loading="lazy" natif (Chrome, Firefox, Edge, Safari 15+)

  • Le navigateur ignore lazysizes pour cette image et utilise son propre système de lazy loading.

  • Pourquoi ?

    • Lazysizes détecte que loading="lazy" est pris en charge et ne déclenche pas son fallback JS.

    • L’image est chargée via le moteur natif du navigateur (meilleures performances).

Cas 2 : Le navigateur ne supporte pas loading="lazy" (IE11, anciens Safari)

  • Lazysizes prend le relais et applique son lazy loading en JS.

  • Pourquoi ?

    • Le navigateur ignore l’attribut loading="lazy" (inconnu).

    • Lazysizes voit que data-src est présent et active son système.

2. Comment éviter les conflits ?

Lazysizes est conçu pour ne pas interférer avec le lazy loading natif.

  • Si loading="lazy" est supporté, lazysizes ne fait rien et laisse le navigateur gérer.

  • Si loading="lazy" n’est pas supporté, lazysizes agit comme un fallback transparent.

Exemple de code optimisé (recommandé)

<img
  src="placeholder.jpg"  <!-- Image de placeholder (optionnel) -->
  data-src="real-image.jpg"  <!-- Source réelle -->
  class="lazyload"  <!-- Active lazysizes si nécessaire -->
  loading="lazy"  <!-- Lazy loading natif si supporté -->
  alt="Description"
>

Résultat :

  • Navigateurs modernes → Utilisent loading="lazy".

  • Anciens navigateurs → Utilisent lazysizes en JS.

3. Faut-il vraiment combiner les deux solutions ?

✅ Oui, dans ces cas :

  • Compatibilité maximale (IE11, anciens Safari).

  • Meilleure expérience utilisateur (évite un "flash" si le JS met du temps à charger).

  • Contrôle fin (pré-chargement personnalisé avec data-expand).

❌ Non, si :

  • Tu cibles uniquement des navigateurs très récents (Safari 16+, Chrome, Firefox).

  • Tu veux éviter tout JS (mais tu perds le lazy loading sur ~5% des utilisateurs).

Conclusion

  • loading="lazy" natif : Simple et efficace, mais limité aux navigateurs récents.

  • lazysizes : Solution complète pour tous les cas, avec un léger coût JS.

  • Combo gagnante : Utilise les deux pour couvrir 100% des utilisateurs.

Lazysizes reste pertinent, surtout si tu as besoin de fonctionnalités avancées ou d’une compatibilité étendue. 🚀

0
Subscribe to my newsletter

Read articles from mahmoud Nbet directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

mahmoud Nbet
mahmoud Nbet

My commitment to continuous innovation drives me to stay up to date with current web development trends 🚀🎯