Web Design Responsivo
Introdução e História
Antes do Design Responsivo
Antes do conceito de Responsive Web Design (RWD), web designers e desenvolvedores utilizavam técnicas como o design de largura fixa (Fixed-width design). Isso causava problemas significativos: se o usuário alterasse o tamanho da tela ou acessasse de um dispositivo diferente, o layout “quebrava”.
O Nascimento do RWD
Em 25 de maio de 2010, Ethan Marcotte publicou o artigo “Responsive Web Design” no site A List Apart, marcando o início de uma nova era no desenvolvimento web.
“O controle que os designers têm no meio impresso e, muitas vezes, desejam ter no meio web, é simplesmente um reflexo da limitação da página impressa”
Exemplos de Sites Responsivos
A Tag Meta Viewport
O Problema das Telas Mobile
Antes do RWD, os navegadores mobile tentavam “espremer” sites de desktop na tela do celular, presumindo que a tela tinha 980 pixels de largura e aplicando um “zoom out” artificial. O resultado eram textos minúsculos e links impossíveis de clicar.
A Solução
SEMPRE inclua esta tag no <head> do seu HTML antes de começar um design responsivo:
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
Explicação dos atributos:
| Atributo | Descrição |
|---|---|
width=device-width | Diz ao navegador para assumir que a largura do site é igual à largura física da tela do dispositivo |
initial-scale=1.0 | Define o nível de zoom inicial em 100% do tamanho real |
O Tripé do RWD
O Responsive Web Design é sustentado por três pilares fundamentais:
- Layouts Fluídos - Uso de unidades relativas em vez de absolutas
- Mídias Fluídas - Imagens e vídeos que se adaptam ao container
- Media Queries - Condições CSS que aplicam estilos baseados nas características do dispositivo
Unidades de Medida no CSS
Analogia
Imagine construir uma casa sem definir o tamanho dos cômodos. Ficaria bagunçado, né? Na Web, controlar o tamanho dos elementos é essencial para criar layouts organizados.
Números sem Unidade
Os números são usados para definir algumas propriedades CSS como opacity e line-height:
p {
font-size: 24px;
line-height: 1.5; /* número sem unidade = proporção */
}
Unidades Absolutas
As unidades absolutas são fixas e não se adaptam ao tamanho da tela ou do conteúdo.
| Unidade | Descrição |
|---|---|
px | Pixels - a menor unidade de medida em CSS |
cm | Centímetros |
mm | Milímetros |
in | Polegadas |
pt | Pontos |
Exemplo:
header {
background-color: orangered;
width: 600px; /* largura fixa */
}
ul {
display: flex;
justify-content: space-around;
list-style-type: none;
padding: 10px;
}
Unidades Relativas
Diferente dos pixels, as unidades relativas se adaptam e reagem ao contexto. São essenciais para layouts responsivos.
Três Grupos de Unidades Relativas:
| Grupo | Descrição | Exemplos |
|---|---|---|
| Proporção (Espaço) | Calculadas com base nas dimensões do elemento “pai” | % |
| Tipografia (Texto) | Calculadas com base no tamanho da fonte | em, rem, ch |
| Viewport (Janela) | Calculadas com base no tamanho da tela | vw, vh |
Porcentagem (%)
A porcentagem é calculada com base na largura do elemento pai:
.pai {
width: 600px;
}
.filho {
width: 50%; /* 300px */
}
Unidade em
Baseada no tamanho da fonte do elemento. Se a fonte do pai é 16px, 2em seria 32px.
.pai {
font-size: 10px;
}
.filho {
font-size: 2em; /* 2 * 10px = 20px */
padding: 2em; /* 2 * 20px = 40px */
}
⚠️ A “Pegadinha” do em - Efeito Composto
O em muda de referência dependendo de onde é usado:
| Propriedade | Referência |
|---|---|
font-size | Tamanho da fonte do PAI |
padding, margin, width | Tamanho da fonte do PRÓPRIO ELEMENTO |
Atenção: Esse efeito “bola de neve” é o motivo pelo qual o mercado evita usar
empara espaçamentos complexos.
Unidade rem (A Solução!)
O “r” vem de Root (Raiz). O rem ignora o tamanho da fonte dos elementos pais e olha sempre para o html (raiz do documento).
html {
font-size: 10px; /* A Raiz */
}
.pai {
font-size: 2rem; /* 2 * 10px = 20px */
}
.filho {
font-size: 2rem; /* 2 * 10px = 20px */
padding: 2rem; /* 2 * 10px = 20px */
}
✅ Vantagem: É previsível e não vira uma bola de neve. É a unidade favorita do mercado para responsividade.
Unidades de Viewport (vw e vh)
| Unidade | Descrição |
|---|---|
vw | 1% da largura da janela do navegador |
vh | 1% da altura da janela do navegador |
div {
width: 50vw; /* 50% da largura da janela */
height: 50vh; /* 50% da altura da janela */
}
Mídias Fluídas
O Problema
Imagens geralmente são feitas com um número fixo de pixels e podem quebrar um design fluído.
A Solução Simples
Use a propriedade max-width na imagem:
img {
max-width: 100%;
}
Essa solução indica que as imagens podem ter qualquer largura até no máximo 100% do container pai.
SVG (Scalable Vector Graphics)
Para ícones e ilustrações, prefira SVG - são vetoriais e escalam perfeitamente em qualquer tamanho.
Exemplo de código HTML:
<!-- Imagem normal (pode quebrar o layout) -->
<div>
<img src="imagem.jpg" alt="descrição" />
</div>
<!-- Imagem responsiva -->
<div>
<img src="imagem.jpg" class="img-responsive" alt="descrição" />
</div>
.img-responsive {
max-width: 100%;
height: auto;
}
Media Queries
Media queries permitem utilizar condições no CSS para ajustar o design de acordo com características do dispositivo (orientação, largura, etc.).
Sintaxe Básica
@media (feature: value) {
/* estilos condicionais */
}
Media Feature: orientation
Aplica estilos de acordo com a orientação do dispositivo:
| Valor | Descrição |
|---|---|
landscape | Largura > Altura (paisagem) |
portrait | Altura > Largura (retrato) |
@media (orientation: landscape) {
.paisagem {
display: flex;
}
.retrato {
display: none;
}
}
@media (orientation: portrait) {
.paisagem {
display: none;
}
.retrato {
display: flex;
}
}
Media Feature: min-width
Aplica estilos quando a janela for maior que uma certa largura:
@media (min-width: 420px) {
/* Estilos para janelas maiores que 420px */
}
/* Sintaxe moderna */
@media (width >= 420px) {
/* Mesma coisa, forma mais nova */
}
Media Feature: max-width
Aplica estilos quando a janela for menor que uma certa largura:
@media (max-width: 420px) {
/* Estilos para janelas menores que 420px */
}
/* Sintaxe moderna */
@media (width <= 420px) {
/* Mesma coisa, forma mais nova */
}
Exemplo: Layout Responsivo
HTML:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Layout Responsivo</title>
</head>
<body>
<header>header green</header>
<main>
<section>section red</section>
<aside>aside blue</aside>
</main>
<footer>footer yellow</footer>
</body>
</html>
CSS:
main {
display: flex;
}
aside {
flex-grow: 1;
}
/* Em telas pequenas, empilha os elementos */
@media (width <= 568px) {
main {
flex-direction: column;
}
}
Exemplo: Nav Sticky Condicional
nav {
background-color: red;
height: 5rem;
}
/* Só fixa o menu se a tela for alta o suficiente */
@media (height >= 30rem) {
nav {
position: sticky;
top: 0;
}
}
Exemplo: Dark Mode
body {
background-color: white;
color: black;
}
/* Respeita a preferência do sistema operacional */
@media (prefers-color-scheme: dark) {
body {
background-color: black;
color: white;
}
}
Estratégias de Responsividade
Desktop First (Abordagem Tradicional)
- O CSS “padrão” é focado no computador
- Usa
@media (max-width)para adaptar a telas menores
/* Padrão: Computador (lado a lado) */
main {
display: flex;
flex-direction: row;
}
/* Exceção: Telas menores que 768px */
@media (max-width: 768px) {
main {
flex-direction: column;
}
}
Mobile First (Padrão Moderno) ⭐
- O CSS “padrão” é focado no celular (mais simples)
- Usa
@media (min-width)para adicionar complexidade em telas maiores
/* Padrão: Celular (empilhado) */
main {
display: flex;
flex-direction: column;
}
/* Exceção: Telas maiores que 768px */
@media (min-width: 768px) {
main {
flex-direction: row;
}
}
✅ Recomendação: Use Mobile First - é o padrão moderno da indústria.
Exemplos Práticos
Tabela Resumo de Unidades
| Unidade | Tipo | Referência |
|---|---|---|
px | Absoluta | Fixa |
% | Relativa | Largura do pai |
em | Relativa | Fonte do elemento/pai |
rem | Relativa | Fonte do html (raiz) |
vw | Relativa | Largura da viewport |
vh | Relativa | Altura da viewport |
Breakpoints Comuns
| Dispositivo | Largura |
|---|---|
| Celular (pequeno) | < 576px |
| Celular (grande) | 576px - 768px |
| Tablet | 768px - 992px |
| Desktop | 992px - 1200px |
| Desktop (grande) | > 1200px |