Projeto Final: Landing Page Completa e Responsiva
5 min de leitura
Você percorreu a trilha inteira: do "o que é CSS" até container queries, animações e performance. Hora de juntar tudo em uma landing page completa, sem framework, do zero. Esse é o tipo de projeto que vale mais que qualquer curso - porque você vai errar, debugar, pesquisar, ajustar. É aí que o CSS vira seu.
O que construir
Uma landing page de um produto fictício com:
- Header fixo com logo, menu de navegação e botão de CTA.
- Hero com título, subtítulo, dois CTAs e imagem (ou ilustração) de fundo.
- Seção de features com 3 a 6 cards em grade responsiva.
- Seção "depoimentos" com 2 a 3 citações de clientes.
- Seção de preços com 2 a 3 planos (cards lado a lado).
- CTA final com formulário de email.
- Footer com links, copyright e ícones de redes sociais.
A página deve:
- Ser totalmente responsiva (mobile, tablet, desktop).
- Ter tema escuro respeitando
prefers-color-scheme: dark. - Usar Flexbox ou Grid para os layouts principais.
- Ter transições suaves em hover/foco.
- Respeitar
prefers-reduced-motion. - Ter
box-sizing: border-boxno reset. - Usar variáveis CSS para cores, espaçamentos e tipografia.
- Ter foco visível (
:focus-visible) em todos os interativos. - Ter um HTML semântico (
<header>,<main>,<section>,<article>,<nav>,<footer>).
Sugestão de organização
landing-page/
├── index.html
├── css/
│ ├── reset.css # reset moderno
│ ├── variables.css # cores, fontes, espaçamentos
│ ├── base.css # tipografia, body, links
│ ├── layout.css # header, footer, hero, seções
│ ├── components.css # botões, cards, inputs
│ └── main.css # importa todos
└── assets/
└── (imagens)
Esse split é opinativo - use a organização que fizer sentido pra você. O importante é separar por responsabilidade e não ter um arquivo de 2.000 linhas.
Passo a passo sugerido
Fase 1 - Estrutura
- Crie o
index.htmlcom o esqueleto semântico (header, main, sections, footer). - Crie o
reset.csscombox-sizing: border-boxno*e os resets básicos. - Crie o
variables.csscom as cores, fontes e espaçamentos (incluindo o bloco de dark mode dentro de@media (prefers-color-scheme: dark)). - Valide o esqueleto: veja se a página renderiza sem estilo "estranho" - é comum achar HTML quebrado nesta fase.
Fase 2 - Tipografia e base
- Defina
font-family,line-height,colorebackgroundnobody. - Estilize os títulos (
h1,h2,h3) com tipografia fluida usandoclamp(). - Estilize parágrafos e links.
- Valide: a página deve estar legível, com hierarquia visual, mesmo sem layout.
Fase 3 - Layout principal
- Estilize o header com
display: flex; justify-content: space-between; align-items: center;. Adicioneposition: sticky; top: 0para fixar no topo. - Estilize o hero com Flexbox ou Grid, centralizando o
conteúdo. Use
min-height: 100vhse quiser "tela cheia". Adicione um overlay comlinear-gradientsobre a imagem de fundo. - Estilize a seção de features com
display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)). Cada feature é um<article>com ícone (pode ser emoji ou SVG), título e texto. - Estilize a seção de preços com Flexbox ou Grid. Geralmente o plano "popular" tem destaque (borda colorida, badge).
- Estilize o footer com Flexbox ou Grid, separando colunas
com
gap.
Fase 4 - Componentes
- Estilize o botão (
.botao) como componente reutilizável: padding, cor, border-radius, transição. Adicione:hover,:activee:focus-visible. - Estilize o input de email (
.input) com borda, focus visível, e estado:user-invalid(se quiser ir além). - Estilize o card (
.card) com padding, borda, sombra e hover suave (transform: translateY(-2px)no hover).
Fase 5 - Responsividade e refinamento
- Teste em três tamanhos no DevTools: 360px (celular pequeno), 768px (tablet), 1280px (desktop).
- Ajuste o que quebrar. Adicione media queries se algo não escalar naturalmente.
- Adicione transições em hover de botões, cards e links
(200-300ms,
ease-out). - Adicione o reset de prefers-reduced-motion (zera animações/transições quando o usuário pedir).
Fase 6 - Acessibilidade e validação final
- Abra a página apenas com teclado (Tab, Enter, setas). O foco está visível em todos os interativos? Você consegue usar tudo?
- Ative High Contrast no Windows ou emule no DevTools. Texto continua legível? Botões continuam visíveis?
- Rode o Lighthouse (DevTools → Lighthouse). Veja a nota de acessibilidade, performance e boas práticas.
- Rode o Validador do W3C no HTML. Veja se tem erros de markup.
- Abra o site em celular de verdade (ou emulador real). Touch funciona? Texto está legível? Sem scroll horizontal?
Critérios de aceitação
A página está pronta quando:
- Renderiza corretamente em 3 tamanhos (360, 768, 1280).
- Tema escuro funciona via
prefers-color-scheme: dark. - Todos os botões e links têm foco visível ao navegar com teclado.
- Animações respeitam
prefers-reduced-motion: reduce. - Lighthouse marca 90+ em acessibilidade, performance e boas práticas.
- O HTML passa no validador do W3C sem erros críticos.
- Você consegue explicar cada regra que escreveu (não copie código que não entende).
- O CSS está organizado (variáveis, separação por arquivo, nomes claros).
Desafios extras (se sobrar fôlego)
- Animações de scroll: use
IntersectionObserverem JavaScript para adicionar uma classe quando o elemento entra na viewport, e anime com@keyframesno CSS. - Dark mode toggle: adicione um botão que troca o tema
manualmente, além do automático. Salve a preferência em
localStorage. - Container queries: transforme o card de feature em um componente autônomo que se adapta se for usado em sidebars estreitas.
- Acessibilidade avançada: adicione
aria-labelem botões só com ícone,altem imagens, e<label>em todos os inputs. - Performance: meça o tempo de carregamento com a aba Network aberta. Tente ficar abaixo de 100KB de CSS total.
Pra quem nunca programou
Vai travar. Vai travar muito. É normal. Quando travar:
- Abra o DevTools e inspecione o elemento. O que o CSS está dizendo? O que o Computed diz?
- Pesquise a propriedade no MDN. Leia os exemplos.
- Isole o problema: tire o elemento do layout e teste sozinho. Voltou a funcionar? O problema é o contexto (pai, irmãos, container).
- Leia o erro em voz alta: "esperava um card roxo, mas veio um card cinza". Cinza = cor não foi aplicada. Por quê? Seletor errado? Variável não declarada? Specificidade?
- Comente regras para descobrir qual está atrapalhando.
CSS é uma das áreas onde depurar é mais rápido que prevenir. Abrace a investigação.
Pra quem já programa
Vai ser mais rápido, mas tem um detalhe: a tentação de pular etapas e meter framework. Resista. Esse projeto é sobre CSS puro, na unha, para você dominar o que existe por baixo dos frameworks que você usa no dia-a-dia. Quando o Tailwind não resolver (e ele tem limite), esse conhecimento vai te salvar.
Quando você terminar
Esse projeto é seu portfólio. Publique no GitHub Pages, Vercel, Netlify, ou onde preferir. Adicione um README com screenshot. É a primeira peça concreta de portfólio de CSS de muita gente que começou do zero. E olha o quanto você evoluiu desde o "o que é CSS" lá no início.
Parabéns por chegar até aqui. Agora vai lá e faz.