Layout responsivo para todos os dispositivos: o guia básico sobre Media Query
A media query é o recurso do CSS que permite adaptar o visual de uma página ao tamanho da tela, por isso ela está no centro de qualquer layout responsivo. Afinal, como ter certeza de que a página funciona corretamente em todos os dispositivos?
Essa é a pergunta do milhão, porque sem os recursos certos dificilmente conseguimos respondê-la. Hoje os dispositivos móveis, como o smartphone, dominam o acesso à informação na internet.
Por isso, criar páginas acessíveis em qualquer dispositivo deixou de ser uma opção e passou a ser uma obrigação. Neste guia, você vai entender o básico necessário para usar media query no dia a dia e construir layouts que funcionam em telas pequenas e grandes.
Entendendo o design responsivo
Em resumo, design web responsivo é a forma de usar HTML e CSS para criar uma página ou aplicação que funciona bem em qualquer dispositivo. Dessa forma, o tamanho da tela de cada aparelho deixa de ser um obstáculo.
Todos os elementos da tela, como botões, imagens e funcionalidades, precisam aparecer e funcionar tanto em monitores enormes quanto em telas de smartphone. Em outras palavras, o conteúdo se adapta ao espaço disponível, e não o contrário.
Esse é o pensamento de responsividade que todo desenvolvedor de software deve ter ao criar qualquer página web. Se quiser se aprofundar nessa mentalidade, o artigo Pense de forma responsiva complementa bem este guia.
Além da media query, existem outras técnicas que ajudam no desenvolvimento de páginas responsivas:
- Usar unidades relativas em vez de absolutas, por exemplo
%ouremno lugar depx. - Configurar corretamente o viewport e a escala da página.
- Aplicar recursos de acessibilidade em toda a interface.
No entanto, neste artigo o foco fica na media query, porque ela é a melhor porta de entrada para quem está começando. Depois de dominá-la, as demais técnicas ficam muito mais fáceis de combinar.
O que é media query
A media query é um recurso do CSS que chegou junto com o CSS3. Com ela, o desenvolvedor pode modificar o comportamento da página de acordo com as características da tela, como largura (width) e altura (height).
Ou seja, diante de tamanhos de tela diferentes, a página assume comportamentos diferentes. O mesmo HTML ganha um layout em uma coluna no celular e em várias colunas no desktop, por exemplo.
Na prática, a media query funciona como uma espécie de framework embutido no próprio CSS. Assim, você escreve as regras uma única vez e as reaproveita em toda a aplicação.
Em uma página isolada talvez a diferença não pareça tão grande. Contudo, quando você trabalha em uma aplicação com dezenas de páginas, a organização que a media query traz faz uma diferença enorme.
Isso acontece porque, ao planejar cada media query, você considera mais do que largura e altura. Também entram na conta a estrutura da página, a localização dos elementos, os links, as posições e a hierarquia do conteúdo.
Por que a media query é essencial hoje
Uma página que ignora a tela do visitante obriga o usuário a dar zoom, rolar para os lados e caçar botões minúsculos. Consequentemente, a experiência piora e muita gente simplesmente desiste da visita.
Com uma media query bem escrita, o mesmo conteúdo se reorganiza sozinho. Além disso, você mantém um único código, em vez de criar uma versão separada do site para cada tipo de aparelho.
A estrutura da media query
A estrutura padrão de uma media query segue o formato abaixo. Ela reúne os elementos que permitem mudar o comportamento dos componentes de forma controlada.
@media media-type and (expression) {
/* código CSS aplicado quando a condição for verdadeira */
}
Vamos analisar cada parte com calma, porque entender a sintaxe evita boa parte dos erros de quem está começando.
A palavra-chave @media
O @media é a palavra-chave que abre o bloco. É por meio dela que o navegador identifica que, a partir dali, existe uma regra condicional de estilo.
Sem essa palavra-chave não há media query no CSS. Portanto, todo bloco condicional desse tipo começa obrigatoriamente com @media.
O tipo de mídia
O media-type define para qual tipo de mídia o comportamento vale. Os tipos atuais são screen, print e all.
O screen atende telas, o print atende a impressão e a visualização de impressão, enquanto o all atende qualquer dispositivo. Na época do CSS3 também existiam tipos como handheld, mas a especificação mais recente os descontinuou, então eles não devem mais ser usados.
O tipo de mídia é opcional. Quando você o omite, o navegador considera all como padrão.
A expressão
A expression é a condição que dispara o novo comportamento, por exemplo max-width: 400px. Sempre que a tela atender à condição, o navegador aplica as regras do bloco.
Cada expressão fica entre parênteses e testa uma característica da mídia, chamada de media feature. As mais usadas são min-width e max-width, mas também existem orientation, hover e várias outras.
Exemplo prático de media query
Veja um exemplo simples que altera a cor de fundo do body em telas estreitas:
@media screen and (max-width: 450px) {
body {
background-color: #004aad;
}
}
Nesse caso, sempre que a largura da tela for de no máximo 450px, a nova cor de fundo entra em ação. Em telas maiores, o navegador ignora o bloco e mantém o estilo original.
Também é possível escrever a mesma media query sem especificar o tipo de mídia. Assim, a regra vale para todas as mídias que atendem à expressão:
@media (max-width: 450px) {
body {
background-color: #004aad;
}
}
Repare que, sem o tipo de mídia, o and também sai da declaração. Escrever @media and (max-width: 450px) é um erro comum, porque o and precisa unir duas partes e, nesse caso, só existe uma.
Combinando condições
Uma media query pode combinar várias condições com o operador and. Por exemplo, o bloco abaixo só vale para telas entre 451px e 800px de largura:
@media (min-width: 451px) and (max-width: 800px) {
.container {
display: flex;
flex-direction: column;
}
}
Além do and, a vírgula funciona como um "ou" entre consultas, enquanto o not inverte o resultado. Por isso, com poucos operadores você descreve praticamente qualquer cenário de tela.
Os navegadores modernos ainda aceitam a sintaxe de intervalo, como (451px <= width <= 800px), que tem a mesma função de forma mais legível. Contudo, a forma com min-width e max-width continua sendo a mais encontrada em projetos e tutoriais.
Mobile first ou desktop first
Existem duas estratégias clássicas para organizar as regras. No desktop first, você escreve o layout para telas grandes e usa max-width para ajustar as menores.
Já no mobile first, o estilo base atende o celular e cada media query com min-width acrescenta ajustes para telas maiores. Essa abordagem costuma gerar menos código, porque o layout mais simples fica como ponto de partida.
Na prática, escolha uma das estratégias e mantenha a consistência no projeto. Misturar as duas sem critério deixa as regras difíceis de entender e de manter.
Em que lugar escrever a media query
Como a media query serve para alterar comportamentos de CSS, ela sempre fica no lugar onde os estilos da página estão definidos. Basicamente, existem três formas de declarar o CSS em uma página.
CSS externo
O CSS externo é, com certeza, o melhor caminho. Você cria um arquivo .css separado e apenas o referencia dentro do HTML, o que deixa o projeto muito mais organizado e limpo.
<link rel="stylesheet" href="styles.css" />
Nesse modelo, toda media query fica dentro do arquivo de estilos, junto das regras que ela ajusta. Assim, a manutenção acontece em um único lugar.
CSS interno
Também é possível escrever o CSS dentro do próprio HTML, usando a tag <style> no <head> da página. Ali você declara as classes, os ids e, claro, os blocos @media.
<head>
<style>
@media (max-width: 450px) {
body { background-color: #004aad; }
}
</style>
</head>
Essa forma é útil em páginas pequenas ou protótipos. Porém, conforme o projeto cresce, o HTML fica pesado e difícil de ler.
CSS inline
O CSS inline é aplicado diretamente em uma tag, como uma <div>, por meio do atributo style. Basta escrever style="..." com as propriedades desejadas.
Aqui existe uma limitação importante: o atributo style não aceita blocos @media. Portanto, se você precisa de responsividade, use o CSS externo ou o interno.
De modo geral, a forma de vincular o CSS ao HTML não muda o funcionamento da regra. Desde que ela esteja em uma folha de estilos, externa ou interna, o navegador a avalia normalmente.
Media query no atributo media do link
Existe ainda uma alternativa para quem não quer escrever a media query dentro do arquivo CSS. Nesse caso, a condição vai direto no atributo media da tag <link> do HTML.
<link
rel="stylesheet"
media="(max-width: 800px) and (min-width: 451px)"
href="tablet.css" />
<link rel="stylesheet" media="(max-width: 450px)" href="smartphone.css" />
Dessa forma, toda a lógica de escolha fica na própria tag <link>. Cada arquivo de estilo só passa a valer quando a tela atende à condição informada.
Dependendo do cenário, essa abordagem pode ser até mais produtiva, porque separa os estilos de tablet e de smartphone em arquivos próprios. Além disso, fica fácil enxergar qual folha atende cada faixa de tela.
Vale lembrar que o navegador ainda baixa as folhas cuja condição não é atendida, apenas com prioridade menor. Ou seja, a técnica organiza o código, mas não reduz o número de requisições.
Eu não recomendo esse recurso em projetos maiores, já que ele pode poluir bastante o HTML. Mesmo assim, é importante saber que ele existe, pois em um projeto mínimo pode ser a solução mais simples.
Boas práticas com media query
Saber a sintaxe é só o começo. A seguir estão alguns cuidados que fazem diferença na qualidade de cada media query que você escrever.
Configure o viewport
Sem a meta tag de viewport, muitos navegadores móveis renderizam a página como se a tela fosse larga e depois reduzem tudo. Nesse caso, suas regras de largura podem nem ser acionadas como você espera.
Por isso, inclua a linha abaixo no <head> de toda página responsiva:
<meta name="viewport" content="width=device-width, initial-scale=1" />
Escolha breakpoints pelo conteúdo
Breakpoint é a largura em que o layout muda. Em vez de copiar a resolução exata de um aparelho específico, observe em que ponto o conteúdo começa a quebrar ou a ficar apertado.
Assim, você cria cada media query onde ela realmente é necessária. Além disso, o layout continua funcionando quando surgirem aparelhos novos com resoluções diferentes.
Para conteúdo com muito texto, unidades relativas como em costumam funcionar melhor do que pixels. Dessa forma, o layout também respeita o tamanho de fonte que o usuário configurou no navegador.
Combine com flexbox e grid
A media query brilha quando trabalha junto com os modelos modernos de layout do CSS. Com o Flexbox, por exemplo, basta trocar a direção dos itens em telas pequenas para empilhar o conteúdo.
Se quiser praticar essa combinação, leia Entendendo o Flexbox: como começar do jeito certo e o Guia básico de display grid. Em seguida, aplique uma media query para reorganizar as colunas conforme a largura da tela.
Teste em vários tamanhos de tela
As ferramentas de desenvolvedor dos navegadores têm um modo de dispositivo que simula diferentes larguras. Com ele, você confere rapidamente se cada media query entra em ação no ponto certo.
Mesmo assim, sempre que possível teste também em aparelhos reais. Afinal, o toque, a densidade de pixels e o desempenho variam bastante entre um simulador e o mundo real.
Vídeo sobre media query no canal do balta.io
Se você prefere aprender assistindo, o vídeo abaixo mostra a media query em ação, com exemplos práticos no navegador.
Curso gratuito para criar sites responsivos
Para continuar evoluindo, o balta.io oferece um curso gratuito focado na criação de sites responsivos. Ele aprofunda os conceitos deste guia com projetos práticos.
Se você ainda está dando os primeiros passos na web, vale ler também O que você precisa saber antes de aprender HTML. Para consultar todos os detalhes da sintaxe, a referência oficial da MDN sobre o uso de media queries é a melhor fonte.
Conclusão
Agora você conhece a base da media query e entende o poder desse recurso na construção de páginas web responsivas. Com @media, um tipo de mídia opcional e uma expressão, você controla como cada parte do layout se comporta.
Esse recurso é essencial para construir páginas que funcionam em todos os tamanhos de tela. Por isso, todo desenvolvedor deve usá-lo para ter controle total sobre o comportamento da interface em telas menores.
Além disso, você viu onde declarar cada media query, como usar o atributo media da tag <link> e quais boas práticas evitam dor de cabeça. Configure o viewport, escolha breakpoints pelo conteúdo e combine as regras com Flexbox e Grid.
Minha sugestão agora é colocar tudo isso em prática e ver com seus próprios olhos como uma media query transforma uma página.
Espero que tenha gostado da leitura e que aproveite bem o material de apoio. Bons códigos e até a próxima.
FAQ
Media query funciona em todos os navegadores?
Sim. Os navegadores modernos suportam media queries há muitos anos, inclusive nas versões móveis.
Qual a diferença entre max-width e min-width?
O max-width aplica as regras até uma largura máxima, enquanto o min-width aplica a partir de uma largura mínima. Em geral, max-width combina com desktop first e min-width com mobile first.
Preciso informar o tipo de mídia em toda media query?
Não. Quando o tipo de mídia não aparece, o navegador assume all e avalia apenas a expressão.
Posso usar media query no atributo style?
Não. O atributo style aceita apenas declarações de propriedades, então a regra precisa ficar em uma folha de estilos externa ou em uma tag <style>.
Quais breakpoints devo usar?
Defina os breakpoints nos pontos em que o seu conteúdo começa a quebrar. Valores prontos de frameworks servem como referência, mas não substituem o teste com o seu layout.