Avancé20 min de lecture

Images responsives

Apprends à servir la bonne image pour chaque taille d'écran en utilisant srcset, sizes, l'élément picture et les attributs modernes de performance.

Le problème avec les images fixes

Un seul fichier image ne peut pas être optimal pour tous les appareils. Une photo haute résolution parfaite pour un écran d'ordinateur gaspille de la bande passante sur un téléphone, tandis qu'une petite image paraît floue sur un écran retina.

Les images responsives résolvent ce problème en permettant au navigateur de choisir la meilleure source d'image en fonction de la largeur de la fenêtre, de la densité de pixels et des formats supportés par l'appareil.

srcset et sizes

L'attribut srcset sur <img> fournit un ensemble de sources d'images avec leurs largeurs intrinsèques :

html
<img
  src="photo-800.jpg"
  srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
  sizes="(max-width: 600px) 100vw, (max-width: 1000px) 50vw, 33vw"
  alt="A landscape photo"
>
  • srcset liste les images disponibles avec leurs descripteurs de largeur (400w, 800w, etc.).
  • sizes indique au navigateur quelle sera la largeur d'affichage de l'image à chaque point de rupture.
  • src est le fallback pour les navigateurs qui ne supportent pas srcset.

Le navigateur combine sizes avec le ratio de pixels de l'appareil pour choisir le meilleur fichier. Tu ne sais jamais exactement quelle image sera chargée — et c'est justement le but. Le navigateur optimise en fonction du contexte de l'utilisateur.

L'élément <picture>

Pour la direction artistique (recadrage ou changement complet de l'image à différents points de rupture) ou le changement de format, utilise l'élément <picture> :

html
<picture>
  <source media="(max-width: 600px)" srcset="photo-mobile.jpg">
  <source media="(max-width: 1200px)" srcset="photo-tablet.jpg">
  <img src="photo-desktop.jpg" alt="A landscape photo">
</picture>

Changement de format

Sers des formats modernes aux navigateurs qui les supportent :

html
<picture>
  <source srcset="photo.avif" type="image/avif">
  <source srcset="photo.webp" type="image/webp">
  <img src="photo.jpg" alt="A landscape photo">
</picture>

Le navigateur choisit la première <source> qu'il supporte. Le <img> est requis comme fallback et c'est là que se trouve le texte alt.

Attributs de performance

Le HTML moderne fournit des attributs pour améliorer les performances de chargement des images :

  • loading="lazy" — Diffère le chargement jusqu'à ce que l'image soit proche de la fenêtre visible. N'utilise pas ceci sur les images visibles au chargement initial (above the fold).
  • decoding="async" — Suggère au navigateur de décoder l'image hors du thread principal.
  • width et height — Inclus toujours ces attributs pour éviter le Cumulative Layout Shift (CLS). Le navigateur réserve l'espace correct avant que l'image ne charge.
  • fetchpriority="high" — Indique que cette image est critique (par exemple, images hero). À utiliser avec parcimonie.

Exemple complet d'image responsive

html
<!-- Responsive image with srcset and sizes -->
<img
  src="hero-800.jpg"
  srcset="hero-400.jpg 400w, hero-800.jpg 800w, hero-1600.jpg 1600w"
  sizes="(max-width: 600px) 100vw, 50vw"
  alt="Mountain landscape at sunset"
  width="800"
  height="600"
  loading="lazy"
  decoding="async"
>

<!-- Art direction with picture -->
<picture>
  <source media="(max-width: 600px)" srcset="banner-mobile.jpg">
  <source media="(max-width: 1200px)" srcset="banner-tablet.jpg">
  <img src="banner-desktop.jpg" alt="Site banner" width="1200" height="400">
</picture>

<!-- Format switching -->
<picture>
  <source srcset="logo.avif" type="image/avif">
  <source srcset="logo.webp" type="image/webp">
  <img src="logo.png" alt="Company logo" width="200" height="60">
</picture>

Quelle est la différence entre utiliser srcset sur <img> et utiliser l'élément <picture> ?

Prêt à pratiquer ?

Crée ton compte gratuit pour accéder à l'éditeur de code interactif, lancer les défis et suivre ta progression.