La proprietà CSS aspect-ratio
consente di creare riquadri che mantengono dimensioni proporzionali in cui i height
e width
di un riquadro vengono calcolati automaticamente come rapporto. È un po 'matematico, ma l'idea è che puoi dividere un valore per un altro su questa proprietà e il valore calcolato garantisce che una casella rimanga in quella proporzione.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
è definito nella specifica CSS Box Sizing Module Livello 4, attualmente in Working Draft. Ciò significa che è ancora in corso e ha una possibilità di cambiare. Ma con Chrome e Firefox che lo supportano dietro una bandiera sperimentale e Safari Technology Preview che aggiunge il supporto all'inizio del 2021, ci sono segnali forti che aspect-ratio
stanno guadagnando molto slancio.
Sintassi
aspect-ratio: auto || ;
In parole povere: aspect-ratio
si presume che sia auto
di default o accetta a come valore dove
.
- Valore iniziale:
auto
- Si applica a: tutti gli elementi tranne i riquadri in linea e i riquadri interni in rubino o tabella
- Ereditato: no
- Percentuali: n / a
- Valore calcolato: parola chiave specificata o coppia di numeri
- Tipo di animazione: discreta
Valori
/* Keyword values */ aspect-ratio: auto; /* default */ /* Ratio values */ aspect-ratio: 1 / 1; /* width and height are equal proportion */ aspect-ratio: 2 / 1; /* width is twice the height*/ aspect-ratio: 1 / 2; /* width is half the height */ aspect-ratio: 16 / 9 /* typical video aspect ratio */ /* Global values */ aspect-ratio: inherit; aspect-ratio: initial; aspect-ratio: unset;
Funziona su contenuti sostituiti e non sostituiti
Se stai pensando: "Uhm, sì, il browser non lo fa già per noi sulle immagini?" la risposta è: assolutamente . I browser eseguono calcoli elaborati sulle proporzioni sui contenuti sostituiti come le immagini. Quindi, se un'immagine ha, diciamo, una larghezza di 500 px, il browser flette i suoi algoritmi di layout CSS per mantenere le dimensioni intrinseche o "naturali" dell'immagine. La aspect-ratio
proprietà può essere utilizzata per ignorare efficacemente quelle dimensioni naturali.
Ma il contenuto non sostituito non ha una proporzione naturale. Questa è la maggior parte delle cose con cui lavoriamo, come i div. Piuttosto che cercare di mantenere le proporzioni naturali dell'elemento, aspect-ratio
imposta un dimensionamento "preferito".
Ora, la specifica attualmente rileva che le specifiche CSS precedenti, in particolare CSS 2.1, non contengono una chiara distinzione tra contenuto sostituito e non sostituito. Ciò significa che potremmo vedere alcuni casi speciali aggiuntivi aggiunti alle specifiche per chiarirli. Per il momento, stiamo vedendo i browser che implementano il supporto per l'impostazione delle proporzioni preferite su sostituiti e non sostituiti separatamente, dove alcuni dei browser con supporto iniziale dietro un flag sperimentale potrebbero supportare solo il aspect-ratio
contenuto non sostituito. Sicuramente vale la pena tenere d'occhio il supporto del browser man mano che si evolve.
Funziona da solo senza specificare un width
oheight
Quindi, sì, possiamo semplicemente rilasciarlo su un elemento come questo:
.element ( aspect-ratio: 16 / 9; )
... e il valore predefinito dell'elemento width: auto
interviene implicitamente per impostare le dimensioni dell'elemento.

Cambia quando width
o height
sono sullo stesso elemento
Supponiamo di avere un elemento con una larghezza di 300px
e una aspect-ratio
di 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
Per sua natura, aspect-ratio
vuole calcolare le dimensioni dell'elemento da solo e lo farà in base al contesto in cui viene utilizzato. Ma con quello width
inserito, dice alle proporzioni di calcolare il riquadro delle proporzioni dell'elemento usando 300px
come larghezza. Di conseguenza, è come se fossimo appena scritti:
.element ( height: 100px; width: 300px; )
Questo ha senso! Ricorda, quando no width
o height
sono specificati, il browser presume che siano auto
e va da lì. Quando forniamo valori espliciti width
e height
, questi sono ciò che viene utilizzato.
In alcune situazioni viene ignorato
È qui che le cose diventano un po 'complicate perché ci sono casi in cui aspect-ratio
viene trascurato o i suoi calcoli sono influenzati da altre proprietà. Quello include:
Quando entrambi width
e height
sono dichiarati sull'elemento
Abbiamo appena visto come la dichiarazione di o width
o height
su un elemento influenzerà il calcolo di aspect-ratio
. Ma se l'elemento ha già sia un width
che height
, questi vengono utilizzati invece di aspect-ratio
. Richiede l'override di entrambe le proprietà aspect-ratio
; l'impostazione height
o width
da sola non interromperà le proporzioni dell'elemento.

aspect-ratio
viene ignorato quando entrambi width
e height
sono impostati sullo stesso elemento.
Fa senes, giusto? Se si utilizza width
o si height
obbliga aspect-ratio
a utilizzare quel valore nel calcolo, ne consegue logicamente che l'utilizzo di entrambi sovrascriverà completamente del aspect-ratio
tutto poiché entrambi i valori sono già forniti e impostati.
Quando il contenuto supera il rapporto
In poche parole, se hai un elemento con proporzioni e il contenuto è così lungo da costringere l'elemento a espandersi, l'elemento si espanderà. E se l'elemento si espande, le sue dimensioni cambiano e, quindi, non più le proporzioni. Questo è il motivo per cui la specifica dice che la proprietà imposta le proporzioni "preferite". È preferito, ma non prescritto.
Non ti piace come funziona? L'impostazione min-height: 0;
dell'elemento consentirà al contenuto di superare le proporzioni preferite invece di espanderlo.

Quando "perde" a min-*
e max-*
proprietà
Abbiamo appena visto come funziona, giusto? Quando il contenuto supera le dimensioni della scatola, il contenuto aspect-ratio
è effettivamente sparito perché la scatola si espande con il contenuto. Possiamo ignorarlo con min-width: 0
.
Questo perché tutte le proprietà min-*
e max-*
tipicamente combattono width
e height
per la supremazia nella guerra sui calcoli del Box Model. Per esempio:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Ma:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
Questo perché min-width
o impedisce width
di andare al di sotto di un valore specifico, oppure viene ignorato perché width
ha già impostato l'elemento oltre la larghezza minima che deve essere. La stessa cosa vale per min-height
, max-width
e max-height
.
Il punto di tutto questo: se impostiamo sia una proprietà min-*
o max-*
sullo stesso elemento di aspect-ratio
e loro "vincono" su width
o height
, allora quelle avranno la precedenza aspect-ratio
. Te l'avevo detto che era un po 'sconvolgente. ?
Supporto del browser
IE | Bordo | Firefox | Cromo | Safari | musica lirica |
---|---|---|---|---|---|
No | No | 86 1.2,3 | 90 4 | TP 5 | No |
Android Chrome | Android Firefox | Browser Android | iOS Safari | Opera Mobile |
---|---|---|---|---|
No | No | No | No | No |
1 Può essere abilitato impostando
layout.css.aspect-ratio.enabled
su true
.2 Supporto per blocchi ed elementi sostituiti introdotto in Firefox 81.
3 Supporto per elementi flessibili introdotto in Firefox 83.
4 Può essere abilitato impostando
#enable-experimental-web-platform-features
su Abilitato.5 Disponibile in Safari Technology Preview 118.
Maggiori informazioni
Articolo del 1 luglio 2020Un primo sguardo alle "proporzioni"












