Guia completo e interativo para você aprender desenvolvimento web. Exemplos práticos, explicações claras e exercícios para fixar o conteúdo. Agora com sistema de conquistas e gamificação!
<!DOCTYPE html>
<html>
<head>
<title>Meu Site</title>
</head>
<body>
<h1>Olá, Mundo!</h1>
</body>
</html>
HTML é a linguagem de marcação padrão para criar páginas web. Ele descreve a estrutura de uma página usando elementos e tags que os navegadores interpretam para exibir conteúdo.
HTML (HyperText Markup Language) é a linguagem base de toda página web. Ele define a estrutura e o conteúdo do site através de elementos chamados tags.
<!DOCTYPE html> ← Define o tipo do documento (HTML5)
<html lang="pt-BR"> ← Elemento raiz, define o idioma
<head> ← Contém metadados (não visível)
<meta charset="UTF-8">
<title>Título da Página</title>
</head>
<body> ← Conteúdo visível da página
<h1>Olá, Mundo!</h1>
</body>
</html>
Tags usadas para formatar e estruturar textos na página.
<h1>Título Principal</h1>
<h2>Subtítulo</h2>
<h3>Título de Seção</h3>
<p>Este é um parágrafo com <strong>texto importante</strong>
e <em>texto com ênfase</em>.</p>
<p>Fórmula da água: H<sub>2</sub>O</p>
<p>Matemática: x<sup>2</sup> + y<sup>2</sup> = z<sup>2</sup></p>
<blockquote>
"A única maneira de fazer um ótimo trabalho é amar o que você faz."
<cite>— Steve Jobs</cite>
</blockquote>
Este é um parágrafo com texto importante e texto com ênfase.
Fórmula da água: H2O
"A única maneira de fazer um ótimo trabalho é amar o que você faz." — Steve Jobs
Tags semânticas dão significado ao conteúdo. Melhoram a acessibilidade, SEO e tornam o código mais legível.
<header>
<nav>
<a href="#">Logo</a>
<ul>
<li><a href="#">Início</a></li>
<li><a href="#">Sobre</a></li>
<li><a href="#">Contato</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h1>Título do Artigo</h1>
<time datetime="2026-02-17">17 de Fevereiro, 2026</time>
<section>
<h2>Introdução</h2>
<p>Conteúdo da seção...</p>
</section>
<figure>
<img src="imagem.jpg" alt="Descrição">
<figcaption>Legenda da imagem</figcaption>
</figure>
</article>
<aside>
<h3>Artigos Relacionados</h3>
<ul>...</ul>
</aside>
</main>
<footer>
<p>© 2026 Meu Site. Todos os direitos reservados.</p>
</footer>
Este conteúdo fica escondido até você clicar! Muito útil para FAQs e menus.
<!-- Link externo abre em nova aba -->
<a href="https://google.com" target="_blank">Ir para Google</a>
<!-- Link interno (âncora) -->
<a href="#secao">Ir para Seção</a>
<!-- Link para email -->
<a href="mailto:email@exemplo.com">Enviar Email</a>
<!-- Imagem com texto alternativo (acessibilidade!) -->
<img src="foto.jpg" alt="Descrição da imagem" width="300">
<!-- Vídeo com controles -->
<video controls width="400">
<source src="video.mp4" type="video/mp4">
Seu navegador não suporta vídeo.
</video>
<!-- Áudio -->
<audio controls>
<source src="musica.mp3" type="audio/mpeg">
</audio>
<ul><li>Item</li></ul>
<ol><li>Item</li></ol>
<dl><dt>Termo</dt><dd>Definição</dd></dl>
<table>
<thead> ← Cabeçalho da tabela
<tr> ← Linha (table row)
<th>Nome</th> ← Célula de cabeçalho
<th>Idade</th>
<th>Cidade</th>
</tr>
</thead>
<tbody> ← Corpo da tabela
<tr>
<td>João</td> ← Célula de dados
<td>25</td>
<td>São Paulo</td>
</tr>
<tr>
<td>Maria</td>
<td>30</td>
<td>Rio de Janeiro</td>
</tr>
</tbody>
<tfoot> ← Rodapé da tabela
<tr>
<td colspan="3">Total: 2 pessoas</td>
</tr>
</tfoot>
</table>
| Nome | Idade | Cidade |
|---|---|---|
| João | 25 | São Paulo |
| Maria | 30 | Rio de Janeiro |
Formulários permitem coletar dados do usuário.
<form action="/enviar" method="POST">
<fieldset>
<legend>Dados Pessoais</legend>
<label for="nome">Nome:</label>
<input type="text" id="nome" name="nome" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<label for="senha">Senha:</label>
<input type="password" id="senha" name="senha" minlength="8">
<label for="data">Data de Nascimento:</label>
<input type="date" id="data" name="data">
<label for="cidade">Cidade:</label>
<select id="cidade" name="cidade">
<option value="">Selecione...</option>
<option value="sp">São Paulo</option>
<option value="rj">Rio de Janeiro</option>
</select>
<label>
<input type="checkbox" name="termos">
Aceito os termos de uso
</label>
<label for="bio">Biografia:</label>
<textarea id="bio" name="bio" rows="4"></textarea>
</fieldset>
<button type="submit">Enviar</button>
<button type="reset">Limpar</button>
</form>
<div>
Elemento de bloco - Ocupa toda a largura disponível. Usado para agrupar elementos e criar layouts.
<span>
Elemento inline - Ocupa apenas o espaço necessário. Usado para estilizar partes de texto.
CSS é responsável pela aparência visual do site: cores, tamanhos, posições, animações e muito mais! Transforme HTML simples em designs incríveis.
Estilizado com CSS
CSS (Cascading Style Sheets) define o estilo visual dos elementos HTML. Enquanto HTML estrutura o conteúdo, CSS o embeleza!
h1 { /* Seletor: elemento h1 */
color: blue; /* Propriedade: valor */
font-size: 24px;
text-align: center;
}
.classe { /* Seletor de classe (.) */
background-color: #f0f0f0;
}
#id { /* Seletor de ID (#) */
border: 1px solid black;
}
Arquivo .css separado, linkado no HTML
<link rel="stylesheet" href="styles.css">
✓ Melhor prática
Dentro da tag <style> no <head>
<style>
h1 { color: red; }
</style>
Útil para testes
Direto no atributo style do elemento
<h1 style="color: red;">Título</h1>
✗ Evitar
Seletores definem QUAIS elementos serão estilizados.
| Seletor | Exemplo | Seleciona |
|---|---|---|
elemento |
p { } |
Todos os parágrafos |
.classe |
.destaque { } |
Elementos com class="destaque" |
#id |
#header { } |
Elemento com id="header" |
* |
* { } |
Todos os elementos |
elemento, elemento |
h1, h2 { } |
h1 E h2 |
elemento elemento |
div p { } |
p dentro de div (descendente) |
elemento > elemento |
div > p { } |
p filho direto de div |
elemento + elemento |
h1 + p { } |
p imediatamente após h1 |
[atributo] |
[required] { } |
Elementos com atributo required |
:hover |
a:hover { } |
Link quando mouse passa |
:first-child |
li:first-child { } |
Primeiro li |
::before |
p::before { } |
Pseudo-elemento antes de p |
Reutilizável! Pode ser usada em vários elementos. O mesmo elemento pode ter múltiplas classes.
<!-- HTML -->
<p class="destaque grande">Texto</p>
<span class="destaque">Outro</span>
/* CSS */
.destaque {
background: yellow;
}
.grande {
font-size: 20px;
}
Único! Só pode ser usado em UM elemento por página. Maior especificidade.
<!-- HTML -->
<header id="cabecalho">...</header>
/* CSS */
#cabecalho {
background: navy;
color: white;
}
color: red;
color: #ff5733;
color: rgb(102, 126, 234);
color: rgba(102, 126, 234, 0.5);
color: hsl(231, 77%, 66%);
/* Cor do texto */
color: #333333;
/* Cor de fundo */
background-color: #f5f5f5;
/* Gradiente linear */
background: linear-gradient(to right, #667eea, #764ba2);
/* Gradiente radial */
background: radial-gradient(circle, #fff, #ddd);
/* Cor da borda */
border-color: #dee2e6;
Texto de exemplo
HEX: #667eea
/* Cor de fundo sólida */
background-color: #f0f0f0; /* Muda a cor de fundo */
/* Imagem de fundo */
background-image: url('imagem.jpg');
/* Repetição da imagem */
background-repeat: no-repeat; /* no-repeat, repeat, repeat-x, repeat-y */
/* Posição da imagem */
background-position: center; /* center, top, left, right, bottom */
/* Tamanho da imagem */
background-size: cover; /* cover (cobre tudo), contain, auto */
/* Fixar imagem ao rolar */
background-attachment: fixed; /* fixed, scroll, local */
/* Shorthand (tudo junto) */
background: #f0f0f0 url('img.jpg') no-repeat center/cover;
/* Família da fonte */
font-family: 'Arial', sans-serif; /* Define a fonte */
/* Tamanho da fonte */
font-size: 16px; /* px, em, rem, %, vw */
/* Peso da fonte */
font-weight: bold; /* normal, bold, 100-900 */
/* Estilo da fonte */
font-style: italic; /* normal, italic, oblique */
/* Cor do texto */
color: #333;
/* Alinhamento */
text-align: center; /* left, right, center, justify */
/* Decoração */
text-decoration: underline; /* none, underline, line-through */
/* Transformação */
text-transform: uppercase; /* uppercase, lowercase, capitalize */
/* Espaçamento entre letras */
letter-spacing: 2px;
/* Espaçamento entre palavras */
word-spacing: 5px;
/* Altura da linha */
line-height: 1.6; /* Melhora legibilidade */
/* Sombra no texto */
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
font-weight: bold
font-style: italic
text-decoration: underline
text-transform: uppercase
letter-spacing: 5px
text-shadow
Todo elemento HTML é uma "caixa" com 4 partes: conteúdo, padding, border e margin.
/* MARGIN - Espaço EXTERNO (fora da borda) */
margin: 20px; /* Todos os lados */
margin: 10px 20px; /* Vertical | Horizontal */
margin: 10px 20px 15px 25px; /* Top | Right | Bottom | Left */
margin-top: 10px;
margin-right: 20px;
margin-bottom: 15px;
margin-left: 25px;
margin: 0 auto; /* Centraliza horizontalmente */
/* PADDING - Espaço INTERNO (entre borda e conteúdo) */
padding: 20px;
padding: 10px 20px 15px 25px; /* Top | Right | Bottom | Left */
padding-top: 10px;
/* BORDER - Borda do elemento */
border: 1px solid black; /* Largura | Estilo | Cor */
border-width: 2px;
border-style: solid; /* solid, dashed, dotted, double, none */
border-color: #333;
border-radius: 10px; /* Arredonda cantos */
border-radius: 50%; /* Círculo perfeito */
/* WIDTH e HEIGHT */
width: 300px;
height: 200px;
max-width: 100%; /* Responsivo */
min-height: 50px;
/* BOX-SIZING (importante!) */
box-sizing: border-box; /* Inclui padding/border no width */
A propriedade display define como o elemento se
comporta na página.
Ocupa toda a largura. Quebra linha antes e depois.
div, p, h1-h6, header, section...
Ocupa apenas o espaço necessário. Não aceita width/height.
span, a, strong, em...
Combina ambos: inline + aceita width/height.
Remove o elemento da página completamente.
Usado para esconder elementos
Flexbox é um sistema de layout poderoso para alinhar e distribuir elementos em uma dimensão (linha OU coluna).
.container {
display: flex; /* Ativa o Flexbox */
/* Direção dos itens */
flex-direction: row; /* row, row-reverse, column, column-reverse */
/* Quebra de linha */
flex-wrap: wrap; /* nowrap, wrap, wrap-reverse */
/* Alinhamento no eixo principal (horizontal em row) */
justify-content: center; /* flex-start, flex-end, center,
space-between, space-around, space-evenly */
/* Alinhamento no eixo cruzado (vertical em row) */
align-items: center; /* flex-start, flex-end, center,
stretch, baseline */
/* Espaço entre itens */
gap: 20px; /* Espaçamento entre items */
}
.container {
display: flex;
justify-content: center;
align-items: center;
flex-direction: row;
gap: 10px;
}
.item {
/* Crescimento proporcional */
flex-grow: 1; /* 0 = não cresce, 1+ = cresce */
/* Encolhimento proporcional */
flex-shrink: 1; /* 0 = não encolhe */
/* Tamanho base */
flex-basis: 200px; /* Tamanho inicial antes de crescer/encolher */
/* Shorthand */
flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0 */
flex: 0 0 200px; /* Não cresce, não encolhe, 200px fixo */
/* Ordem do item */
order: 2; /* Muda a ordem visual */
/* Alinhamento individual */
align-self: flex-end; /* Sobrescreve align-items do pai */
}
justify-content: center; align-items: center;
justify-content: space-between;
CSS Grid é um sistema de layout bidimensional - trabalha com linhas E colunas ao mesmo tempo!
.grid-container {
display: grid; /* Ativa o Grid */
/* Define colunas */
grid-template-columns: 200px 200px 200px; /* 3 colunas fixas */
grid-template-columns: 1fr 1fr 1fr; /* 3 colunas iguais */
grid-template-columns: repeat(3, 1fr); /* Mesmo que acima */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* Responsivo! */
/* Define linhas */
grid-template-rows: 100px 200px;
grid-template-rows: auto; /* Altura automática */
/* Espaçamento */
gap: 20px; /* Entre linhas e colunas */
row-gap: 20px; /* Apenas entre linhas */
column-gap: 10px; /* Apenas entre colunas */
/* Alinhamento dos itens */
justify-items: center; /* Horizontal dentro da célula */
align-items: center; /* Vertical dentro da célula */
place-items: center; /* Shorthand: align-items + justify-items */
}
grid-template-columns: repeat(3, 1fr); gap: 10px;
.item {
/* Posição por linha/coluna */
grid-column: 1 / 3; /* Da coluna 1 até a 3 (ocupa 2) */
grid-row: 1 / 2; /* Da linha 1 até a 2 */
/* Shorthand */
grid-column: span 2; /* Ocupa 2 colunas */
grid-row: span 3; /* Ocupa 3 linhas */
/* Área nomeada */
grid-area: header; /* Usa área definida no container */
}
.container {
display: grid;
grid-template-columns: 200px 1fr 150px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
}
Posição normal no fluxo do documento.
Posicionado relativo à sua posição original. Usa top, right, bottom, left.
Posicionado em relação ao ancestral posicionado mais próximo (não-static).
Fixo na viewport. Não se move ao rolar a página.
Exemplo: menu fixo no topo
Combina relative e fixed. "Gruda" quando atinge uma posição.
Exemplo: cabeçalho que gruda ao rolar
/* Relative - move em relação a si mesmo */
.relative {
position: relative;
top: 20px;
left: 10px;
}
/* Absolute - posição exata dentro do pai */
.parent {
position: relative; /* Pai precisa ter position */
}
.absolute {
position: absolute;
top: 0;
right: 0; /* Canto superior direito */
}
/* Fixed - fixo na tela */
.fixed-header {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000; /* Fica acima de tudo */
}
/* Sticky - gruda ao rolar */
.sticky-nav {
position: sticky;
top: 0;
}
| Unidade | Tipo | Descrição | Uso Comum |
|---|---|---|---|
px |
Absoluta | Pixels | Bordas, sombras |
% |
Relativa | Porcentagem do pai | Larguras responsivas |
em |
Relativa | Relativo ao font-size do elemento | Padding, margin |
rem |
Relativa | Relativo ao font-size do <html> | Font-size, spacing |
vw |
Viewport | 1% da largura da viewport | Seções full-width |
vh |
Viewport | 1% da altura da viewport | Seções full-height |
fr |
Flexível | Fração do espaço disponível | CSS Grid |
html {
font-size: 16px; /* Base para rem */
}
.container {
width: 100%; /* 100% do pai */
max-width: 1200px; /* Máximo de 1200px */
padding: 2rem; /* 32px (2 × 16px) */
}
.hero {
height: 100vh; /* Altura total da tela */
width: 100vw; /* Largura total da tela */
}
.text {
font-size: 1.5rem; /* 24px */
margin-bottom: 1em; /* Relativo ao próprio font-size */
}
/* Interação */
a:hover { } /* Mouse sobre o elemento */
a:active { } /* Clicando no elemento */
a:visited { } /* Link já visitado */
input:focus { } /* Elemento focado */
/* Formulário */
input:checked { } /* Checkbox/radio marcado */
input:disabled { } /* Campo desabilitado */
input:required { } /* Campo obrigatório */
input:valid { } /* Validação OK */
input:invalid { } /* Validação falhou */
/* Posição */
li:first-child { } /* Primeiro filho */
li:last-child { } /* Último filho */
li:nth-child(2) { } /* Segundo filho */
li:nth-child(odd) { } /* Filhos ímpares */
li:nth-child(even) { }/* Filhos pares */
p:first-of-type { } /* Primeiro <p> */
:not(.classe) { } /* Exceto .classe */
/* Conteúdo antes/depois */
p::before {
content: "→ "; /* Adiciona antes */
}
p::after {
content: " ←"; /* Adiciona depois */
}
/* Seleção de texto */
::selection {
background: yellow; /* Cor ao selecionar texto */
color: black;
}
/* Primeira letra/linha */
p::first-letter {
font-size: 2em; /* Letra capitular */
}
p::first-line {
font-weight: bold; /* Primeira linha */
}
/* Placeholder */
input::placeholder {
color: #aaa;
}
.button {
background: blue;
transition: all 0.3s ease; /* Propriedade, duração, curva */
/* Ou propriedades separadas */
transition-property: background, transform;
transition-duration: 0.3s;
transition-timing-function: ease-in-out;
transition-delay: 0s;
}
.button:hover {
background: purple;
transform: scale(1.1);
}
/* Definir a animação */
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
/* Aplicar a animação */
.element {
animation: pulse 2s ease-in-out infinite;
/* Ou propriedades separadas */
animation-name: pulse;
animation-duration: 2s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-fill-mode: forwards;
}
/* Mover */
transform: translateX(50px); /* Move horizontalmente */
transform: translateY(-20px); /* Move verticalmente */
transform: translate(50px, 20px); /* Move X e Y */
/* Escalar */
transform: scale(1.5); /* Aumenta 150% */
transform: scale(0.5); /* Diminui 50% */
transform: scaleX(2); /* Estica horizontalmente */
/* Rotacionar */
transform: rotate(45deg); /* Gira 45 graus */
transform: rotate(-90deg); /* Gira contra-relógio */
/* Inclinar */
transform: skewX(10deg); /* Inclina horizontalmente */
transform: skew(10deg, 5deg); /* Inclina X e Y */
/* Múltiplas transformações */
transform: translate(50px, 0) rotate(45deg) scale(1.2);
/* Ponto de origem */
transform-origin: center; /* center, top left, 50% 50% */
Media queries permitem aplicar estilos diferentes baseados no tamanho da tela, orientação, etc.
/* Mobile First - Estilos base para mobile */
.container {
width: 100%;
padding: 1rem;
}
/* Tablets (768px+) */
@media (min-width: 768px) {
.container {
width: 750px;
padding: 2rem;
}
}
/* Desktops (1024px+) */
@media (min-width: 1024px) {
.container {
width: 960px;
}
}
/* Desktops grandes (1200px+) */
@media (min-width: 1200px) {
.container {
width: 1140px;
}
}
/* Orientação */
@media (orientation: landscape) {
/* Modo paisagem */
}
/* Print */
@media print {
.no-print { display: none; }
}
/* Definir variáveis (geralmente no :root) */
:root {
--cor-primaria: #667eea;
--cor-secundaria: #764ba2;
--cor-texto: #333;
--espacamento: 1rem;
--borda-radius: 8px;
--sombra: 0 4px 6px rgba(0,0,0,0.1);
}
/* Usar variáveis */
.button {
background: var(--cor-primaria);
color: white;
padding: var(--espacamento);
border-radius: var(--borda-radius);
box-shadow: var(--sombra);
}
.button:hover {
background: var(--cor-secundaria);
}
/* Variável com fallback */
color: var(--cor-inexistente, black); /* Usa black se não existir */
Experimente escrever HTML e CSS e veja o resultado em tempo real!
320px - Mobile S375px - Mobile M425px - Mobile L768px - Tablet1024px - Laptop1440px - DesktopCtrl + S - SalvarCtrl + / - ComentarCtrl + D - Duplicar linhaAlt + ↑/↓ - Mover linhaCtrl + Shift + K - Deletar linha