Images responsives

Le texte s'affiche automatiquement sur les bords de l'écran afin d'éviter tout dépassement. C'est différent avec des images. Les images ont une taille intrinsèque. Si une image est plus large que l'écran, elle déborde, ce qui entraîne l'affichage d'une barre de défilement horizontale.

Heureusement, vous pouvez prendre des mesures en CSS pour éviter que cela ne se produise.

Contraindre vos images

Dans votre feuille de style, vous pouvez utiliser max-inline-size pour déclarer que les images ne doivent jamais être affichées dans une taille plus large que leur élément conteneur.

Navigateurs pris en charge

  • 57
  • 79
  • 41
  • 12.1

Source

img {
  max-inline-size: 100%;
  block-size: auto;
}

Vous pouvez également appliquer la même règle à d'autres types de contenus intégrés, tels que des vidéos et des cadres iFrame.

img,
video,
iframe {
  max-inline-size: 100%;
  block-size: auto;
}

Une fois cette règle en place, les navigateurs réduisent automatiquement les images pour les adapter à l'écran.

Deux captures d'écran. La première montre une image qui s'étend au-delà de la largeur du navigateur. La seconde montre la même image avec une contrainte dans la fenêtre d'affichage du navigateur.

Si vous ajoutez une valeur block-size de auto, le format des images restera constant.

Parfois, les dimensions d'une image peuvent être hors de votre contrôle (si une image est ajoutée via un système de gestion de contenu, par exemple). Si votre conception exige que les images aient un format différent de leurs dimensions réelles, utilisez la propriété aspect-ratio en CSS.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
}

Toutefois, le navigateur risque d'écraser ou d'étirer l'image afin qu'elle s'adapte au format de votre choix.

Profil d'un beau chien à l'air heureux avec une boule dans la gueule, mais l'image est écrasée.

Pour éviter cela, utilisez la propriété object-fit.

Navigateurs pris en charge

  • 32
  • 79
  • 36
  • 10

Source

Une valeur object-fit de contain indique au navigateur de conserver le format de l'image, même si cela implique de laisser un espace vide au-dessus et en dessous.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: contain;
}

Une valeur object-fit de cover indique au navigateur de conserver le format de l'image, même si cela implique de recadrer l'image en haut et en bas.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
}
Profil d'un beau chien à l'apparence heureuse avec une boule dans la gueule ; il y a de l'espace supplémentaire de chaque côté de l'image. Profil d'un beau chien à l'air heureux avec une boule dans la gueule ; l'image a été recadrée en haut et en bas.
La même image avec deux valeurs différentes pour "object-fit". La valeur du paramètre "object-fit" est définie sur "contain" et la valeur "object-fit" est définie sur "cover".

Si vous rencontrez un problème de recadrage régulier en haut et en bas, utilisez la propriété CSS object-position pour ajuster la zone de recadrage.

Navigateurs pris en charge

  • 32
  • 79
  • 36
  • 10

Source

Vous pouvez faire en sorte que les images les plus importantes restent visibles.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
  object-position: top center;
}

Profil d'un beau chien à l'air heureux avec une boule dans la gueule ; l'image n'a été recadrée qu'au bas de l'image.

Envoyer vos images

Ces règles CSS indiquent au navigateur le mode de rendu des images. Vous pouvez également fournir des indications dans votre code HTML sur la façon dont le navigateur doit gérer ces images.

Conseils de dimensionnement

Si vous connaissez les dimensions de l'image, vous devez inclure les attributs width et height. Même si l'image est affichée dans une taille différente (en raison de la règle max-inline-size: 100%), le navigateur connaît le rapport largeur/hauteur et peut réserver la bonne quantité d'espace. Ainsi, les autres contenus ne sauteront pas au chargement de l'image.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
>
La première vidéo présente une mise en page sans dimensions d'image définies. Notez que le texte saute une fois les images chargées. Dans la deuxième vidéo, les dimensions de l'image ont été indiquées ; il reste de l'espace pour l'image afin que le texte ne s'arrête pas une fois chargée.

