Tags semânticas do HTML5: guia completo com exemplos

Como o HTML semântico deixa a estrutura da página mais clara para pessoas e máquinas, onde melhora a acessibilidade e por que ele não é um atalho para ranqueamento.

Antes do HTML5, a web era um mar de divs e spans com classes CSS como .header, .sidebar, .footer. Os buscadores e os leitores de tela precisavam adivinhar o que era cada coisa. O HTML5 trouxe as tags semânticas — elementos que carregam significado por si mesmos, independentemente do CSS. A tag <article> indica conteúdo autossuficiente. A tag <nav> indica navegação. A tag <aside> indica conteúdo complementar, relacionado ao principal, mas não essencial para entendê-lo.

Semântica ≠ estilo. Uma tag semântica descreve o papel de um elemento no documento, não a sua aparência. A aparência é trabalho do CSS. <section> e <div> são visualmente idênticos sem estilos — a diferença é que o navegador e o buscador sabem coisas sobre <section> que não conseguem saber sobre <div>.

Tags estruturais da página

O HTML5 introduziu um conjunto de tags para marcar grandes regiões da página. Elas formam o esqueleto do documento, que navegadores, buscadores e tecnologias assistivas conseguem percorrer sem ler o CSS.

Diagrama visual da estrutura semântica de uma página HTML5.
<header>
Conteúdo introdutório do contexto de seção mais próximo — da página ou de uma seção. No nível da página: o cabeçalho do site, com logo, navegação e busca. Dentro de <article>: o título, os metadados e o autor. Vários elementos <header> são válidos na mesma página, desde que pertençam a seções diferentes.
<nav>
Um bloco de links de navegação. Nem todo conjunto de links é <nav> — apenas as rotas principais de navegação: menu principal, breadcrumbs, paginação. Links do rodapé para a política de privacidade não são <nav>. Leitores de tela usam <nav> para um atalho de teclado que leva direto à navegação.
<main>
O conteúdo principal e exclusivo da página. Só existe um <main> por documento. O conteúdo de <main> não deve se repetir em outras páginas (cabeçalhos, rodapés e barras laterais se repetem, por isso ficam fora de <main>). Leitores de tela pulam direto para <main> com um atalho de teclado.
<footer>
A seção de encerramento do contexto de seção mais próximo. No nível da página: contatos, direitos autorais, links. Dentro de <article>: informações do autor, tags, data da última atualização. Assim como <header>, pode aparecer em várias seções.
<article>
Conteúdo autossuficiente e distribuível de forma independente: um post de blog, uma notícia, uma publicação de fórum, um cartão de produto ou um comentário. O teste principal: se você tirar o <article> do contexto e publicá-lo sozinho, ele faz sentido? Se faz, é um <article>.
<section>
Uma parte do documento com coesão temática e sem uma tag mais específica. Deve sempre ter um título (<h2>–<h6>). Se não houver título, provavelmente <div> é a escolha certa. Não use <section> como substituto estilizado de <div>.
<aside>
Conteúdo indiretamente relacionado ao principal: caixas de destaque, barras laterais, blocos de anúncio, biografias de autores, artigos relacionados. Dentro de <article>: uma nota ou citação não crítica para entender o texto principal. No nível da página: uma coluna lateral.

O esqueleto básico de qualquer página tem esta forma — e isso já é uma marcação semanticamente correta:

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Page title</title>
</head>
<body>

  <header>
    <a href="/"><img src="logo.svg" alt="Company name"></a>
    <nav aria-label="Main navigation">
      <ul>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contacts">Contacts</a></li>
      </ul>
    </nav>
  </header>

  <main>
    <!-- Unique page content -->
  </main>

  <footer>
    <p>&copy; 2026 Company name</p>
    <nav aria-label="Secondary navigation">
      <a href="/privacy">Privacy</a>
      <a href="/sitemap">Sitemap</a>
    </nav>
  </footer>

</body>
</html>

Tags de conteúdo: article, section, h1–h6, p

As tags de nível estrutural definem as regiões da página. As tags de nível de conteúdo descrevem a natureza do próprio conteúdo. Veja a combinação que aparece em toda página de blog.

