Immagini adattabili

Il testo sul web viene automaticamente a capo al bordo dello schermo in modo che non venga troncato. Le immagini, invece, hanno una dimensione intrinseca. Se un'immagine è più larga dello schermo, l'immagine viene troncata e l'utente deve scorrere orizzontalmente per visualizzarla tutta.

Fortunatamente, CSS ti offre strumenti per impedire che ciò accada.

Vincolare le immagini

Nel foglio di stile, puoi utilizzare max-inline-size per dichiarare che le immagini non possono mai essere visualizzate con una larghezza superiore a quella dell'elemento contenitore.

Browser Support

  • Chrome: 57.
  • Edge: 79.
  • Firefox: 41.
  • Safari: 12.1.

Source

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

Puoi applicare la stessa regola anche ad altri tipi di contenuti incorporati, come video e iframe.

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

Con questa regola, i browser ridimensionano automaticamente le immagini per adattarle allo schermo.

Due screenshot: il primo mostra un'immagine che si espande oltre la larghezza del browser, mentre il secondo mostra la stessa immagine vincolata all'interno della finestra del browser.
Il vincolo dell'immagine consente agli utenti di visualizzarla interamente senza scorrere.

L'aggiunta di un valore block-size di auto indica che il browser mantiene le proporzioni delle immagini durante il ridimensionamento.

A volte, le dimensioni di un'immagine vengono impostate da un sistema di gestione dei contenuti (CMS) o da un altro sistema di distribuzione dei contenuti. Se il tuo design richiede un formato diverso da quello predefinito del CMS, puoi utilizzare la proprietà aspect-ratio per preservare il design del tuo sito:

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

Purtroppo, spesso il browser deve comprimere o allungare l'immagine per farla entrare nello spazio previsto.

Profilo di un bel cane dall'aspetto felice con una palla in bocca, ma l'immagine è schiacciata.
La modifica delle proporzioni dell'immagine la fa apparire schiacciata o allungata.

Per evitare lo schiacciamento e l'allungamento, utilizza la proprietà object-fit.

Browser Support

  • Chrome: 32.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 10.

Source

Un valore object-fit pari a contain indica al browser di mantenere le proporzioni dell'immagine, lasciando spazio vuoto intorno all'immagine, se necessario.

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

Un valore object-fit di cover indica al browser di mantenere le proporzioni dell'immagine, ritagliandola se necessario.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
}
Profilo di un bel cane dall'aspetto felice con una palla in bocca; c'è spazio extra su entrambi i lati dell'immagine. Profilo di un bel cane dall'aspetto felice con una palla in bocca; l'immagine è stata ritagliata nella parte superiore e inferiore.
La stessa immagine con due valori diversi per `object-fit` applicati. Il primo ha un valore "contain" per `object-fit`. Il secondo ha un valore "cover" per `object-fit`.

Puoi modificare la posizione del ritaglio dell'immagine utilizzando la proprietà object-position. In questo modo, la messa a fuoco del ritaglio viene regolata, così puoi assicurarti che la parte più importante dell'immagine sia ancora visibile.

Browser Support

  • Chrome: 32.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 10.

Source

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
  object-position: top center;
}
Profilo di un bel cane dall'aspetto felice con una palla in bocca; l'immagine è stata ritagliata solo in basso.
Puoi impostare object-position per ritagliare solo un lato dell'immagine.

Fornire le immagini

Queste regole CSS indicano al browser come vuoi che vengano visualizzate le immagini. Puoi anche fornire suggerimenti in HTML su come il browser deve gestire queste immagini.

Suggerimenti per la scelta della taglia

Se conosci le dimensioni dell'immagine, includi sempre gli attributi width e height. Anche se l'immagine viene visualizzata con dimensioni diverse a causa della regola max-inline-size, il browser conosce comunque il rapporto tra larghezza e altezza e può riservare la giusta quantità di spazio. In questo modo, gli altri contenuti non si spostano quando l'immagine viene caricata.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
>
Il primo video mostra un layout senza dimensioni dell'immagine definite. Nota come il testo salta quando le immagini vengono caricate. Nel secondo video, sono state fornite le dimensioni dell'immagine, quindi il browser lascia spazio per l'immagine e il testo non si sposta quando l'immagine viene caricata.

Suggerimenti per il caricamento

Utilizza l'attributo loading per indicare al browser se ritardare il caricamento dell'immagine finché non si trova all'interno o in prossimità del riquadro visibile. Per le immagini sotto la piega, utilizza un valore di lazy. Il browser non carica le immagini con caricamento lento finché l'utente non scorre abbastanza in basso da far apparire l'immagine. Se l'utente non scorre mai, l'immagine non viene mai caricata.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
>
Le immagini con caricamento lento vengono caricate solo quando l'utente sta per scorrerle.

Per un'immagine hero above the fold, non utilizzare loading. Se il tuo sito applica automaticamente l'attributo loading="lazy", in genere puoi impostare loading sul valore predefinito eager per impedire il caricamento lento delle immagini:

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

Priorità di recupero

Per le immagini importanti, come l'immagine LCP, puoi dare ulteriore priorità al caricamento utilizzando Fetch Priority impostando l'attributo fetchpriority su high:

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

In questo modo, il browser recupera l'immagine immediatamente e con priorità elevata, anziché attendere il completamento del layout e il recupero normale delle immagini.

Tuttavia, quando chiedi al browser di dare la priorità al download di una risorsa, ad esempio un'immagine, il browser deve declassare un'altra risorsa, ad esempio uno script o un file di caratteri. Imposta fetchpriority="high" su un'immagine solo se è davvero fondamentale.

Suggerimenti per il precaricamento

È meglio evitare il precaricamento quando possibile includendo tutte le immagini nel file HTML iniziale. Tuttavia, alcune immagini potrebbero non essere disponibili, ad esempio le immagini aggiunte da JavaScript o un'immagine di sfondo CSS.

Puoi utilizzare il precaricamento per fare in modo che il browser recuperi queste immagini importanti in anticipo. Per le immagini davvero importanti, puoi combinare il precaricamento con l'attributo fetchpriority:

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

Anche in questo caso, utilizza questi attributi con parsimonia per evitare di ignorare troppo spesso l'euristica di prioritizzazione del browser. L'uso eccessivo può causare un peggioramento delle prestazioni.

Alcuni browser supportano il precaricamento di immagini adattabili in base a srcset, utilizzando gli attributi imagesrcset e imagesizes. Ad esempio:

<link rel="preload" imagesrcset="hero_sm.jpg 1x hero_med.jpg 2x hero_lg.jpg 3x" as="image" fetchpriority="high">

Se escludi il fallback href, puoi assicurarti che i browser senza supporto srcset precarichino comunque l'immagine corretta.

Non puoi precaricare immagini in formati diversi in base al supporto del browser per determinati formati. Se tenti di farlo, potresti causare download aggiuntivi che sprecano i dati degli utenti.

Immagini adattabili con srcset

Grazie a questa dichiarazione max-inline-size: 100%, le tue immagini non possono uscire dai relativi contenitori. Tuttavia, se un utente ha uno schermo piccolo e una rete a bassa larghezza di banda, il download di immagini delle stesse dimensioni di quelle degli utenti con schermi più grandi comporta uno spreco di dati.

Per risolvere il problema, aggiungi più versioni della stessa immagine di dimensioni diverse e utilizza l'attributo srcset per comunicare al browser che queste dimensioni esistono e quando utilizzarle.

Descrittore della larghezza

Puoi definire un srcset utilizzando un elenco separato da virgole di valori. Ogni valore è l'URL di un'immagine, seguito da uno spazio e da alcuni metadati sull'immagine, chiamati descrittore.

In questo esempio, i metadati descrivono la larghezza di ogni immagine utilizzando l'unità w. Un w corrisponde alla larghezza di 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'attributo srcset integra l'attributo src anziché sostituirlo. Devi comunque avere un attributo src valido, ma il browser può sostituire il suo valore con una delle opzioni elencate in srcset. Per risparmiare larghezza di banda, il browser scarica l'immagine più grande solo se è necessaria.

Formato

Se utilizzi il descrittore di larghezza, devi utilizzare anche l'attributo sizes per fornire ulteriori informazioni al browser. Indica al browser le dimensioni con cui prevedi che l'immagine venga visualizzata in diverse condizioni. Queste condizioni sono specificate in una media query.

L'attributo sizes accetta un elenco separato da virgole di query multimediali e larghezze delle immagini.

<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"
>

In questo esempio, indichi al browser che in un viewport con una larghezza superiore a 66em, l'immagine deve essere visualizzata con una larghezza non superiore a un terzo dello schermo (ad esempio, all'interno di un layout a tre colonne).

Per larghezze della finestra comprese tra 44em e 66em, visualizza l'immagine a metà della larghezza dello schermo (come in un layout a due colonne).

Per qualsiasi elemento più stretto di 44em, visualizza l'immagine a tutta la larghezza dello schermo.

Ciò significa che l'immagine più grande non verrà necessariamente utilizzata per lo schermo più ampio. Una finestra del browser ampia che può visualizzare un layout a più colonne utilizza un'immagine che si adatta a una colonna, che potrebbe essere più piccola di un'immagine utilizzata per un layout a una sola colonna su uno schermo più stretto.

