Search buenodc

Nesta página
  1. Introdução e História
  2. A Tag Meta Viewport
  3. O Tripé do RWD
  4. Unidades de Medida no CSS
  5. Mídias Fluídas
  6. Media Queries
  7. Estratégias de Responsividade
  8. Exemplos Práticos
  9. Links Úteis

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:

AtributoDescrição
width=device-widthDiz ao navegador para assumir que a largura do site é igual à largura física da tela do dispositivo
initial-scale=1.0Define 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:

  1. Layouts Fluídos - Uso de unidades relativas em vez de absolutas
  2. Mídias Fluídas - Imagens e vídeos que se adaptam ao container
  3. 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.

UnidadeDescrição
pxPixels - a menor unidade de medida em CSS
cmCentímetros
mmMilímetros
inPolegadas
ptPontos

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:

GrupoDescriçãoExemplos
Proporção (Espaço)Calculadas com base nas dimensões do elemento “pai”%
Tipografia (Texto)Calculadas com base no tamanho da fonteem, rem, ch
Viewport (Janela)Calculadas com base no tamanho da telavw, 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:

PropriedadeReferência
font-sizeTamanho da fonte do PAI
padding, margin, widthTamanho da fonte do PRÓPRIO ELEMENTO

Atenção: Esse efeito “bola de neve” é o motivo pelo qual o mercado evita usar em para 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)

UnidadeDescrição
vw1% da largura da janela do navegador
vh1% 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;
}

📎 Exemplo Mídias Fluídas


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:

ValorDescrição
landscapeLargura > Altura (paisagem)
portraitAltura > 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 */
}

📎 Exemplo min-width


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

📎 Ver exemplo completo

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

📎 Ver exemplo

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

UnidadeTipoReferência
pxAbsolutaFixa
%RelativaLargura do pai
emRelativaFonte do elemento/pai
remRelativaFonte do html (raiz)
vwRelativaLargura da viewport
vhRelativaAltura da viewport

Breakpoints Comuns

DispositivoLargura
Celular (pequeno)< 576px
Celular (grande)576px - 768px
Tablet768px - 992px
Desktop992px - 1200px
Desktop (grande)> 1200px

Leitura Complementar