Media queries e a abordagem mobile-first.
Mais de 60% do tráfego web vem de dispositivos móveis
Celulares, tablets, notebooks, desktops, TVs
Google prioriza sites responsivos nos resultados de busca
lightbulb Um site responsivo se adapta a qualquer tamanho de tela sem perder usabilidade.
<meta
name="viewport"
content="width=device-width,
initial-scale=1.0"
/>
warning Sem esta meta tag, o navegador mobile renderiza a página como se fosse um desktop de ~980px.
width=device-width a largura segue o dispositivo
initial-scale=1.0 sem zoom inicial
<head> de todo HTML
/* Estilos padrão (todos os tamanhos) */
.container {
padding: 16px;
}
/* Telas maiores que 768px */
@media (min-width: 768px) {
.container {
padding: 32px;
max-width: 720px;
margin: 0 auto;
}
}
/* Telas maiores que 1024px */
@media (min-width: 1024px) {
.container {
max-width: 960px;
}
}
@media (condição) {
/* regras CSS */
}
/* Combinando condições */
@media (min-width: 768px)
and (max-width: 1023px) {
/* só tablets */
}
min-width a partir de X pixelsmax-width até X pixelsorientation portrait / landscape/* Estilos para desktop */
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
/* Desfazer para mobile */
@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
}
}
Começa complexo e precisa "desfazer" para telas menores.
/* Base: mobile (1 coluna) */
.grid {
display: grid;
gap: 16px;
}
/* Telas médias: 2 colunas */
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Telas grandes: 3 colunas */
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
Começa simples e adiciona complexidade conforme a tela cresce.
< 640px
640px / 768px
1024px
1280px / 1536px
lightbulb Estes são os breakpoints padrão do Tailwind CSS. Use como referência, mas adapte ao seu projeto.
.container {
width: 90%;
max-width: 1200px;
margin: 0 auto;
}
Sempre relativo ao elemento pai.
.hero {
height: 100vh;
width: 100vw;
}
.titulo {
font-size: 5vw;
}
Relativo ao tamanho da janela.
/* min, preferido, max */
h1 {
font-size: clamp(
1.5rem, 4vw, 3rem
);
}
Tamanho fluido com limites. Ideal para tipografia responsiva.
/* Imagem nunca ultrapassa o contêiner */
img {
max-width: 100%;
height: auto;
display: block;
}
/* Imagem como background */
.hero {
background-image: url('bg.jpg');
background-size: cover;
background-position: center;
}
/* Controla como a imagem preenche */
.avatar {
width: 150px;
height: 150px;
object-fit: cover;
border-radius: 50%;
}
/* Valores: */
/* cover = preenche, pode cortar */
/* contain = mostra tudo, pode sobrar espaço */
/* fill = estica (distorce) */
/* Mobile: menu oculto */
.nav-links { display: none; }
.hamburger { display: block; }
/* Desktop: menu visível */
@media (min-width: 768px) {
.nav-links { display: flex; }
.hamburger { display: none; }
}
/* Mobile: sem sidebar */
.layout {
display: grid;
grid-template-columns: 1fr;
}
/* Desktop: com sidebar */
@media (min-width: 1024px) {
.layout {
grid-template-columns: 250px 1fr;
}
}
body {
font-size: clamp(14px, 2vw, 18px);
}
h1 {
font-size: clamp(1.8rem, 5vw, 3.5rem);
}
/* Sem media queries! */
.cards {
display: grid;
grid-template-columns:
repeat(auto-fit,
minmax(250px, 1fr));
gap: 16px;
}
viewport está no HTMLimg { max-width: 100%; height: auto; }clamp() para os tamanhos de fonte dos títulosAnimações e transições CSS.