Utilizza i descrittori di dimensioni per modificare il layout della pagina su schermi di dimensioni diverse.

Descrittore della densità di pixel

Puoi anche utilizzare i descrittori per fornire una versione alternativa delle immagini da mostrare su display ad alta densità, in modo che le immagini rimangano nitide alle risoluzioni più elevate che forniscono.

Due versioni della stessa immagine di un bel cane dall'aspetto felice con una palla in bocca, una nitida e l'altra sfocata.
Le immagini con densità di pixel inferiore possono apparire sfocate.

Utilizza il descrittore di densità per descrivere la densità di pixel dell'immagine in relazione all'immagine nell'attributo src. Il descrittore di densità è un numero seguito dalla lettera x, ad esempio 1x o 2x.

<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"
>

Se small-image.png ha dimensioni di 300 x 200 pixel e medium-image.png ha dimensioni di 600 x 400 pixel, allora medium-image.png può avere 2x dopo di sé nell'elenco srcset.

Non devi utilizzare numeri interi. Se un'altra versione dell'immagine ha dimensioni di 450 x 300 pixel, puoi descriverla con 1.5x.

Immagini di presentazione

Le immagini in HTML sono contenuti. Per questo motivo, includi l'attributo alt con una descrizione dell'immagine per screen reader e motori di ricerca.

Se incorpori un'immagine decorativa, senza contenuti significativi, puoi utilizzare un attributo alt vuoto.

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

Devi sempre includere l'attributo alt, anche se è vuoto. Un attributo alt vuoto indica a uno screen reader che l'immagine è presentazionale. Un attributo alt mancante non fornisce queste informazioni.

Idealmente, le immagini di presentazione o decorative sono incluse con CSS anziché HTML. L'HTML è per la struttura. CSS è per la presentazione.

Immagini di sfondo

Utilizza la proprietà background-image in CSS per caricare le immagini di presentazione.

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

Puoi specificare più immagini candidate utilizzando la funzione image-set per background-image.

La funzione image-set in CSS funziona in modo molto simile all'attributo srcset in HTML. Fornisci un elenco di immagini con un descrittore della densità di pixel per ciascuna.

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

Il browser sceglie l'immagine più appropriata per la densità dei pixel del dispositivo.

Quando aggiungi immagini al tuo sito, devi tenere conto di molti fattori, tra cui:

  • Riservando lo spazio giusto per ogni immagine.
  • Determinare il numero di taglie necessarie.
  • Decidere se l'immagine è un contenuto o un elemento decorativo.

Vale la pena dedicare del tempo per ottenere le immagini giuste. Strategie di gestione delle immagini scadenti possono infastidire e frustrare gli utenti. Una buona strategia per le immagini rende il tuo sito veloce e nitido, indipendentemente dal dispositivo o dalla connessione di rete dell'utente.

Nel tuo toolkit è presente un altro elemento HTML che ti offre un maggiore controllo sulle tue immagini: l'elemento picture.

Mettiti alla prova

Metti alla prova le tue conoscenze sulle immagini.

Per adattare le immagini alla finestra, è necessario aggiungere gli stili.

Vero
Le immagini senza contenimento avranno le dimensioni naturali.
Falso
Gli stili sono obbligatori.

Quando l'altezza e la larghezza di un'immagine sono state forzate in proporzioni innaturali, quali stili possono aiutare a regolare l'adattamento dell'immagine a queste proporzioni?

object-fit
Specifica come si adatta l'immagine con parole chiave come contain e cover.
image-fit
Questa proprietà non esiste, l'ho inventata.
fit-image
Questa proprietà non esiste, l'ho inventata.
aspect-ratio
Ciò può causare o risolvere un rapporto di aspetto innaturale dell'immagine.

L'inserimento di height e width nelle immagini impedisce al CSS di applicare stili diversi.

Vero
Considerali più come suggerimenti che come regole.
Falso
CSS offre una vasta gamma di opzioni dinamiche per il dimensionamento delle immagini, anche se l'altezza e la larghezza sono incorporate nel tag.

L'attributo srcset non _______ l'attributo src, ma lo _______.

complemento, sostituisce
srcset non sostituisce assolutamente l'attributo src.
replace, complements
Fornisce al browser opzioni aggiuntive tra cui scegliere, se è in grado di farlo.

La mancanza di alt in un'immagine equivale a un alt vuoto.

Vero
Un attributo alt vuoto indica allo screen reader che questa immagine è di presentazione.
Falso
La mancanza di alt non indica nulla a uno screen reader.