Quante volte vi è capitato di dover realizzare un mockup responsive e mantenere l’aspect ratio per le immagini sembrava una cosa alquanto ostica? Finalmente è disponibile la soluzione!
Ebbene sì, le proporzioni, ovvero il rapporto esistente tra le due dimensioni larghezza e lunghezza (x:y), principalmente di immagini e video, sono per chi si occupa di frontend, da sempre una questione spinosa.
Nel tempo sono state sperimentate diverse soluzioni per questo problema, come ad esempio l’utilizzo del padding come hack o altri metodi esposti qui su CSS Tricks. Ad oggi, però, abbiamo la fortuna di poter seguire una nuova strada, usando la proprietà css aspect-ratio, introdotta dalla specifica CSS Sizing 4.
Con la proprietà CSS aspect-ratio, il mantenimento delle proporzioni corrette dei contenuti multimediali e di layout diventa un po' più semplice.
Vediamo come funziona questa proprietà e come si usa.
Le caratteristiche di default:
/* Valori di default */
aspect-ratio: auto; /* default */
/* Valori della ratio */
aspect-ratio: 1 / 1; /* larghezza e altezza sono uguali */
aspect-ratio: 2 / 1; /* la larghezza è due volte l’altezza*/
aspect-ratio: 1 / 2; /* l’altezza è due volte la larghezza */
aspect-ratio: 16 / 9 /* Proporzioni standard per un video */
aspect-ratio: auto 4 / 3; /* larghezza:altezza, a meno che un elemento non venga sostituito */
/* Valori Globali */
aspect-ratio: inherit;
aspect-ratio: initial;
aspect-ratio: unset;
auto | <ratio>
<auto>: il valore predefinito, specifica che l'elemento non ha proporzioni definite e dovrebbe ridimensionarsi come farebbe normalmente.
<ratio>: il rapporto preferito viene specificato da due valori numerici positivi separati da una barra (/) con o senza spazio intorno, che agiscono sulla larghezza e sull'altezza dell'elemento. Nel caso venga specificato un solo valore, il secondo viene considerato uguale a 1. Le proporzioni preferite vengono applicate al contenitore per il quale è stato specificato il box-sizing.
Quello che prima veniva fatto con il padding-top hack adesso diviene più semplice con l’aspect-ratio.
L'uso di aspect-ratio invece di padding-top è molto più chiaro e non modifica la proprietà padding per forzare un comportamento innaturale.
Se vengono specificati insieme sia <auto> che <ratio>, la aspect-ratio preferita equivale al rapporto specificato tra la larghezza diviso l’altezza, a meno che non si tratti di un elemento sostituito con una aspect ratio intrinseca, nel qual caso viene utilizzato quella ratio.
Ecco alcuni esempi in cui la proprietà aspect-ratio diventa particolarmente utile.
Un caso d'uso molto comune è quando si vuole incorporare un iframe per visualizzare un video da un sito esterno come YouTube. In questo caso, se impostiamo la larghezza al 100% e l'altezza come misura predefinita, il video verrà deformato.
Per avere un iframe reattivo che mantenga le sue proporzioni possiamo impostare quanto segue:
iframe { aspect-ratio: 16 / 9; width: 100%; height: auto; }
Se l'iframe ha attributi di larghezza ed altezza impostati in questo modo:
<iframe width="800" height="600" src="https://example.com"></iframe>
possiamo impostare automaticamente le proporzioni così:
img { width: 100%; aspect-ratio:8/6; }
L'impostazione di un'immagine di background su un elemento non ha alcun effetto sulla dimensione di quell'elemento. Quindi, per creare un'immagine hero, se l'immagine è di background, è necessario impostare un'altezza, cosa che crea molti problemi nel responsive.
La proprietà aspect-ratio ci viene in aiuto per ottenere un hero che conservi le proporzioni della sua immagine di background:
.hero { aspect-ratio: 4 / 3; background: url(background.png); }
Immaginiamo, in un flexbox o in un layout a griglia con meccanismo di riempimento automatico, di poter volere che gli elementi rimangano quadrati, ma la larghezza e l'altezza degli elementi debbano poter ridursi o crescere in base al loro contenuto o alle dimensioni dei genitori e, di conseguenza, è molto probabile che gli elementi non non restino quadrati.
L'impostazione delle proporzioni su 1/1 modifica l'altezza in modo dinamico, mentre la larghezza dell'elemento si ridimensiona:
.grid-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); } .grid-item { aspect-ratio: 1 / 1; }
e ancora, l’aspect-ratio ci viene in aiuto nel:
Ma ci sono anche situazioni in cui l’aspect-ratio non funziona, in quanto sovrascritto da altre proprietà o ignorate.
Ad esempio:
Come si può verificare sul portale caniuse.com ci sono alcuni browser che non interpretano questa proprietà css.
Con i browser più vecchi, però, si può optare per la tecnica del padding, aggiungendo agli pseudo elementi il CSS @supports. Ad esempio:
.element { aspect-ratio: 1 / 1; } @supports not (aspect-ratio: 1 / 1) { .element::before { float: left; padding-top: 100%; content: ""; } .element::after { display: block; content: ""; clear: both; } }