Mini projeto CSS — Landing estilizada
O resumo CSS mapeou a sua caixa de ferramentas. Esta sessão usa-a. Vai montar à mão uma pequena landing estilizada: barra de identidade, hero com chamada à ação clara, alguns cards de funcionalidades e um rodapé discreto. Sem propriedade exótica nova — só juntar competências já praticadas (cascata, box model, Flex, Grid, responsivo, foco).
Resposta direta
1) Esboce primeiro as secções: header + nav, hero + CTA, funcionalidades, footer.
2) Marque-as com HTML semântico (header, nav, main, section, footer) num contentor com max-width.
3) Coloque cores, espaçamentos e raios partilhados em custom properties :root.
4) Use Flex para a barra superior e a fila do hero; Grid para os cards.
5) Acrescente um breakpoint com media query e mantenha :focus-visible nos links e no CTA.
6) «Pronto» significa que a página lê bem em viewport estreita e Tab ainda mostra o foco — não que cada truque CSS aparece uma vez.
Ordem de construção desta landing
📊 Landing sections and CSS jobs
| Section | HTML job | CSS job |
|---|---|---|
| Header + nav | Nome do site + links na página | Fila Flex, gap, fundo calmo |
| Hero | Título, pitch curto, CTA principal | Flex ou pilha; contraste forte; botão claro |
| Features | Três cards curtos | Grid com pistas iguais e gap |
| Footer | Contacto ou linha legal | Padding discreto; texto atenuado legível |
| Shared tokens | — | Cores, espaço, radius em :root reutilizados em todo o lado |
| Responsive check | Meta viewport já no HTML | Um breakpoint que empilha hero/cards |
Ligue primeiro a estrutura, depois a decoração. Gradientes bonitos sobre uma sopa de div são mais difíceis de corrigir do que um shell semântico simples com CSS calmo.
Passo 1 — Shell semântico
Comece pelos landmarks. Classes afinam o aspeto; elementos nomeiam regiões para leitores e tecnologias de apoio.
<body>
<header class="site-header">
<div class="container header-inner">
<a class="logo" href="#">BrightDesk</a>
<nav class="site-nav" aria-label="Primary">
<a href="#features">Features</a>
<a href="#contact">Contact</a>
</nav>
</div>
</header>
<main>
<section class="hero">
<div class="container hero-inner">
<div class="hero-copy">
<h1>Ship a calm landing with CSS you already know</h1>
<p class="lede">Flex the bar, Grid the cards, keep focus visible.</p>
<a class="btn" href="#features">See features</a>
</div>
</div>
</section>
<section id="features" class="features">
<div class="container">
<h2>What you practice</h2>
<div class="feature-grid">
<article class="card"><h3>Tokens</h3><p>Shared color and space.</p></article>
<article class="card"><h3>Layout</h3><p>Flex and Grid on purpose.</p></article>
<article class="card"><h3>Polish</h3><p>Breakpoint and focus.</p></article>
</div>
</div>
</section>
</main>
<footer id="contact" class="site-footer">
<div class="container">
<p>Practice page — style by hand before frameworks.</p>
</div>
</footer>
</body>
Mantenha o texto inglês da demo curto. O seu projeto pode usar qualquer nome de produto — a estrutura importa mais do que a história da marca.
Passo 2 — Tokens de design em :root
Puxe valores repetidos para custom properties para que paleta e espaçamento fiquem consistentes quando ajustar a página.
:root {
--bg: #0b1220;
--surface: #111827;
--text: #f8fafc;
--muted: #cbd5e1;
--accent: #38bdf8;
--accent-ink: #0c4a6e;
--radius: 0.75rem;
--space: 1rem;
--max: 960px;
--focus: #fbbf24;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: system-ui, sans-serif;
line-height: 1.5;
background: var(--bg);
color: var(--text);
}
.container {
width: 100%;
max-width: var(--max);
margin: 0 auto;
padding: 0 var(--space);
}
Tokens não são decoração — evitam a deriva do copiar-colar. Mude --accent uma vez e o CTA, os links e os sinais de foco podem ficar alinhados.
Passo 3 — Flex para header e nav
Uma fila unidimensional é trabalho de Flex: logo de um lado, links do outro, gap consistente.
.site-header {
background: var(--surface);
border-bottom: 1px solid #1f2937;
}
.header-inner {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: var(--space);
padding: 0.75rem 0;
}
.logo {
color: var(--text);
font-weight: 700;
text-decoration: none;
}
.site-nav {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.site-nav a {
color: var(--muted);
text-decoration: none;
}
.site-nav a:hover {
color: var(--accent);
}
flex-wrap mantém a barra honesta em ecrãs estreitos antes da media query empilhar secções maiores.
Passo 4 — Faixa do hero
Dê espaço à mensagem, mantenha contraste forte e faça o CTA parecer a ação principal.
.hero {
padding: 3rem 0 2.5rem;
background:
radial-gradient(circle at top right, #1e3a5f 0%, transparent 45%),
var(--bg);
}
.hero-inner {
display: flex;
flex-direction: column;
gap: 1.25rem;
max-width: 40rem;
}
.hero h1 {
margin: 0;
font-size: clamp(1.75rem, 4vw, 2.5rem);
line-height: 1.15;
}
.lede {
margin: 0;
color: var(--muted);
font-size: 1.05rem;
}
.btn {
display: inline-block;
width: fit-content;
padding: 0.75rem 1.25rem;
border-radius: var(--radius);
background: var(--accent);
color: var(--accent-ink);
font-weight: 700;
text-decoration: none;
}
.btn:hover {
filter: brightness(1.05);
}
clamp no título é um toque moderno das lições anteriores — útil, não obrigatório. O CTA deve permanecer legível: fundo accent com tinta mais escura, não pálido-sobre-pálido.
Passo 5 — Grid para cards de funcionalidades
Dois eixos (linhas e colunas de cards iguais) pertencem ao Grid. Mantenha padding e borda dos cards calmos.
.features {
padding: 2rem 0 3rem;
}
.features h2 {
margin: 0 0 1rem;
}
.feature-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space);
}
.card {
padding: 1.25rem;
border-radius: var(--radius);
background: var(--surface);
border: 1px solid #1f2937;
}
.card h3 {
margin: 0 0 0.5rem;
font-size: 1.1rem;
}
.card p {
margin: 0;
color: var(--muted);
}
.site-footer {
padding: 1.5rem 0 2rem;
border-top: 1px solid #1f2937;
color: var(--muted);
font-size: 0.95rem;
}
No telemóvel, uma coluna basta. Alargue a grelha no breakpoint — não invente um terceiro sistema de layout para três cards.
Passo 6 — Breakpoint e foco visível
Um breakpoint honesto mais anéis de foco terminam a página de prática. Utilizadores de teclado ainda devem ver onde estão.
@media (min-width: 640px) {
.feature-grid {
grid-template-columns: repeat(3, 1fr);
}
.hero {
padding-top: 4rem;
}
}
a:focus-visible,
.btn:focus-visible {
outline: 3px solid var(--focus);
outline-offset: 3px;
}
Já estudou estilos de acessibilidade em profundidade. Aqui só aplica o hábito: nunca publique um CTA bonito que perde o sinal de foco.
Experimente você
- Crie
index.html+styles.csse cole o shell de landmarks; ligue a folha de estilos. - Acrescente os tokens
:roote as regras body/container; confirme que a página está centrada e legível. - Estilize o header com Flex e os cards com Grid (uma coluna, depois três a partir de
640px). - Estilize o CTA; percorra logo, nav e botão com Tab — o foco deve permanecer visível.
- Reduza à largura de telemóvel: sem scroll horizontal, cards empilhados, alvos de toque utilizáveis.
- Opcional: acrescente
prefers-reduced-motionse ligar uma transição hover em.btn.
Erros comuns
- Abrir uma biblioteca de componentes antes de conseguir estilizar esta página pequena à mão
- Pintar cada secção com
position: absoluteem vez do fluxo Flex/Grid - Omitir
max-widthno contentor para as linhas esticarem de ponta a ponta em ecrãs grandes - Remover outlines de foco «por design» no CTA e nos links da nav
- Acrescentar cinco breakpoints para três cards em vez de um alargamento claro
- Esquecer as lições anteriores: o resumo mapeou competências; a acessibilidade exigia foco visível — ambas ainda aplicam aqui
Resumo
- Este mini projeto junta as competências do curso numa landing estilizada
- Estrutura primeiro (landmarks), depois tokens, barra Flex, cards Grid, breakpoint, foco
- Flex para chrome unidimensional; Grid para a matriz de funcionalidades
- Pronto significa legível no telemóvel e seguro no teclado — não andaime pronto para framework
- Seguinte (opcional avançado): CSS !important (
important) se quiser casos limite de cascata; senão continue a praticar páginas pequenas à mão
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo