Nuova proprietà CSS delle proporzioni supportata in Chromium, Safari Technology Preview e Firefox Nightly

La nuova proprietà CSS che consente di mantenere la spaziatura nei layout adattabili.

Proporzioni

Supporto dei browser

  • Chrome: 88.
  • Edge: 88.
  • Firefox: 89.
  • Safari: 15.

Origine

Le proporzioni vengono generalmente espresse sotto forma di due numeri interi e due punti nelle dimensioni: width:height o x:y. I formati più comuni per la fotografia sono 4:3 e 3:2, mentre per i video e più recenti, tendono ad avere proporzioni pari a 16:9.

Due immagini con le stesse proporzioni. Uno è 634 x 951 px mentre l'altro è 200 x 300 px. Entrambi hanno proporzioni 2:3.
Due immagini con le stesse proporzioni. Uno è 634 x 951 px mentre l'altro è 200 x 300 px. Entrambi hanno proporzioni 2:3.

Con l'avvento del responsive design, il mantenimento delle proporzioni è stato sempre più importante per sviluppatori web, soprattutto se le dimensioni delle immagini sono diverse e le dimensioni degli elementi variano in base alla disponibilità spazio.

Ecco alcuni esempi di casi in cui il mantenimento delle proporzioni diventa importante:

  • Creazione di iframe adattabili, che corrispondono al 100% della larghezza di un file principale, e l'altezza deve rimanere invariata. un rapporto di area visibile specifico
  • Creare contenitori segnaposto intrinseci per immagini, video e incorporamenti per impedire il relayout quando gli elementi vengono caricati e occupano spazio
  • Creare uno spazio uniforme e reattivo per visualizzazioni di dati interattive o animazioni SVG
  • Creare uno spazio uniforme e adattabile per i componenti multi-elemento, come le schede o le date del calendario.
  • Creare uno spazio uniforme e adattabile per più immagini di dimensioni diverse (utilizzabile insieme a object-fit

Adattamento agli oggetti

La definizione di proporzioni ci aiuta a dimensionare i contenuti multimediali in un contesto reattivo. Un altro strumento bucket è la proprietà object-fit, che consente agli utenti di descrivere in che modo un oggetto (ad esempio un'immagine) all'interno di un blocco dovrebbero occuparlo:

Visualizzazione demo adatta all'oggetto
Visualizzazione di vari valori object-fit. Guarda la demo su Codepen.

I valori initial e fill regolano nuovamente l'immagine per riempire lo spazio. Nel nostro esempio, questo fa sì che perché l'immagine sia schiacciata e sfocata, adeguando nuovamente i pixel. Non ideale. object-fit: cover usi la dimensione più piccola dell'immagine per riempire lo spazio e ritaglia l'immagine per adattarla in base a questo . "Aumenta lo zoom" al limite più basso. object-fit: contain assicura che l'intera immagine è sempre visibile, quindi, al contrario di cover, che prende la dimensione del confine più grande (nel nostro esempio precedente è la larghezza) e l'immagine viene ridimensionata per mantenere le proporzioni intrinseche e si adattano allo spazio. La custodia object-fit: none mostra l'immagine ritagliata al centro (posizione predefinita dell'oggetto) in base alle dimensioni naturali.

object-fit: cover tende a funzionare nella maggior parte delle situazioni per garantire un'interfaccia uniforme e piacevole con immagini di dimensioni diverse, ma in questo modo si perdono informazioni (l'immagine viene ritagliata in i suoi lati più lunghi).

Se questi dettagli sono importanti (ad es. quando si lavora con una stesura di prodotti di bellezza), ritagliare contenuti importanti non è accettabile. Lo scenario ideale sarebbe, quindi, immagini reattive dimensioni diverse che si adattano allo spazio dell'interfaccia utente senza ritagliarle.

Il vecchio compromesso: mantenere le proporzioni con padding-top

Utilizzo della spaziatura interna superiore per impostare proporzioni 1:1 per le immagini del post-anteprima all'interno di un carosello.
Utilizzo di padding-top per impostare proporzioni 1:1 per le immagini di anteprima del post all'interno di un carosello.

Per renderli più reattivi, possiamo usare le proporzioni. Questo ci consente di impostare proporzioni specifiche e basare il resto dei contenuti multimediali su un singolo asse (altezza o larghezza).

Una soluzione cross-browser attualmente accettata per mantenere le proporzioni in base al formato è nota come "Padding-Top Hack". Questa soluzione richiede un container padre e container secondario posizionato in modo forzato. Si potrebbe quindi calcolare le proporzioni come percentuale da impostare come padding-top. Ad esempio:

  • Proporzioni 1:1 = 1 / 1 = 1 = padding-top: 100%
  • Proporzioni 4:3 = 3 / 4 = 0,75 = padding-top: 75%
  • Proporzioni 3:2 = 2 / 3 = 0,66666 = padding-top: 66.67%
  • Proporzioni 16:9 = 9 / 16 = 0,5625 = padding-top: 56.25%

