AspectRatio
Proporção fixa — mantém uma caixa numa proporção fixa, como 16:9 ou 1:1, em qualquer largura. Use em vídeos, embeds, mapas e miniaturas, para o espaço ficar reservado antes de a mídia carregar e os cards de uma linha se alinharem.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o componente. Ele não tem estado, então renderiza no servidor.
import { AspectRatio } from "@camaleo/react";Anatomia
Uma caixa com position: relative e overflow escondido. Um img, video ou iframe filho direto ocupa a caixa toda; o resto você sobrepõe com position: absolute.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.
Módulo 2 · Aula 4
ratio={16 / 9}Escolha a proporção
Troque a proporção. ratio é a largura dividida pela altura, então escreva como fração: 16 / 9 para vídeo, 4 / 3 para fotos, 1 para quadrados, 3 / 4 para retratos.
cover ou contain
cover, o padrão, preenche a caixa e corta o que sobra. Use objectFit: "contain" na imagem quando todas as bordas importam, como num produto ou num logo.
Cards com fotos de qualquer formato
As três fotos são 16:9, 4:3 e 3:4. Cortadas na mesma proporção, os cards ficam da mesma altura e os títulos se alinham.
Grade de miniaturas
Miniaturas quadradas formam uma grade arrumada seja qual for a foto enviada. O object-position escolhe que parte da foto sobrevive ao corte.
Rua Augusta, 1200, São Paulo
Embeds precisam de title
Um iframe ocupa a caixa como uma imagem. Dê a ele um title que diga o que tem dentro: é o nome do frame para o leitor de tela.
Casa do Farol, Ilhabela. Esta linha não sai do lugar enquanto a foto carrega.
Espaço guardado durante o carregamento
Recarregue a foto. A caixa já tem altura antes de o arquivo chegar, então o texto de baixo não pula, e uma mensagem de status avisa quando a foto aparece.
Em contexto
Mídia quase nunca aparece sozinha. São pedaços inteiros de interface para copiar, no estilo que você escolheu.
Boas práticas
Fotos de qualquer formato ficam do mesmo tamanho, e os títulos se alinham.
A linha fica torta, e o olho segue os buracos em vez do conteúdo.
As bordas deles têm significado; mostre tudo, com um pouco de respiro.
O corte arranca o nome da marca, que é justamente o que importa.
Props
16 / 9 para vídeo, 4 / 3 para fotos, 1 para um quadrado.Todos os atributos de uma <div> passam adiante, como style e className. Defina a largura (ou deixe a grade do pai definir); a altura sempre segue a proporção.
Styling hooks
Mude o visual sem copiar o componente: use o slot ou defina a custom property no seu CSS.
Atributos
Tokens que ele lê
Só deste componente
/* vídeo mais largo em telas grandes, mais alto no celular */
.aula [data-slot="aspect-ratio"] {
--cml-aspect-ratio: 4 / 3;
}
@media (min-width: 48rem) {
.aula [data-slot="aspect-ratio"] {
--cml-aspect-ratio: 16 / 9;
}
}Acessibilidade
- A caixa não acrescenta role nem nome. O que vai dentro ainda precisa de um: alt em toda imagem com significado, alt="" na decoração.
- Todo iframe precisa de um title que diga o que ele mostra ("Mapa: Rua Augusta, 1200"); sem ele, o leitor de tela só anuncia "frame".
- Um botão de play sobre o pôster é um botão só com ícone: dê a ele um nome que inclua o título do vídeo.
- O corte do cover pode arrancar textos ou rostos. Não coloque informação nas bordas de uma imagem que pode ser cortada.