html
<!-- Blog post page -->
<main>

  <article>
    <header>
      <h1>How to choose the right HTML tag</h1>
      <p>Published: <time datetime="2026-05-22">22 May 2026</time></p>
      <address>
        By: <a rel="author" href="/authors/pavlo">seohead</a>
      </address>
    </header>

    <section>
      <h2>Why semantics matters</h2>
      <p>Section text...</p>
    </section>

    <section>
      <h2>Main tags</h2>
      <p>Section text...</p>

      <aside>
        <p>Note: the HTML Living Standard is continuously updated.</p>
      </aside>
    </section>

    <footer>
      <p>Tags: <a href="/tags/html">#html</a>, <a href="/tags/seo">#seo</a></p>
    </footer>
  </article>

  <!-- Related articles -->
  <aside aria-label="Related articles">
    <h2>Also read</h2>
    <ul>
      <li><a href="/blog/heading-structure">Heading structure</a></li>
      <li><a href="/blog/schema-org-json-ld">Schema.org markup</a></li>
    </ul>
  </aside>

</main>
Atenção: <header> e <footer> dentro de <article> não são o mesmo que <header> e <footer> da página. São contextos de seção separados. Os buscadores entendem essa distinção e atribuem o título, a data e o autor ao artigo específico, e não ao site como um todo.

Quando usar section e quando usar div

A regra é simples: se o bloco tem um nome semântico, use <section>. Se ele existe só para estilo ou como gancho para JavaScript, use <div>.

html
<!-- CORRECT: section with a heading -->
<section>
  <h2>Product benefits</h2>
  <ul>
    <li>Fast delivery</li>
    <li>2-year warranty</li>
  </ul>
</section>

<!-- CORRECT: div for styling -->
<div class="cards-grid">
  <article>...</article>
  <article>...</article>
  <article>...</article>
</div>

<!-- WRONG: section with no heading -->
<section class="cards-grid">
  <article>...</article>
</section>

<!-- WRONG: div where content has meaning -->
<div id="about">
  <!-- The About section — this should be <section> -->
  <h2>About us</h2>
  <p>...</p>
</div>

Tags de mídia, dados e utilitários

O HTML5 adicionou tags para tipos específicos de dados — elas dão sinais extras aos buscadores sem precisar de marcação Schema.org.

<figure> e <figcaption>

Conteúdo de mídia autossuficiente, com legenda. Imagens, diagramas, tabelas, trechos de código — tudo o que se relaciona ao texto principal e poderia ser movido ou colocado em um anexo sem perder o sentido. <figcaption> é a legenda oficial de um <figure>. O Google usa <figcaption> como descrição complementar da imagem ao analisar imagens.

<time>

Uma data ou hora legível por máquina. O atributo datetime, no formato ISO 8601, permite que o buscador determine com precisão a data de publicação ou de um evento, independentemente de como ela aparece para o usuário. O Google recomenda explicitamente usar <time> para datas de artigos nos dados estruturados do tipo Article.

<address>

Informações de contato do <article> mais próximo ou do documento como um todo. Dentro de <article>: os dados de contato do autor. No nível da página: as informações de contato da organização. Não use <address> para endereços postais fora do contexto de contato do autor ou da organização.

<details> e <summary>

Um widget nativo de seção recolhível, sem JavaScript. <summary> é o título visível. <details> guarda o conteúdo oculto. O navegador cuida de abrir e fechar automaticamente. Os buscadores indexam o conteúdo dentro de <details> mesmo quando ele está fechado. Ótimo para FAQs e spoilers.

<mark>

Destaca o texto como relevante no contexto atual — por exemplo, resultados de busca ou palavras-chave em uma citação. Não confunda com <strong> (importância) nem com <em> (ênfase). <mark> significa “marcado como relevante”, e não “importante” nem “estilizado como decoração”.

<data> e <output>

<data value="42">Quarenta e dois</data> relaciona um texto legível por pessoas a um valor legível por máquinas. <output> representa o resultado de um cálculo ou de uma ação do usuário. As duas tags são raras em sites de conteúdo, mas essenciais em aplicações web com formulários e calculadoras.

Exemplo de marcação da tag <figure> com legenda:
html
<!-- figure + figcaption for an image -->
<figure>
  <img
    src="/images/html5-structure.webp"
    alt="Diagram of the semantic structure of an HTML5 page"
    width="800" height="450"
  >
  <figcaption>Fig. 1 — Typical semantic structure of an HTML5 document</figcaption>
</figure>

<!-- figure + figcaption for code -->
<figure>
  <pre><code class="language-html">&lt;article&gt;...&lt;/article&gt;</code></pre>
  <figcaption>Example: minimal article markup</figcaption>
</figure>

<!-- time with datetime attribute -->
<p>
  Article updated:
  <time datetime="2026-05-22T10:30:00+03:00">22 May 2026</time>