Chargement des conseils...

Utilisez l'attribut loading pour indiquer au navigateur s'il faut retarder le chargement de l'image jusqu'à ce qu'elle se trouve dans la fenêtre d'affichage ou à proximité. Pour les images en dessous de la ligne de flottaison, utilisez la valeur lazy. Le navigateur ne charge pas les images différées tant que l'utilisateur n'a pas fait défiler la page suffisamment bas pour que les images soient sur le point de s'afficher. Si l'utilisateur ne fait jamais défiler la page, l'image ne se charge jamais.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
>

Pour une image de héros au-dessus de la ligne de flottaison, loading ne doit pas être utilisé. Si votre site applique automatiquement l'attribut loading="lazy", vous pouvez généralement définir l'attribut eager (par défaut) pour empêcher son application:

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
>

Priorité de récupération

Pour les images importantes, telles que l'image LCP, vous pouvez prioriser davantage le chargement à l'aide de la règle Fetch Priority en définissant l'attribut fetchpriority sur high:

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
 fetchpriority="high"
>

Cela indique au navigateur qu'il doit récupérer l'image immédiatement et avec une priorité élevée, au lieu d'attendre que le navigateur ait terminé la mise en page alors que les images sont normalement extraites.

Gardez toutefois à l'esprit que lorsque vous demandez au navigateur de prioriser le téléchargement d'une ressource (comme une image), le navigateur doit diminuer la priorité d'une autre ressource, comme un script ou un fichier de police. Ne définissez fetchpriority="high" sur une image que si elle est vraiment essentielle.

Conseils de préchargement

Il est possible que certaines images ne soient pas disponibles dans le code HTML initial si elles ont été ajoutées en JavaScript, ou en tant qu'images de fond dans CSS. Vous pouvez également utiliser le préchargement pour permettre la récupération anticipée de ces images importantes. Cet attribut peut être associé à l'attribut fetchpriority pour les images très importantes:

<link rel="preload" href="hero.jpg" as="image" fetchpriority="high">

Là encore, il convient d'utiliser cette approche avec parcimonie pour éviter de remplacer trop souvent l'heuristique de priorisation des navigateurs, ce qui pourrait dégrader les performances.

Le préchargement d'images responsives basé sur "srcset" (décrit ci-dessous) via les attributs imagesrcset et imagesizes est plus avancé et est compatible avec certains navigateurs, mais pas dans tous:

En excluant la création de remplacement href, vous vous assurez que les navigateurs non compatibles ne préchargent pas l'image incorrecte.

Le préchargement basé sur différents formats d'image en fonction de la compatibilité du navigateur avec ces images n'est actuellement pas pris en charge et peut entraîner des téléchargements supplémentaires.

L'idéal est d'éviter le préchargement dans la mesure du possible et d'avoir l'image disponible dans le code HTML initial, d'éviter la répétition du code et de permettre l'accès à la gamme complète des options prises en charge par le navigateur.

Décodage des images

Vous pouvez également ajouter un attribut decoding aux éléments img. Vous pouvez indiquer au navigateur que l'image peut être décodée de manière asynchrone. Le navigateur peut alors traiter en priorité les autres contenus.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
>

Vous pouvez utiliser la valeur sync si l'image est le contenu le plus important à prioriser.

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
 decoding="sync"
>

L'attribut decoding ne modifie pas la vitesse de décodage de l'image, mais simplement si le navigateur attend que le décodage de l'image ait lieu avant d'afficher d'autres contenus.

Dans la plupart des cas, l'impact est faible, mais dans certains cas, l'image ou le contenu peut s'afficher un peu plus rapidement. Par exemple, pour un document volumineux comportant de nombreux éléments dont l'affichage prend du temps, ainsi que pour les grandes images dont le décodage prend du temps, définir sync sur les images importantes indique au navigateur d'attendre l'image et d'afficher les deux en même temps. La définition de async permet également d'afficher le contenu plus rapidement sans attendre le décodage de l'image.

