HTMLImageElement : propriété sizes
Baseline
Large disponibilité
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis mars 2016.
La propriété sizes de l'interface HTMLImageElement permet de définir la largeur de présentation de l'image pour chacune d'une liste de requêtes média, ou auto pour les images chargées paresseusement afin de permettre au navigateur de sélectionner automatiquement une image à afficher en fonction de la taille de présentation de l'élément.
Cela permet au navigateur de choisir entre différentes images définies dans l'élément srcset pour correspondre à différentes conditions média — même des images avec des orientations ou des rapports d'aspect différents.
La propriété sizes reflète l'attribut de contenu sizes de l'élément <img>.
Elle ne peut être présente que lorsque srcset utilise des descripteurs de largeur.
Valeur
Une chaîne de caractères qui peut être le mot-clé auto (éventuellement suivi de n'importe quel nombre de tailles sources), ou une ou plusieurs tailles sources.
Voir l'attribut sizes dans la référence HTML de l'élément <img> pour plus d'informations.
Exemples
>Sélection d'une image adaptée à la largeur de la fenêtre
Cet exemple montre comment le navigateur utilise l'attribut sizes pour sélectionner une image à partir de srcset en fonction de la largeur de rendu de l'image à la largeur actuelle de la fenêtre.
Il permet également de voir l'effet du redimensionnement de la fenêtre du navigateur sur l'image chargée.
HTML
Pour démontrer l'effet du chargement paresseux, les images doivent être initialement cachées du zone d'affichage visuelle, puis défilées dans la vue.
Cela est réalisé en ayant un conteneur <div> externe scroll-container qui contient les conteneurs spacer et demo-wrap.
L'image est contenue à l'intérieur du conteneur demo-wrap, qui est repoussé hors de la zone d'affichage visuelle par la hauteur définie sur le conteneur spacer.
L'élément <img> a les attributs suivants :
srcsetdéfinit quatre images et indique qu'elles ont des largeurs de600px,900px,1200pxet1500px.srcdéfinit l'image qui est utilisée sisrcsetn'est pas pris en charge ou ne peut pas être analysé. Nous utilisons la plus grande image dans lesrcset, car elle est presque toujours mieux réduite que la plus petite image n'est pas agrandie.loadingestlazy.sizesdéfinit la largeur de rendu attendue de l'image à un ensemble de points de rupture de largeur de fenêtre, permettant au navigateur de sélectionner l'image la plus appropriée à partir desrcset.
<div id="scroll-container">
Faites défiler vers le bas pour afficher les images
<div id="spacer"></div>
<div id="demo-wrap">
<div class="img-container" id="resizable">
<div class="img-square">
<img
loading="lazy"
sizes="(max-width: 600px) 600px, (max-width: 900px) 900px, (max-width: 1200px) 1200px, 1500px"
src="1500.png"
srcset="600.png 600w, 900.png 900w, 1200.png 1200w, 1500.png 1500w"
alt="Example image" />
</div>
<div class="label">
<strong
>Largeur du conteneur : <span id="width-label"></span
></strong>
</div>
</div>
</div>
</div>
Le CSS et le JavaScript ne sont pas affichés (si vous souhaitez les examiner, sélectionnez « Exécuter » pour voir l'exemple complet dans le playground interactif).
Résultat
L'exemple est mieux voir dans sa propre fenêtre, afin que vous puissiez ajuster pleinement les tailles, et l'exemple n'est pas limité par son cadre contenant.
-
Faites défiler le cadre pour afficher l'image. L'étiquette en bas de l'image montre la largeur actuelle du conteneur.
-
Redimensionnez la fenêtre — vous devriez voir l'image changer aux points de rupture des media queries de l'attribut
sizes.Notez que l'image sélectionnée peut être plus grande que la largeur du conteneur ne le suggère. De nombreux écrans, sinon la plupart, ont un rapport de pixels de l'appareil (DPR) supérieur à un. Pour afficher une image nette à la densité de pixels physique de l'écran, un navigateur multiplie l'indice
sizescorrespondant par le DPR avant de sélectionner à partir desrcset. Par exemple, sur un écran 2× avec une fenêtre d'affichage d'environ 500px, l'indice correspondant est600px, mais le navigateur recherche une image d'environ 1200px et sélectionne1200.pngcomme taille disponible la plus proche, puis la redimensionne pour s'adapter à l'espace disponible.Note : En conséquence, certaines des images dans le
srcsetpeuvent ne pas être accessibles sur un affichage particulier à certains points de rupture, et cela peut dépendre du navigateur.
Le journal fournit des informations lorsque l'évènement load se déclenche pour l'image et lorsqu'elle intersecte la fenêtre d'affichage visible.
Notez que l'image est chargée de manière paresseuse, donc l'évènement load devrait se déclencher juste avant que l'image n'entre dans la fenêtre d'affichage.
Sélection automatique d'image pour les images chargées de manière paresseuse
Cet exemple montre comment la définition de la valeur sizes sur auto affecte la sélection de l'image à charger à partir de srcset lorsque les éléments <img> sont chargés de manière paresseuse.
Il permet également de voir l'effet du changement de taille d'un conteneur sur l'image chargée.
HTML
Le HTML est similaire à celui de l'exemple précédent, sauf qu'il définit trois éléments <img> presque identiques, chacun avec un srcset indiquant 3 images de 600px, 400px et 200px de large, et avec une valeur sizes de auto.
Ces éléments sont contraints dans des conteneurs dimensionnés pour sélectionner les différentes images.
<div id="scroll-container">
Faites défiler vers le bas pour afficher les images
<div id="spacer"></div>
<div id="demo-wrap">
<div class="img-container img-container--sm" id="resizable">
<div class="img-square">
<img
loading="lazy"
sizes="auto"
src="600.png"
srcset="600.png 600w, 400.png 400w, 200.png 200w"
alt="Image dans un petit conteneur" />
</div>
<div class="label">
<strong>Largeur du conteneur : 100px</strong>
</div>
</div>
<div class="img-container img-container--md">
<div class="img-square">
<img
loading="lazy"
sizes="auto"
src="600.png"
srcset="600.png 600w, 400.png 400w, 200.png 200w"
alt="Image dans un conteneur moyen" />
</div>
<div class="label">
<strong>Largeur du conteneur : 200px</strong>
</div>
</div>
<div class="img-container img-container--lg">
<div class="img-square">
<img
loading="lazy"
sizes="auto"
src="600.png"
srcset="600.png 600w, 400.png 400w, 200.png 200w"
alt="Image dans un grand conteneur" />
</div>
<div class="label">
<strong>Largeur du conteneur : 400px</strong>
</div>
</div>
</div>
</div>
CSS
Voici les classes CSS qui définissent la taille des différents conteneurs d'images.
.img-container--sm {
width: 100px;
}
.img-container--md {
width: 200px;
}
.img-container--lg {
width: 400px;
}
Le reste du CSS et le JavaScript qui alimentent le curseur, la journalisation, etc., ne sont pas affichés (si vous souhaitez les examiner, sélectionnez « Exécuter » pour voir l'exemple complet dans le terrain de jeu interactif).
Résultat
Faites défiler le cadre pour afficher les trois images. Le navigateur devrait avoir sélectionné une image différente pour chacune en fonction des différentes contraintes de largeur. Vous pouvez utiliser le curseur pour modifier la taille du conteneur de la première image. Notez que le navigateur peut ou non sélectionner une nouvelle image à afficher lorsque la taille du conteneur change, car les implémentations ne sont pas tenues de réagir aux changements dynamiques.
Le journal fournit des informations lorsque l'évènement load se déclenche pour chaque image, et lorsque une image intersecte la zone d'affichage visible.
Notez que les images sont chargées de manière paresseuse, donc l'évènement load devrait se déclencher juste avant que l'image n'entre dans la zone d'affichage.
Notez également que l'évènement load se déclenche également lorsque vous modifiez la taille du conteneur pour la première image, indiquant quand le navigateur a recalculé la mise en page (pas nécessairement qu'une nouvelle image a été chargée).
Exemple de blog
Dans cet exemple, une mise en page de type blog est créée, affichant du texte et une image pour laquelle trois points de taille sont définis, selon la largeur de la fenêtre. Trois versions de l'image sont également disponibles, avec leurs largeurs indiquées. Le navigateur utilise toutes ces informations et sélectionne l'image et la largeur qui correspondent le mieux aux valeurs définies.
La façon dont les images sont utilisées peut dépendre du navigateur et de la densité de pixels de l'écran de l'utilisateur·ice.
Des boutons en bas de l'exemple permettent de modifier légèrement la propriété sizes, en alternant la plus grande des trois largeurs de l'image entre 40em et 50em.
HTML
<article>
<h1>Un titre incroyable</h1>
<div class="test"></div>
<p>
Ceci est encore plus de contenu incroyable. C'est vraiment spectaculaire. Et
fascinant. Oh, c'est aussi intelligent et spirituel. Des choses primées,
j'en suis sûr.
</p>
<img
src="new-york-skyline-wide.jpg"
srcset="
new-york-skyline-wide.jpg 3724w,
new-york-skyline-4by3.jpg 1961w,
new-york-skyline-tall.jpg 1060w
"
sizes="(50em <= width <= 60em) 50em,
(40em <= width < 50em) 30em,
(width < 40em) 20em"
alt="La ligne d'horizon de New York par une belle journée, avec le One World Trade Center au centre." />
<p>
Ensuite, il y a encore plus de contenu incroyable à dire ici. Pouvez-vous y
croire ? Je n'en suis pas sûr.
</p>
<button id="break40">Dernière largeur : 40em</button>
<button id="break50">Dernière largeur : 50em</button>
</article>
CSS
article {
margin: 1em;
max-width: 60em;
min-width: 20em;
border: 4em solid #880e4f;
border-radius: 7em;
padding: 1.5em;
font:
16px "Open Sans",
Verdana,
Arial,
Helvetica,
sans-serif;
}
article img {
display: block;
max-width: 100%;
border: 1px solid #888888;
box-shadow: 0 0.5em 0.3em #888888;
margin-bottom: 1.25em;
}
JavaScript
Le code JavaScript gère les deux boutons qui permettent d'alterner la troisième option de largeur entre 40em et 50em ; cela se fait en gérant l'évènement click et en utilisant la méthode JavaScript replace() pour remplacer la partie concernée de la chaîne sizes.
const image = document.querySelector("article img");
const break40 = document.getElementById("break40");
const break50 = document.getElementById("break50");
break40.addEventListener(
"click",
() => (image.sizes = image.sizes.replace(/50em,/, "40em,")),
);
break50.addEventListener(
"click",
() => (image.sizes = image.sizes.replace(/40em,/, "50em,")),
);
Résultat
La page est mieux affichée dans sa propre fenêtre, afin de pouvoir ajuster pleinement les tailles, et l'exemple n'est pas contraint par son cadre contenant.
- Activez les outils de développement et changez la largeur de la page — vous devriez voir l'image changer (et sauter en taille) aux points de rupture des requêtes média de tailles :
640px(40em), et800px(50em). - Réglez la largeur entre
50em(800px) et60em(960px) afin que la dernière requête média soit sélectionnée. Ensuite, appuyez alternativement sur chacun des boutons et notez comment la taille de l'image change.
Spécifications
| Spécification |
|---|
| HTML> # dom-img-sizes> |
Compatibilité des navigateurs
Voir aussi
- Requêtes média
- Utiliser les requêtes média
- Images HTML
- Images réactives
- Utiliser les attributs
srcsetetsizes - La propriété
HTMLImageElement.currentSrc - La propriété
HTMLImageElement.src - La propriété
HTMLImageElement.srcset