</p>

<!-- details + summary (FAQ without JS) -->
<details>
  <summary>What is semantic HTML?</summary>
  <p>Markup where each tag conveys the meaning of the content,
     not just its visual appearance.</p>
</details>

<!-- mark for search highlighting -->
<p>Results for "<mark>semantic tags</mark>" — 42 articles</p>

Aninhamento e combinações: exemplos reais

O poder semântico do HTML5 não está nas tags isoladas, mas na combinação correta delas. Vamos ver as arquiteturas típicas de página.

Página de listagem do blog

html
<main>
  <header>
    <h1>SEO blog</h1>
    <p>Practical articles on website promotion</p>
  </header>

  <!-- Article list — each card is an article -->
  <section aria-label="Article list">
    <article>
      <header>
        <h2><a href="/blog/semantic-html5">HTML5 semantic tags</a></h2>
        <p>
          <time datetime="2026-05-22">22 May 2026</time>
          · <span>18 min read</span>
        </p>
      </header>
      <p>HTML5 semantic tags are the foundation of correct page markup...</p>
      <footer>
        <a href="/blog/semantic-html5">Read more</a>
      </footer>
    </article>

    <article>
      <header>
        <h2><a href="/blog/heading-structure">Heading structure</a></h2>
        <p>
          <time datetime="2026-04-10">10 April 2026</time>
          · <span>12 min read</span>
        </p>
      </header>
      <p>One H1 per page. H2 divides content into sections...</p>
      <footer>
        <a href="/blog/heading-structure">Read more</a>
      </footer>
    </article>
  </section>

  <!-- Pagination -->
  <nav aria-label="Pagination">
    <a href="?page=1" aria-current="page">1</a>
    <a href="?page=2">2</a>
    <a href="?page=3">3</a>
  </nav>
</main>

Cartão de produto com avaliações

html
<main>
  <article itemscope itemtype="https://schema.org/Product">

    <!-- Product main area -->
    <header>
      <h1 itemprop="name">SoundMax Pro Wireless Headphones</h1>
      <p itemprop="description">40 hours of battery life, active noise cancellation...</p>
    </header>

    <!-- Product image -->
    <figure>
      <img
        src="/products/soundmax-pro.webp"
        alt="SoundMax Pro wireless headphones — front view"
        itemprop="image"
        width="600" height="600"
      >
      <figcaption>SoundMax Pro in three colours: black, white, blue</figcaption>
    </figure>

    <!-- Price -->
    <section aria-label="Price and purchase">
      <p>
        <data value="129" itemprop="price">$129</data>
      </p>
      <button type="button">Add to cart</button>
    </section>

    <!-- Specs -->
    <section>
      <h2>Specifications</h2>
      <dl>
        <dt>Battery life</dt><dd>40 hours</dd>
        <dt>Connection</dt><dd>Bluetooth 5.3</dd>
        <dt>Weight</dt><dd>250 g</dd>
      </dl>
    </section>

    <!-- Reviews — each review is an article inside article -->
    <section aria-label="Customer reviews">
      <h2>Reviews</h2>

      <article>
        <header>
          <strong>Anna K.</strong>
          <time datetime="2026-04-15">15 April 2026</time>
        </header>
        <p>Excellent headphones, clean sound. The noise cancellation works brilliantly.</p>
      </article>

      <article>
        <header>
          <strong>Michael R.</strong>
          <time datetime="2026-03-28">28 March 2026</time>
        </header>
        <p>The 40-hour claim is real. Took them on a business trip and they lasted the week.</p>
      </article>
    </section>

  </article>
</main>

Landing page com seções e barra lateral

html
<body>
  <header>
    <nav aria-label="Main navigation">
      <!-- logo + menu -->
    </nav>
  </header>

  <main>
    <!-- Hero section -->
    <section aria-labelledby="hero-title">
      <h1 id="hero-title">SEO promotion for your business</h1>
      <p>We help businesses improve technical and content foundations</p>
      <a href="#contacts" role="button">Get a free audit</a>
    </section>

    <!-- Services -->
    <section>
      <h2>Our services</h2>
      <ul role="list">
        <li>
          <article>
            <h3>Technical audit</h3>
            <p>Full technical health check of your site...</p>
          </article>
        </li>
        <li>
          <article>
            <h3>Content strategy</h3>
            <p>Keyword universe and content calendar...</p>
          </article>
        </li>
      </ul>
    </section>

    <!-- Main content + sidebar -->
    <div class="layout-two-col">
      <section>
        <h2>Case studies</h2>
        <!-- ... -->
      </section>

      <aside aria-label="Contact us">
        <h2>Get in touch</h2>
        <address>
          <p>Email: <a href="mailto:hello@seohead.tech">hello@seohead.tech</a></p>
          <p>Telegram: <a href="https://t.me/seohead">@seohead</a></p>
        </address>
      </aside>
    </div>
  </main>

  <footer>
    <nav aria-label="Site map">
      <ul>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/glossary">Glossary</a></li>
      </ul>
    </nav>
    <p><small>&copy; 2026 seohead.tech</small></p>
  </footer>
