</> HTML5Advent
ENFRESDEITPT

// css · Web Platform Advent #8

CSS Container Queries: estilizar componentes pelo seu contêiner, não pela viewport

container-type, @container e container-name explicados. Como as container queries diferem das media queries e por que tornam os componentes verdadeiramente reutilizáveis.

Ícones planos de um monitor de desktop, um tablet, um laptop e um telefone de tamanhos diferentes

As container queries permitem que um elemento responda ao tamanho do seu contêiner pai em vez do tamanho de toda a viewport. É a peça que faltava para finalmente tornar um componente reutilizável: o mesmo cartão pode se dispor de uma forma numa barra lateral estreita e de outra numa coluna principal larga — na mesma página, na mesma largura de tela.

Por que as media queries não bastavam

Uma media query faz apenas uma pergunta: qual é a largura da viewport? Mas um componente não sabe qual é a largura da viewport — ele sabe quanto espaço lhe foi dado. Um cartão colocado numa barra lateral de 300px e o mesmo cartão numa célula de grade de 900px precisam de layouts diferentes, mas a largura da viewport é idêntica. As container queries resolvem exatamente isso.

Passo 1: declarar um contexto de contenção

Você consulta um contêiner, então primeiro precisa marcar um elemento como contêiner com container-type:

.card-wrapper {
  container-type: inline-size;
}

inline-size significa "deixe-me consultar a dimensão inline (geralmente horizontal)" — a escolha mais comum. size consulta ambas as dimensões e normal desliga a contenção.

Passo 2: consultá-lo com @container

Agora qualquer descendente de .card-wrapper pode se adaptar com base na largura do wrapper:

.card {
  display: grid;
  gap: 1rem;
}

@container (min-width: 400px) {
  .card {
    grid-template-columns: 150px 1fr;
  }
}

Quando o wrapper tem pelo menos 400px de largura, o cartão muda para um layout de duas colunas. Coloque essa mesma marcação em qualquer lugar da página e ela se adapta ao local onde cai — sem necessidade de media queries no nível da página.

A smartphone resting on top of a tablet and a laptop, three screens of different sizes
O mesmo componente muitas vezes precisa caber em quantidades de espaço muito diferentes. As container queries permitem que ele se adapte ao seu espaço em vez de ao dispositivo.

Nomear contêineres

Quando os contêineres estão aninhados, dê-lhes nomes com container-name para que uma query atinja o correto:

.layout { container: layout / inline-size; } /* name / type shorthand */

@container layout (min-width: 600px) {
  .card { /* responds to .layout, not a closer container */ }
}

Unidades de container query

As container queries também desbloqueiam unidades relativas ao contêiner em vez da viewport: cqw (1% da largura do contêiner), cqh, cqi (inline) e cqb (block). A tipografia fluida que escala com o seu contêiner vira uma única linha:

.card h2 {
  font-size: clamp(1rem, 5cqi, 2rem);
}

Container queries vs media queries

Media queryContainer query
MedeViewport / dispositivoAncestral dimensionado mais próximo
Configuração necessáriaNenhumacontainer-type num pai
Melhor paraLayout no nível da páginaComponentes reutilizáveis
Unidadesvw, vhcqw, cqi, ...

Suporte dos navegadores

As size container queries são suportadas em Chrome, Edge, Firefox e Safari atuais. Elas não substituem as media queries — use media queries para a estrutura geral da página e container queries para componentes que precisam ser portáveis. As duas funcionam bem juntas.

A mudança mental é pequena, mas poderosa: pare de perguntar "qual é o tamanho da tela?" e comece a perguntar "quanto espaço este componente tem?". Essa única mudança é o que torna os componentes de um design system verdadeiramente encaixáveis em qualquer lugar.