A propriedade CSS aspect-ratio
permite criar caixas que mantêm dimensões proporcionais onde o height
e width
de uma caixa são calculados automaticamente como uma proporção. É um pouco matemático, mas a ideia é que você pode dividir um valor por outro nesta propriedade e o valor calculado garante que a caixa permaneça nessa proporção.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
é definido na especificação CSS Box Sizing Module Nível 4, que está atualmente em Working Draft. Isso significa que ainda está em andamento e tem chance de alteração. Mas com o Chrome e o Firefox suportando-o por trás de uma bandeira experimental e o Safari Technology Preview adicionando suporte para ele no início de 2021, há fortes sinais de que aspect-ratio
está ganhando muito impulso.
Sintaxe
aspect-ratio: auto || ;
Em inglês simples: aspect-ratio
é assumido como auto
padrão ou aceita a como um valor where
.
- Valor inicial:
auto
- Aplica-se a: todos os elementos, exceto caixas embutidas e rubi interno ou caixas de mesa
- Herdado: não
- Porcentagens: n / a
- Valor calculado: palavra-chave especificada ou um par de números
- Tipo de animação: discreto
Valores
/* 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;
Funciona com conteúdo substituído e não substituído
Se você está pensando, “Uhm, sim, o navegador já não faz isso para nós nas imagens?” a resposta é: absolutamente . Os navegadores fazem alguns cálculos de proporção de aspecto em conteúdo substituído, como imagens. Portanto, se uma imagem tem, digamos, uma largura de 500px, o navegador flexiona seus algoritmos de layout CSS para manter as dimensões intrínsecas ou “naturais” da imagem. A aspect-ratio
propriedade pode ser usada para substituir efetivamente essas dimensões naturais.
Mas o conteúdo não substituído não tem uma proporção natural. Essa é a maioria das coisas com que trabalhamos, como divs. Em vez de tentar manter as proporções naturais do elemento, aspect-ratio
define um dimensionamento “preferido”.
Agora, a especificação atualmente observa que especificações CSS mais antigas, notavelmente CSS 2.1, não contêm uma distinção clara entre conteúdo substituído e não substituído. Isso significa que podemos ver alguns casos especiais adicionais adicionados à especificação para ajudar a esclarecê-los. Por enquanto, estamos vendo navegadores lançando suporte para definir proporções preferenciais em substituídos e não substituídos separadamente, onde alguns dos navegadores com suporte inicial por trás de um sinalizador experimental podem oferecer suporte apenas aspect-ratio
para conteúdo não substituído. Definitivamente, vale a pena ficar de olho no suporte do navegador conforme ele evolui.
Funciona sozinho, sem especificar um width
ouheight
Então, sim, podemos simplesmente soltá-lo em um elemento como este:
.element ( aspect-ratio: 16 / 9; )
… E o padrão do elemento é width: auto
ativado implicitamente para definir as dimensões do elemento.
Ele muda quando width
ou height
estão no mesmo elemento
Digamos que temos um elemento com largura de 300px
e aspect-ratio
de 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
Por natureza, aspect-ratio
deseja calcular as dimensões do elemento por conta própria e fará isso com base no contexto em que é usado. Mas com isso width
inserido, ele informa a proporção de aspecto para calcular a caixa de proporção de aspecto do elemento usando 300px
como largura. Como resultado, é como se tivéssemos escrito:
.element ( height: 100px; width: 300px; )
Isso faz sentido! Lembre-se, quando nenhum width
ou height
é especificado, o navegador assume que sim auto
e parte daí. Quando fornecemos valores width
e explícitos height
, eles são usados.
É ignorado em algumas situações
É aqui que as coisas ficam um pouco confusas porque há casos em que aspect-ratio
é negligenciado ou seus cálculos são afetados por outras propriedades. Isso inclui:
Quando ambos width
e height
são declarados no elemento
Acabamos de ver como declarar width
ou height
em um elemento afetará o cálculo de aspect-ratio
. Mas se o elemento já tiver um width
e height
, eles serão usados no lugar de aspect-ratio
. Requer que ambas as propriedades sejam substituídas aspect-ratio
; definir um height
ou outro width
sozinho não quebrará a proporção do elemento.
Faz senes, certo? Se o uso de width
ou height
força o aspect-ratio
a usar esse valor no cálculo, segue-se logicamente que o uso de ambos sobrescreveria aspect-ratio
completamente, uma vez que ambos os valores já foram fornecidos e definidos.
Quando o conteúdo sai da proporção
Simplificando, se você tiver um elemento com uma proporção de aspecto e o conteúdo for tão longo que force a expansão do elemento, o elemento se expandirá. E se o elemento se expande, suas dimensões mudam e, portanto, não há mais proporção. É por isso que a especificação diz que a propriedade define a proporção de aspecto “preferida”. É preferível, mas não prescrito.
Não gosta de como isso funciona? Definir min-height: 0;
o elemento permitirá que o conteúdo ultrapasse a proporção de aspecto preferida em vez de expandi-la.
Quando "perde" para propriedades min-*
emax-*
Nós meio que vimos como isso funciona, certo? Quando o conteúdo excede as dimensões da caixa, o aspect-ratio
desaparece efetivamente porque a caixa se expande com o conteúdo. Podemos substituir isso com min-width: 0
.
Isso porque todo o min-*
e max-*
propriedades normalmente batalha width
e height
pela supremacia na guerra sobre cálculos Box modelo. Por exemplo:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Mas:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
Isso porque min-width
está impedindo width
de ir abaixo de um valor específico ou é ignorado porque o width
já configurou o elemento além da largura mínima que ele precisa ter. A mesma coisa vale para min-height
, max-width
, e max-height
.
O ponto de tudo isso: se definirmos a propriedade min-*
ou max-*
no mesmo elemento que aspect-ratio
e eles “ganharem” width
ou height
, então esses serão substituídos aspect-ratio
. Disse que era um pouco confuso. ?
Suporte de navegador
IE | Beira | Raposa de fogo | cromada | Safári | Ópera |
---|---|---|---|---|---|
Não | Não | 86 1.2,3 | 90 4 | TP 5 | Não |
Android Chrome | Android Firefox | Navegador Android | iOS Safari | Opera Mobile |
---|---|---|---|---|
Não | Não | Não | Não | Não |
1 Pode ser habilitado configurando
layout.css.aspect-ratio.enabled
para true
.2 Suporte para blocos e elementos substituídos introduzidos no Firefox 81.
3 Suporte para flex items introduzidos no Firefox 83.
4 Pode ser habilitado configurando
#enable-experimental-web-platform-features
para Enabled.5 Disponível no Safari Technology Preview 118.