Toutefois, la meilleure option consiste généralement à éviter les tailles de DOM excessives et à s'assurer que des images responsives sont utilisées afin de réduire le temps de décodage. Cela signifie que l'attribut de décodage aura peu d'effet.

Images responsives avec srcset

Grâce à cette déclaration max-inline-size: 100%, vos images ne sortiront jamais de leurs conteneurs. En revanche, une grande image qui se rétrécit pour tenir sur la taille n'est pas optimale. Si une personne utilise un appareil à petit écran sur un réseau à faible bande passante, elle téléchargera des images inutilement volumineuses.

Si vous créez plusieurs versions de la même image dans différentes tailles, vous pouvez les signaler au navigateur à l'aide de l'attribut srcset.

Descripteur de largeur

Vous pouvez transmettre une liste de valeurs séparées par une virgule. Chaque valeur doit correspondre à l'URL d'une image, suivie d'un espace, suivie de métadonnées concernant l'image. Ces métadonnées sont appelées descripteurs.

Dans cet exemple, les métadonnées décrivent la largeur de chaque image à l'aide de l'unité w. Un w correspond à un pixel.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
>

L'attribut srcset ne remplace pas l'attribut src. En revanche, l'attribut srcset complète l'attribut src. Vous devez toujours disposer d'un attribut src valide, mais le navigateur peut désormais remplacer sa valeur par l'une des options répertoriées dans l'attribut srcset.

Le navigateur ne télécharge les images plus grandes que si elles sont réellement nécessaires. ce qui permet d'économiser de la bande passante.

Tailles

Si vous utilisez le descripteur de largeur, vous devez également utiliser l'attribut sizes pour fournir plus d'informations au navigateur. Cette valeur indique au navigateur la taille que l'image doit s'afficher dans différentes conditions. Ces conditions sont spécifiées dans une requête média.

L'attribut sizes accepte une liste de requêtes média et de largeurs d'image séparées par une virgule.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
 sizes="(min-width: 66em) 33vw,
  (min-width: 44em) 50vw,
  100vw"
>

Dans cet exemple, vous indiquez au navigateur qu'au-dessus d'une largeur de fenêtre d'affichage de 66em, l'image doit être affichée au moins un tiers de l'écran (dans une mise en page à trois colonnes, par exemple).

Pour les largeurs de fenêtre d'affichage comprises entre 44em et 66em, affichez l'image à la moitié de la largeur de l'écran (mise en page en deux colonnes).

Pour les éléments inférieurs à 44em, affichez l'image sur toute la largeur de l'écran.

Cela signifie que l'image la plus grande ne sera pas nécessairement utilisée pour le grand écran. Une grande fenêtre de navigateur pouvant afficher une mise en page à plusieurs colonnes utilisera une image qui tient sur une seule colonne. Cette image peut être plus petite qu'une image utilisée pour une mise en page à une seule colonne sur un écran plus étroit.

Descripteur de densité de pixels

Il se peut également que vous souhaitiez fournir plusieurs versions de la même image.

Certains appareils sont équipés d'un écran haute densité. Sur un écran double densité, vous pouvez regrouper deux pixels d'informations dans l'espace d'un pixel. Ainsi, les images sont nettes sur ce type d'écran.

Deux versions de la même image d&#39;un beau chien à l&#39;air heureux avec une boule dans la gueule, l&#39;une ayant l&#39;air nette et l&#39;autre floue.

Utilisez le descripteur de densité pour décrire la densité en pixels de l'image par rapport à celle-ci dans l'attribut src. Le descripteur de densité est un nombre suivi de la lettre x: 1x, 2x, etc.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 1x,
  medium-image.png 2x,
  large-image.png 3x"
>

