Pular para o conteúdo
murad.guide

HTML do Zero ao Site

Capítulo 2

Sites com várias páginas e conteúdo semântico

13 min de leitura 2.264 palavras 15 gravuras

Navegação blog currículo tabelas e formulários

Transforme uma página isolada em um site organizado e acessível com navegação consistente conteúdos variados e páginas especializadas.

Como usar este capítulo

Você já sabe criar uma página e publicar arquivos estáticos. Agora o projeto crescerá. Cada unidade acrescenta uma página ou um tipo de conteúdo ao Caderno de Trilhas. Faça uma cópia da pasta ao começar; assim você poderá comparar as versões e recuperar um arquivo se algo der errado.

O foco continua sendo HTML. O CSS aparecerá apenas como uma folha pronta ou em ajustes pequenos. O capítulo seguinte explica as regras de estilo com mais profundidade.

Objetivos de aprendizagem

Sumário

**1. **Estrutura semântica

**2. **Folha de estilo compartilhada

**3. **Página Sobre e navegação

**4. **Caminhos entre pastas

**5. **Blog estático

**6. **Elementos de texto

**7. **Conteúdo expansível e complementar

**8. **Tabelas

**9. **Currículo em HTML

**10. **Formulários acessíveis

**11. **Consistência e manutenção

**12. **Projeto e avaliação

Unidade 1 Estrutura semântica

HTML semântico descreve a função de cada área. Um <header> apresenta uma página ou seção. <nav> reúne links principais. <main> contém o assunto exclusivo daquela página. <footer> encerra o documento ou uma seção. Esses elementos não determinam a aparência; eles criam estrutura compreensível para navegadores, mecanismos de busca e tecnologias assistivas.

HTML

<body>
  <header>
    <h1>Caderno de Trilhas</h1>
    <p>Notas de caminhos, leituras e pequenos projetos.</p>
  </header>

  <nav aria-label="Navegação principal">
    <a href="index.html" aria-current="page">Início</a>
    <a href="sobre.html">Sobre</a>
  </nav>

  <main>
    <h2>Notas recentes</h2>
    <p>Conteúdo principal da página.</p>
  </main>

  <footer>
    <p>Conteúdo atualizado periodicamente.</p>
  </footer>
</body>

a-website-with-style-3.webp — Elementos semânticos identificam a função das áreas da página

Elementos de agrupamento

<section> reúne conteúdo ligado por um assunto e normalmente possui título. <article> representa um conteúdo que faz sentido sozinho, como uma notícia, postagem ou comentário. <aside> guarda informação complementar, e não a ideia central.

HTML

<main>
  <section>
    <h2>Artigos recentes</h2>

    <article>
      <h3>Como planejei uma caminhada curta</h3>
      <p>Resumo do artigo.</p>
    </article>
  </section>

  <aside>
    <h2>Antes de sair</h2>
    <p>Consulte a previsão do tempo.</p>
  </aside>
</main>

Não troque todo <div> por <section>. Use um elemento semântico quando ele descreve de verdade o conteúdo. <div> continua útil como recipiente sem significado próprio, principalmente para layout com CSS.

Um único conteúdo principal

Cada página deve ter um <main> visível. Cabeçalho, navegação e rodapé compartilhados ficam fora dele. Isso permite que tecnologias assistivas saltem diretamente para o assunto principal.

Unidade 2 Folha de estilo compartilhada

Uma folha de estilo externa evita repetir CSS em cada página. Crie a pasta css e o arquivo styles.css. Depois ligue o arquivo dentro de <head>.

HTML

<link rel="stylesheet" href="css/styles.css">

Comece com um CSS curto. Ele cria uma largura confortável, imagens flexíveis e tipografia legível sem exigir classes em cada elemento.

CSS

:root {
  color-scheme: light dark;
  font-family: system-ui, sans-serif;
  line-height: 1.6;
}

body {
  max-width: 72rem;
  margin: 0 auto;
  padding: 1rem;
}

img,
video {
  max-width: 100%;
  height: auto;
}

nav {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
}

a[aria-current] {
  font-weight: 700;
}

a-website-with-style-2.webp — Uma folha compartilhada muda todas as páginas ligadas a ela