Ora che abbiamo identificato il valore delle proporzioni, possiamo applicarlo al contenitore principale. Considera l'esempio seguente:

<div class="container">
  <img class="media" src="..." alt="...">
</div>

Potremmo quindi scrivere il seguente CSS:

.container {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* 16:9 Aspect Ratio */
}

.media {
  position: absolute;
  top: 0;
}

Mantenimento delle proporzioni con aspect-ratio

Utilizzo delle proporzioni per impostare proporzioni 1:1 per le immagini post-anteprima all&#39;interno di un carosello.
Utilizzo di aspect-ratio per impostare proporzioni 1:1 per le immagini post-anteprima all'interno di un carosello.

Purtroppo, il calcolo di questi valori di padding-top non è molto intuitivo e richiede alcune overhead e posizionamento aggiuntivi. Con il nuovo CSS intrinseco di aspect-ratio proprietà, la lingua per mantenere rapporti è molto più chiaro.

Con lo stesso markup, possiamo sostituire padding-top: 56.25% con aspect-ratio: 16 / 9, impostando aspect-ratio a un rapporto specificato di width / height.

Utilizzo della spaziatura interna in alto
.container {
  width: 100%;
  padding-top: 56.25%;
}
Utilizzo delle proporzioni
.container {
  width: 100%;
  aspect-ratio: 16 / 9;
}

L'utilizzo di aspect-ratio anziché di padding-top è molto più chiaro e non aggiorna la spaziatura interna eseguire operazioni che non rientrano nell'ambito abituale.

Questa nuova proprietà consente inoltre di imposta le proporzioni su auto, dove "gli elementi sostituiti con proporzioni intrinseche usano quel formato proporzione; altrimenti la casella non ha proporzioni preferite". Se auto e <ratio> sono entrambi sono specificati insieme, le proporzioni preferite sono quelle specificate di width diviso per height, a meno che si tratta di un elemento sostituito con proporzioni intrinseche, nel qual caso vengono utilizzate quelle proporzioni.

Esempio: coerenza in una griglia

Funziona molto bene anche con meccanismi di layout CSS come CSS Grid e Flexbox. Valuta un elenco con bambini e ragazzi che vuoi mantenere le proporzioni 1:1, ad esempio una griglia di icone degli sponsor:

<ul class="sponsor-grid">
  <li class="sponsor">
    <img src="..." alt="..."/>
  </li>
  <li class="sponsor">
    <img src="..." alt="..."/>
  </li>
</ul>
.sponsor-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
}

.sponsor img {
  aspect-ratio: 1 / 1;
  width: 100%;
  object-fit: contain;
}
Immagini in una griglia con l'elemento principale in varie dimensioni di proporzioni. Guarda la demo su Codepen.

Esempio: impedire la variazione del layout

Un'altra fantastica funzionalità di aspect-ratio è che può creare uno spazio segnaposto per evitare Cumulative Layout Shift e offrire Web Vitals migliori. In questo primo Ad esempio, il caricamento di una risorsa da un'API come Unsplash crea un variazione del layout al termine del caricamento dell'elemento multimediale.

Video della variazione cumulativa del layout che si verifica quando non sono impostate proporzioni su un asset caricato. Questo video viene registrato con una rete 3G emulata.

L'utilizzo di aspect-ratio, invece, crea un segnaposto per evitare questa variazione del layout:

img {
  width: 100%;
  aspect-ratio: 8 / 6;
}
Un video con proporzioni impostate è impostato su un asset caricato. Questo video viene registrato con una rete 3G emulata. Guarda la demo su Codepen.

Suggerimento extra: attributi delle immagini per le proporzioni

Un altro modo per impostare le proporzioni di un'immagine è tramite gli attributi dell'immagine. Se conosci le dimensioni dell'immagine in anticipo, è una best practice imposta queste dimensioni come width e height.

Per l'esempio precedente, sapendo che le dimensioni sono 800 x 600 px, il markup dell'immagine sarebbe: <img src="image.jpg" alt="..." width="800" height="600">. Se l'immagine inviata ha lo stesso aspetto ma non necessariamente questi esatti valori di pixel, potremmo comunque utilizzare valori degli attributi per impostare il rapporto, combinato con uno stile di width: 100% in modo che l'immagine occupi lo spazio adeguato. L'insieme sarebbe simile a questo:

<!-- Markup -->
<img src="image.jpg" alt="..." width="8" height="6">
/* CSS */
img {
  width: 100%;
}

Alla fine, l'effetto è lo stesso dell'impostazione di aspect-ratio sulla dell'immagine tramite CSS ed evita la variazione cumulativa del layout (vedi demo su Codepen).

Conclusione

Con la nuova proprietà CSS aspect-ratio, lanciata su più browser moderni, mantenendo la corretta le proporzioni nei contenitori di contenuti multimediali e layout diventano un po' più semplici.

Foto di Amy Shamblen e Lionel Gustave tramite Unsplash.