Container Queries: Responsividade Baseada no Componente

Com @container, elementos podem se adaptar ao tamanho do próprio container em vez de depender apenas da viewport, tornando componentes verdadeiramente reutilizáveis em qualquer layout.

Media queries sempre estilizaram elementos com base no tamanho da viewport, o que é um problema quando um componente precisa se adaptar ao espaço do seu container, não da tela inteira. As Container Queries resolvem isso: com @container, um elemento pode reagir ao tamanho do próprio pai, tornando componentes verdadeiramente reutilizáveis em qualquer layout.

Como funciona?

O processo tem duas partes: primeiro, um elemento precisa ser declarado como container com container-type. Depois, os filhos podem ser estilizados condicionalmente com @container:

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

@container card (min-width: 400px) {
    .card {
        display: flex;
        gap: 16px;
    }
}

Aqui, o .card muda para layout em linha somente quando o .card-wrapper que o contém tem pelo menos 400px de largura — independente do tamanho da janela do navegador.

Exemplo prático: card responsivo por container

.sidebar {
    container-type: inline-size;
}

.main {
    container-type: inline-size;
}

@container (min-width: 500px) {
    .produto {
        grid-template-columns: 120px 1fr;
    }
}

O mesmo componente .produto pode aparecer dentro da .sidebar (estreita, layout empilhado) ou da .main (larga, layout em grid), e vai se adaptar automaticamente ao espaço disponível em cada lugar, sem precisar de classes diferentes para cada contexto.

Container query units

Além do @container, o CSS ganhou unidades relativas ao container, como cqw, cqh, cqi e cqb, equivalentes às unidades de viewport, mas relativas ao container mais próximo:

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

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

Assim, o tamanho da fonte do título escala com a largura do container, e não da tela inteira.

Nomeando containers

Quando há containers aninhados, o container-name evita ambiguidade sobre a qual container a query se refere:

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

@container layout (min-width: 800px) {
    .grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

Quando usar

Cuidados

Um elemento não pode fazer @container em si mesmo — a query sempre olha para um container ancestral, então é comum precisar de um elemento "wrapper" extra só para declarar container-type. Além disso, definir container-type: inline-size cria um novo contexto de formatação no elemento, o que pode afetar como margin colapsa dentro dele.

Compatibilidade

O suporte a container queries de tamanho já é excelente em todos os navegadores modernos (Chrome, Edge, Firefox e Safari), o que torna seguro usar em produção na maioria dos projetos atuais.

caniuse

Conclusão

As Container Queries completam um espaço que faltava no CSS responsivo: estilizar com base no contexto real do componente, e não só no tamanho da tela. Isso torna possível criar componentes genuinamente reutilizáveis, que se adaptam sozinhos a qualquer lugar onde forem colocados.

Tecnologia:
css

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.