**DICA: **É possível usar um framework CSS sem classes, mas manter um arquivo próprio ajuda a entender o que muda e reduz dependências externas. Se você usar um framework, baixe uma cópia estável ou siga a documentação oficial da versão escolhida.

Unidade 3 Página Sobre e navegação

Crie sobre.html na mesma pasta de index.html. Copie a estrutura completa da página inicial e altere <title>, <h1> e o conteúdo de <main>.

HTML

<title>Sobre o projeto | Caderno de Trilhas</title>

HTML

<main>
  <h1>Sobre o projeto</h1>
  <p>
    O Caderno de Trilhas reúne anotações de estudo e roteiros de passeios.
    O site serve como exercício de organização de conteúdo na web.
  </p>

  <h2>O que você encontra aqui</h2>
  <ul>
    <li>Artigos curtos.</li>
    <li>Listas de preparação.</li>
    <li>Registros de aprendizado.</li>
  </ul>
</main>

adding-an-about-page-1.webp — Uma página Sobre explica o propósito do site sem repetir toda a página inicial

Inclua o mesmo menu nas páginas. Em index.html, indique Início como atual. Em sobre.html, mova o atributo para Sobre.

HTML

<!-- index.html -->
<nav aria-label="Navegação principal">
  <a href="index.html" aria-current="page">Início</a>
  <a href="blog/index.html">Blog</a>
  <a href="sobre.html">Sobre</a>
</nav>

HTML

<!-- sobre.html -->
<nav aria-label="Navegação principal">
  <a href="index.html">Início</a>
  <a href="blog/index.html">Blog</a>
  <a href="sobre.html" aria-current="page">Sobre</a>
</nav>

aria-current="page" informa que o link representa a página aberta. O CSS pode usar esse atributo para criar destaque visual. Não coloque o atributo em mais de um item do mesmo menu.

adding-an-about-page-2.webp — A página atual deve ser reconhecível pela aparência e pelo código

Figura com legenda

Adicione uma imagem quando ela tiver relação com o conteúdo. Use <figure> e <figcaption> para ligar a legenda à figura.

HTML

<figure>
  <img
    src="imagens/trilha-mirante.webp"
    alt="Caminho estreito cercado por árvores"
    width="1200"
    height="800"
  >
  <figcaption>Início do percurso até o Mirante.</figcaption>
</figure>

adding-an-about-page-3.webp — A legenda acrescenta contexto enquanto o texto alternativo descreve a imagem

Unidade 4 Caminhos entre pastas

Quando uma página entra em uma subpasta, os caminhos relativos mudam. Considere esta estrutura.

PLAINTEXT

caderno-trilhas/
├── index.html
├── sobre.html
├── css/
│   └── styles.css
├── imagens/
│   └── trilha-mirante.webp
└── blog/
    ├── index.html
    └── primeira-caminhada.html

Em index.html, a folha de estilo está abaixo da pasta atual.

HTML

<link rel="stylesheet" href="css/styles.css">

Em blog/index.html, o arquivo precisa subir um nível antes de entrar em css.

HTML

<link rel="stylesheet" href="../css/styles.css">

O mesmo vale para voltar à página Sobre.

HTML

<a href="../sobre.html">Sobre</a>

adding-a-blog-5.webp — Dois pontos e uma barra sobem um nível na árvore de pastas

Caminho relativo e caminho a partir da raiz

Um caminho relativo depende da localização do arquivo atual. Um caminho iniciado por / parte da raiz do site publicado.

HTML

<a href="/sobre.html">Sobre</a>
<link rel="stylesheet" href="/css/styles.css">

Caminhos a partir da raiz facilitam menus compartilhados, mas podem falhar quando você abre o HTML diretamente do disco ou publica o projeto dentro de uma subpasta. Nesta fase, use caminhos relativos. O capítulo de PHP mostrará uma forma de trabalhar com raiz em um servidor local.

Unidade 5 Blog estático

Um blog pode existir sem banco de dados. Crie uma página para listar artigos e um arquivo para cada publicação. A manutenção é manual, mas a estrutura é transparente e adequada para um projeto pequeno.

PLAINTEXT

blog/
├── index.html
├── 2026-09-10-primeira-caminhada.html
└── 2026-09-18-organizando-as-notas.html

