<!DOCTYPE html> <html lang="pt"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Aulify</title> </head> <body> <header>...</header> <nav>...</nav> <main> <article> <section>...</section> </article> <aside>...</aside> </main> <footer>...</footer> </body> </html>
<div> é o último recurso. Tag semântica primeiro.
<div>
<h1>
<article>
<!-- MAU --> <div class="header"><div class="title">...</div></div> <!-- BOM --> <header><h1>...</h1></header>
<form action="/registar" method="post"> <label for="email">Email</label> <input type="email" id="email" name="email" required> <label for="idade">Idade</label> <input type="number" id="idade" name="idade" min="13" max="120"> <fieldset> <legend>Plano</legend> <label><input type="radio" name="plano" value="free"> Grátis</label> <label><input type="radio" name="plano" value="pro"> Pro</label> </fieldset> <button type="submit">Registar</button> </form>
<label for> ligado ao id — clicável e acessível.
<label for>
id
/* Elemento */ p { color: #333; } /* Classe */ .destaque { background: yellow; } /* ID (evitar para estilo) */ #topo { position: sticky; } /* Descendente */ nav a { text-decoration: none; } /* Estado */ button:hover { opacity: .8; } input:focus { outline: 2px solid blue; }
Especificidade: inline > ID > classe > elemento. Evita !important.
!important
┌─────────────────────────┐ │ margin │ │ ┌───────────────────┐ │ │ │ border │ │ │ │ ┌─────────────┐ │ │ │ │ │ padding │ │ │ │ │ │ ┌───────┐ │ │ │ │ │ │ │content│ │ │ │ │ │ │ └───────┘ │ │ │
* { box-sizing: border-box; } /* width passa a incluir padding e border */
:root { --cor-primaria: #6366f1; --espaco: 16px; --raio: 8px; } .botao { background: var(--cor-primaria); padding: var(--espaco); border-radius: var(--raio); }
Centraliza o design. Mudar 1 linha → muda tudo.
.barra { display: flex; justify-content: space-between; /* eixo principal */ align-items: center; /* eixo cruzado */ gap: 16px; }
.item { flex: 1; } /* cresce igual */ .logo { flex: 0 0 auto; } /* tamanho fixo */
Ideal para: navbars, toolbars, alinhar elementos numa linha.
.galeria { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } /* Responsivo automático */ .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; }
Ideal para: galerias, dashboards, layouts de página inteira.
/* Base: mobile (sem media query) */ .container { padding: 16px; } /* Tablet */ @media (min-width: 768px) { .container { padding: 32px; } } /* Desktop */ @media (min-width: 1024px) { .container { max-width: 1100px; margin: 0 auto; } }
Mobile-first: começar pelo pequeno, adicionar para ecrãs maiores.
px
%
rem
em
vw / vh
fr
clamp()
h1 { font-size: clamp(1.5rem, 4vw, 3rem); }
outline
h1
h2
h3
<!-- Imagem informativa --> <img src="grafico.png" alt="Vendas subiram 30% em Maio"> <!-- Imagem decorativa --> <img src="enfeite.svg" alt=""> <!-- Botão só com ícone --> <button aria-label="Fechar">✕</button> <!-- Skip link --> <a href="#main" class="skip">Saltar para conteúdo</a>