Si la taille de small-image.png est de 300 x 200 pixels et que la taille de medium-image.png est de 600 x 400 pixels, medium-image.png peut avoir 2x après dans la liste srcset.

Vous n'êtes pas obligé d'utiliser des nombres entiers. Si la taille d'une autre version de l'image est de 450 x 300 pixels, vous pouvez la décrire avec 1.5x.

Images de présentation

Les images en HTML sont du contenu. C'est pourquoi vous devez toujours fournir un attribut alt avec une description de l'image pour les lecteurs d'écran et les moteurs de recherche.

Si vous intégrez une image purement visuelle et sans contenu pertinent, utilisez un attribut alt vide.

<img
 src="flourish.png"
 alt=""
 width="400"
 height="50"
>

Vous devez toujours inclure l'attribut alt. Un attribut alt manquant est différent d'un attribut alt vide. Un attribut alt vide indique à un lecteur d'écran que cette image est une image de présentation.

Idéalement, vos images de présentation ou de décoration ne doivent pas se trouver dans votre code HTML. HTML sert à la structure. Le CSS sert à la présentation.

Image de fond

Utilisez la propriété background-image en CSS pour charger des images de présentation.

element {
  background-image: url(flourish.png);
}

Vous pouvez spécifier plusieurs images candidates à l'aide de la fonction image-set pour background-image.

La fonction image-set en CSS fonctionne beaucoup comme l'attribut srcset en HTML. Fournissez une liste d'images, avec un descripteur de densité de pixels pour chacune d'elles.

element {
  background-image: image-set(
    small-image.png 1x,
    medium-image.png 2x,
    large-image.png 3x
  );
}

Le navigateur choisira l'image la mieux adaptée à la densité en pixels de l'appareil.

Lorsque vous ajoutez des images à votre site, vous devez prendre en compte de nombreux facteurs:

Réservez le bon espace à chaque image. Déterminer le nombre de tailles dont vous avez besoin. Déterminer si l'image est de contenu ou décoratif.

Il est utile de prendre le temps d'obtenir des images de qualité. Les stratégies d'images de mauvaise qualité sont à l'origine de frustration et d'agacement pour les utilisateurs. Une bonne stratégie d'images permet de rendre votre site dynamique et net, quel que soit l'appareil ou la connexion réseau de l'utilisateur.

Votre kit comporte un autre élément HTML pour vous aider à mieux contrôler vos images: l'élément picture.

Testez vos connaissances

Tester vos connaissances sur les images

Des styles doivent être ajoutés pour que les images s'adaptent à la fenêtre d'affichage.

Vrai
Les images sans confinement seront aussi grandes que leur taille naturelle.
Faux
Veuillez indiquer des styles.

Lorsque la hauteur et la largeur d'une image ont été formulées de force dans un format artificiel, quels styles peuvent aider à ajuster la façon dont l'image s'adapte à ces proportions ?

object-fit
Indiquez comment l'image s'adapte à des mots clés tels que contain et cover.
image-fit
Cette propriété n'existe pas, je l'ai inventée.
fit-image
Cette propriété n'existe pas, je l'ai inventée.
aspect-ratio
Cela peut provoquer ou résoudre un rapport d'image artificiel.

Si vous ajoutez height et width à vos images, CSS ne pourra pas appliquer un style différent à ces images.

Vrai
Considérez-les plus comme des indices que comme des règles.
Faux
Le CSS propose de nombreuses options dynamiques pour dimensionner les images, même si la hauteur et la largeur sont alignées sur le tag.

L'attribut srcset ne _______ pas l'attribut src, mais _______ l'.

compléter, remplacer
srcset ne remplace définitivement pas l'attribut src.
remplacer, complète
Il fournit au navigateur des options supplémentaires, s'il est compatible.

Un élément alt manquant sur une image équivaut à un élément alt vide.

Vrai
Un attribut alt vide indique à un lecteur d'écran que cette image est une image de présentation.
Faux
L'absence de alt ne signale aucun lecteur d'écran.