adding-a-blog-1.webp — O blog estático separa a listagem dos arquivos de artigo

Página inicial do blog

Use uma lista de artigos. <time> registra uma data num formato legível por máquinas pelo atributo datetime.

HTML

<main>
  <h1>Notas recentes</h1>

  <article>
    <h2>
      <a href="2026-09-10-primeira-caminhada.html">
        Como planejei uma caminhada curta
      </a>
    </h2>
    <p><time datetime="2026-09-10">10 de setembro de 2026</time></p>
    <p>Um roteiro simples para sair cedo e voltar antes do almoço.</p>
  </article>
</main>

adding-a-blog-2.webp — Título data resumo e link ajudam a escolher o que ler

Artigo individual

Um post pode usar <article> como recipiente principal. Coloque o título em <h1>, a data em <time> e as seções em <h2>.

HTML

<main>
  <article>
    <header>
      <h1>Como planejei uma caminhada curta</h1>
      <p><time datetime="2026-09-10">10 de setembro de 2026</time></p>
    </header>

    <p>A preparação começou com um mapa simples e uma previsão do tempo.</p>

    <h2>Escolha do percurso</h2>
    <p>O trajeto precisava caber no tempo disponível e ter saída conhecida.</p>

    <p><a href="index.html">Voltar para o blog</a></p>
  </article>
</main>

adding-a-blog-3.webp — O elemento article envolve um conteúdo que pode ser lido de forma independente

Ordem das publicações

Em um blog estático, você decide a ordem no HTML da listagem. Colocar a data no nome do arquivo ajuda a ordenar arquivos, mas o navegador não cria a lista automaticamente. Quando publicar um artigo, atualize também blog/index.html.

Unidade 6 Elementos de texto

Citações

Use <blockquote> para uma citação em bloco. O atributo cite pode guardar a URL da fonte, mas ele normalmente não fica visível; forneça a origem também no texto.

HTML

<blockquote cite="https://example.com/texto">
  <p>A melhor rota é aquela que você consegue concluir com segurança.</p>
  <footer><cite>Guia de caminhada de demonstração</cite></footer>
</blockquote>

adding-a-blog-4.webp — A citação em bloco tem função própria e não deve ser usada apenas para recuo visual

Para uma obra ou título citado no meio do texto, use <cite>. Para uma frase curta, use <q>.

HTML

<p>O guia recomenda <q>começar pelo percurso conhecido</q>.</p>

Código e texto pré formatado

<code> identifica código. <pre> preserva espaços e quebras. Combine os dois para um bloco.

HTML

<pre><code>&lt;h1&gt;Caderno de Trilhas&lt;/h1&gt;</code></pre>

No conteúdo textual, escape os sinais < e > para que o navegador não tente interpretar a demonstração como marcação.

Abreviações e definições

HTML

<p><abbr title="HyperText Markup Language">HTML</abbr> estrutura a página.</p>
<p><dfn>URL</dfn> é o endereço de um recurso na web.</p>

O atributo title não substitui uma explicação visível. Ele pode ser difícil de acessar em telas sensíveis ao toque. Explique termos importantes no próprio texto.

Marcação de alterações

<mark> destaca um trecho relevante no contexto. <del> indica algo removido e <ins> algo inserido.

HTML

<p>Horário: <del>8h</del> <ins>7h30</ins>.</p>
<p>Leve <mark>dois litros de água</mark> em dias quentes.</p>

Não use essas tags apenas para escolher cor. O significado deve fazer sentido mesmo sem CSS.

Separação temática

<hr> representa uma mudança de assunto dentro de um conteúdo. Não é uma ferramenta genérica para desenhar linhas. Para bordas decorativas, use CSS.

Unidade 7 Conteúdo expansível e complementar

<details> cria uma área que pode ser aberta e fechada. <summary> define o controle visível. O navegador fornece interação por mouse e teclado sem JavaScript.

HTML

<details>
  <summary>O que levar numa caminhada curta</summary>
  <p>Água, proteção solar, documento e mapa salvo no telefone.</p>
</details>

Use essa dupla para perguntas frequentes, detalhes opcionais e explicações longas. Não esconda uma informação necessária para concluir uma tarefa.

Conteúdo complementar