</body>
No exemplo da landing page, usamos aria-labelledby para ligar uma seção ao seu título pelo id. Assim o leitor de tela consegue anunciar o nome da seção corretamente, mesmo quando o título é estilizado de forma incomum. É uma boa prática para todos os <section> e <nav> cujo nome não fica óbvio pela estrutura.
html
<!-- Multiple <nav> elements are fine — distinguish them with aria-label -->

<!-- Breadcrumbs -->
<nav aria-label="Breadcrumbs">
  <ol>
    <li><a href="/">Home</a></li>
    <li><a href="/blog">Blog</a></li>
    <li aria-current="page">HTML5 semantic tags</li>
  </ol>
</nav>

<!-- Main navigation inside <header> -->
<nav aria-label="Main navigation">
  <ul>
    <li><a href="/blog" aria-current="page">Blog</a></li>
    <li><a href="/services">Services</a></li>
  </ul>
</nav>

<!-- Pagination at the end of a listing -->
<nav aria-label="Blog pages">
  <a href="?page=1" rel="prev" aria-label="Previous page">←</a>
  <a href="?page=1">1</a>
  <span aria-current="page">2</span>
  <a href="?page=3">3</a>
  <a href="?page=3" rel="next" aria-label="Next page">→</a>
</nav>

<!-- In-page table of contents -->
<nav aria-label="Article contents">
  <ol>
    <li><a href="#structural-tags">Structural tags</a></li>
    <li><a href="#content-tags">Content tags</a></li>
    <li><a href="#nesting-examples">Nesting examples</a></li>
  </ol>
</nav>

Impacto no SEO: o que o buscador realmente recebe

A marcação semântica dá aos navegadores e às tecnologias assistivas informações estruturais mais claras. Ela pode tornar a página mais fácil de interpretar e de manter, mas não é um interruptor direto de ranqueamento nem um substituto para conteúdo útil.

Identificação do conteúdo principal

O Google usa <main> para identificar o conteúdo principal de uma página. O conteúdo do cabeçalho, do rodapé e de <aside> recebe menos peso no ranqueamento. Se todo o texto estiver dentro de <div class="main">, o Google precisa gastar mais recursos para entender a estrutura.

Atribuição de data e autor

<time datetime="2026-05-22"> dá ao Google uma data de publicação precisa, o que influencia a avaliação de atualidade. <address> com rel="author" vincula o artigo ao autor. Os dois sinais alimentam a geração de resultados avançados nas buscas.

Resultados avançados

O conteúdo de <details> + <summary> é indexado pelo Google e pode aparecer como blocos expansíveis nos resultados de pesquisa (People Also Ask). <figure> + <figcaption> influenciam a indexação de imagens e a forma como elas aparecem no Google Imagens.

Linkagem interna

Links dentro de <nav> recebem um contexto de navegação. Links dentro de <article> recebem um contexto de conteúdo. O Googlebot considera a posição do link na página ao avaliar seu peso. Um link do corpo de um <article> vale mais do que um link de um <aside>.

Schema.org (JSON-LD) e as tags semânticas do HTML5 são ferramentas complementares, não concorrentes. A semântica define a estrutura do documento. O Schema.org acrescenta dados legíveis por máquina sobre o tipo de conteúdo, as entidades e as propriedades. Juntos, eles dão ao Google uma visão completa da página.

Erros comuns na marcação semântica

A maioria dos erros vem do hábito de pensar primeiro em divs ou de não entender para que serve cada tag.

html
<!-- MISTAKE 1: <section> instead of <div> for styling -->
<section class="flex-wrapper">  <!-- no heading = not section -->
  <img src="photo.jpg" alt="">
</section>
<!-- CORRECT -->
<div class="flex-wrapper">
  <img src="photo.jpg" alt="Photo description">
</div>