<aside> é apropriado quando o trecho tem relação com o conteúdo, mas pode ser removido sem quebrar a ideia principal.

HTML

<aside>
  <h2>Vocabulário</h2>
  <p>Desnível é a diferença de altitude ao longo do percurso.</p>
</aside>

Se o texto faz parte do argumento central, use um parágrafo ou uma seção comum.

Unidade 8 Tabelas

Tabelas servem para dados que precisam ser comparados por linhas e colunas. Não use <table> para montar o layout de uma página.

HTML

<table>
  <caption>Comparação de percursos</caption>
  <thead>
    <tr>
      <th scope="col">Percurso</th>
      <th scope="col">Distância</th>
      <th scope="col">Nível</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Mirante</th>
      <td>4 km</td>
      <td>Leve</td>
    </tr>
    <tr>
      <th scope="row">Cachoeira</th>
      <td>9 km</td>
      <td>Moderado</td>
    </tr>
  </tbody>
</table>

adding-a-fun-page-2.webp — Cabeçalhos claros permitem relacionar cada valor com sua coluna

<caption> identifica a tabela. <thead> agrupa o cabeçalho e <tbody> agrupa os dados. <tr> cria uma linha, <th> uma célula de cabeçalho e <td> uma célula de dado. scope="col" e scope="row" tornam a relação mais explícita para leitores de tela.

Células combinadas

colspan faz uma célula ocupar colunas; rowspan faz ocupar linhas. Use com cautela, pois tabelas muito complexas são difíceis de entender em tela pequena e com tecnologia assistiva.

HTML

<tr>
  <th colspan="3">Percursos de fim de semana</th>
</tr>

Quando os dados não precisam de comparação entre eixos, uma lista ou conjunto de parágrafos costuma ser mais claro.

Unidade 9 Currículo em HTML

Um currículo web combina seções, datas, listas e links. O exemplo é fictício e serve apenas para praticar marcação.

HTML

<main>
  <article>
    <header>
      <h1>Currículo de demonstração</h1>
      <p>Desenvolvimento web e produção de conteúdo.</p>
    </header>

    <section>
      <h2>Conhecimentos</h2>
      <ul>
        <li>HTML semântico</li>
        <li>CSS responsivo</li>
        <li>Acessibilidade básica</li>
      </ul>
    </section>

    <section>
      <h2>Projetos selecionados</h2>
      <article>
        <h3>Caderno de Trilhas</h3>
        <p>Site estático criado durante este curso.</p>
      </article>
    </section>
  </article>
</main>

adding-a-resume-1.webp — Um currículo web usa a mesma estrutura semântica de outras páginas

Datas e contato

Use <time> quando a data ou período for relevante. <address> identifica informações de contato relacionadas ao autor da página ou do artigo; ele não serve para qualquer endereço postal mencionado no texto.

HTML

<p><time datetime="2024-03">Março de 2024</time> até o presente</p>

<address>
  <a href="mailto:contato@example.com">contato@example.com</a>
</address>

adding-a-resume-2.webp — Resumo experiência projetos e formação criam uma ordem de leitura previsível

Preparar para impressão

A mesma página pode receber regras @media print para esconder navegação e remover fundos. Não coloque dados sensíveis no arquivo esperando que o CSS os esconda; código e conteúdo continuam disponíveis.

CSS

@media print {
  nav,
  footer {
    display: none;
  }

  body {
    max-width: none;
    color: #000;
    background: #fff;
  }
}

adding-a-resume-3.webp — O conteúdo continua o mesmo e o CSS adapta a apresentação para o papel

Unidade 10 Formulários acessíveis

Um formulário recolhe dados, mas o HTML sozinho não decide onde eles serão guardados. O atributo action aponta o endereço que processará o envio, e method define como os dados serão transmitidos.

HTML

<form action="/enviar-contato" method="post">
  <p>
    <label for="nome">Nome</label>
    <input id="nome" name="nome" type="text" autocomplete="name" required>
  </p>

  <p>
    <label for="email">E-mail</label>
    <input id="email" name="email" type="email" autocomplete="email" required>
  </p>

  <p>
    <label for="mensagem">Mensagem</label>
    <textarea id="mensagem" name="mensagem" rows="6" maxlength="1000" required></textarea>
  </p>

  <button type="submit">Enviar mensagem</button>
</form>

css-basics-08.webp — Cada campo tem um rótulo visível ligado pelo par for e id

Label id e name

for="email" no <label> aponta para id="email" no campo. Essa associação permite clicar no rótulo para focar o controle e faz o leitor de tela anunciar o nome correto. name é a chave enviada ao servidor.

Tipos de campo

Para opções relacionadas, use <fieldset> e <legend>.

HTML

<fieldset>
  <legend>Como prefere receber a resposta</legend>

  <label>
    <input type="radio" name="resposta" value="email" checked>
    E-mail
  </label>

  <label>
    <input type="radio" name="resposta" value="telefone">
    Telefone
  </label>
</fieldset>

Validação

required, minlength, maxlength, min, max e pattern criam restrições no navegador. Eles ajudam a pessoa a corrigir o preenchimento, mas não protegem o servidor. Todo dado recebido precisa ser validado novamente no lado do servidor.

HTML

<input
  id="codigo"
  name="codigo"
  type="text"
  minlength="4"
  maxlength="12"
  required
>

**ATENÇÃO: **Nunca confie em dados enviados pelo navegador. Validação em HTML melhora a experiência, mas pode ser contornada. O sistema que recebe os dados deve validar, limitar e tratar cada valor.

Unidade 11 Consistência e manutenção

Em um site estático, o menu costuma ser repetido em todas as páginas. Quando adicionar um item, procure por <nav na pasta inteira e atualize cada ocorrência. O editor permite busca e substituição entre arquivos.

Lista de páginas

Use Tab para percorrer links, botões e campos. O foco precisa ser visível. A ordem deve seguir a leitura da página. Ative um link com Enter e um botão com Enter ou Espaço. Se algum controle depende apenas do mouse, há um problema.

Conteúdo sem estilo

Desative temporariamente o CSS nas ferramentas do navegador. A página ainda deve ter títulos em ordem, listas coerentes, rótulos e uma sequência de leitura natural. Essa prova simples mostra se o HTML carrega o significado, em vez de depender da aparência.

Atualização no servidor

Ao publicar novas páginas, envie também a navegação modificada, o CSS e as imagens usadas. Se o site possui cinco cópias do menu e só quatro foram atualizadas, a experiência ficará inconsistente.

Unidade 12 Projeto e avaliação

Etapa prática

Amplie o projeto iniciado na primeiro capítulo. Crie:

Teste de caminhos

Abra cada página e confirme:

**1. **O CSS carrega tanto na raiz quanto na pasta blog.

**2. **Todos os itens do menu abrem o destino correto.

**3. **A página atual recebe aria-current="page".

**4. **Imagens continuam visíveis nas subpastas.

**5. **O link de volta ao blog funciona dentro do artigo.

Questões de revisão

**1. **Qual é a diferença entre <section> e <article>?

**2. **Por que <main> não deve envolver o menu compartilhado?

**3. **O que muda no caminho do CSS quando a página está dentro de blog?

**4. **Para que serve aria-current="page"?

**5. **Quando usar <blockquote>?

**6. **Por que <table> não deve montar o layout da página?

**7. **Qual é a função de scope="col" em um <th>?

**8. **Como o <label> se liga a um campo?

**9. **Por que a validação do navegador não substitui a validação no servidor?

Respostas comentadas

**1. **<section> agrupa uma parte temática; <article> representa conteúdo independente que pode ser lido ou distribuído sozinho.

**2. **<main> guarda o conteúdo principal exclusivo. Menu, cabeçalho global e rodapé repetem-se entre páginas.

**3. **O caminho precisa subir um nível: ../css/styles.css.

**4. **Ele identifica o item que representa a página aberta para pessoas e tecnologias assistivas.

**5. **Quando uma citação longa precisa ser separada do parágrafo ao redor.

**6. **Tabela expressa relações entre dados; usá-la para layout mistura apresentação com estrutura e prejudica adaptação e acessibilidade.

**7. **Informa que a célula é cabeçalho de uma coluna.

**8. **O for do <label> recebe o mesmo valor do id do controle.

**9. **A validação no navegador pode ser desativada ou contornada; o servidor deve tratar todo valor recebido como não confiável.

Referências técnicas