<!-- MISTAKE 2: <article> for a card without standalone meaning -->
<article class="feature-card">
  <span class="icon">⚡</span>
  <h3>Fast delivery</h3>
</article>
<!-- CORRECT: a benefits card is li or div, not article -->
<li class="feature-card">
  <span class="icon" aria-hidden="true">⚡</span>
  <h3>Fast delivery</h3>
</li>

<!-- MISTAKE 3: <header> as a synonym for <div class="header"> -->
<header class="section-header">
  <h2>Our advantages</h2>
</header>
<!-- CORRECT: use <header> only when a section has an introductory group -->
<section>
  <h2>Our advantages</h2>  <!-- h2 directly, no header wrapper -->
  ...
</section>

<!-- MISTAKE 4: two <main> elements -->
<main>Primary content</main>
<main>Also important content</main>  <!-- invalid! -->
<!-- CORRECT: one <main>, supplementary content in <aside> -->
<main>Primary content</main>
<aside>Supplementary content</aside>

<!-- MISTAKE 5: <address> for an office address in body text -->
<address>1 High Street, London</address>  <!-- not in an author/org context -->
<!-- CORRECT -->
<p>Office address: 1 High Street, London</p>
<!-- or in footer as site contact information: -->
<footer>
  <address>
    <a href="mailto:hello@company.com">hello@company.com</a>
  </address>
</footer>
O erro mais comum é usar <section> como um nome elegante para um bloco de encapsulamento sem valor semântico. Teste rápido: se você pode trocar <section> por <div> sem que o significado mude, a tag correta é <div>.

Outro problema frequente são os atributos alt vazios ou ausentes. Imagens dentro de <figure> precisam ter um alt com sentido ou alt="" (se a imagem for decorativa e já estiver descrita pelo <figcaption>). Nunca omita o atributo alt por completo: isso viola os padrões de acessibilidade e a validação HTML.

html
<!-- Decorative image: empty alt, figcaption describes it -->
<figure>
  <img src="chart.png" alt="" role="presentation">
  <figcaption>Organic traffic growth over 6 months: +340%</figcaption>
</figure>

<!-- Informative image: full alt text -->
<figure>
  <img
    src="html5-tags-map.png"
    alt="Map of HTML5 semantic tags: header, nav, main, article, section, aside, footer"
  >
  <figcaption>Fig. 2 — Complete map of HTML5 semantic elements</figcaption>
</figure>

<!-- Mistake: no alt at all -->
<img src="diagram.png">  <!-- invalid! -->

Perguntas frequentes

A marcação semântica afeta diretamente o ranqueamento no Google?
Não existe um bônus separado por semântica. Use HTML semântico porque ele dá ao documento uma estrutura clara e apoia a acessibilidade; avalie o desempenho nas buscas considerando a página inteira, o conteúdo e as evidências técnicas, e não apenas a escolha de uma tag.
Dá para aninhar <article> dentro de outro <article>?
Sim, e isso está correto. O exemplo clássico: um cartão de produto (<article>) contém uma seção de avaliações, em que cada avaliação também é um <article>. Ou um post de blog (<article>) incorpora um post de rede social (<article>). Um <article> aninhado significa que o elemento interno é um conteúdo autossuficiente relacionado ao externo.
Qual é a diferença entre <strong> e <b>, e entre <em> e <i>?
<strong> marca o conteúdo como importante (leitores de tela dão ênfase a ele). <b> é só negrito estilístico, sem semântica de importância. <em> acrescenta uma ênfase verbal que muda o sentido (como na fala: “eu não disse que ele roubou”). <i> é itálico sem ênfase: termos técnicos, palavras estrangeiras, títulos. A diferença para o SEO é mínima; a diferença para a acessibilidade é significativa.
Preciso usar role="main" junto com a tag <main>?
Não. A tag <main> já tem o papel ARIA implícito 'main'. Adicionar role="main" é redundante. O mesmo vale para <nav> (papel navigation), para <header> no nível da página (papel banner) e para <footer> (papel contentinfo). Duplicar a tag e o papel só cria confusão na árvore de acessibilidade.
E as aplicações de página única (SPAs) em React ou Vue?
A semântica importa ainda mais. Como as SPAs geram o HTML dinamicamente, os rastreadores e os leitores de tela recebem a estrutura apenas pela renderização em JavaScript. Confira se, nas transições entre rotas, o <title> é atualizado, o foco vai para <main> e a estrutura semântica de cada 'página' é reproduzida corretamente. React e Vue não impedem o uso de semântica — é uma questão de disciplina da equipe.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it