Imagem Destaque
Criado em

Tabelas no HTML

Tabelas continuam sendo essenciais na web quando o objetivo é exibir dados estruturados em linhas e colunas.
Neste post, você vai entender como usar as principais tags de tabela do HTML com semântica, organização, acessibilidade e clareza.

O que são tabelas no HTML?

Tabelas são estruturas usadas para representar dados tabulares.

Isso significa informações que fazem sentido quando organizadas em:

No HTML, tabelas não existem para montar layout visual da página.
Elas existem para exibir dados que realmente possuem natureza tabular.


Quando faz sentido usar uma tabela?

Uma tabela faz sentido quando o conteúdo depende da leitura cruzada entre linhas e colunas.

Casos comuns?

Exemplo de dado tabular?

PlanoPreçoSuporte
BásicoR$ 99E-mail
ProR$ 199Chat
PremiumR$ 399Prioritário

Esse tipo de conteúdo faz sentido em tabela porque cada valor depende da relação com sua coluna e sua linha.


Quando não faz sentido usar tabela?

Não use tabela para:

Por quê?

Porque layout é responsabilidade de CSS, não de tabela.

Regra prática?

Se o conteúdo não precisa de leitura em linhas e colunas, provavelmente não deve ser tabela.


O que é a tag <table>?

A tag <table> é o container principal da tabela.

Ela envolve toda a estrutura tabular.

Exemplo básico?

<table>
  <tr>
    <th>Plano</th>
    <th>Preço</th>
  </tr>
  <tr>
    <td>Básico</td>
    <td>R$ 99</td>
  </tr>
</table>

O que normalmente pode existir dentro de table?


O que é a tag <caption>?

A tag <caption> representa o título ou legenda da tabela.

Ela ajuda a identificar o conteúdo de forma clara.

Exemplo?

<table>
  <caption>
    Comparação de planos
  </caption>
  <tr>
    <th>Plano</th>
    <th>Preço</th>
  </tr>
  <tr>
    <td>Básico</td>
    <td>R$ 99</td>
  </tr>
</table>

Por que caption é importante?

Porque ajuda:

Regra prática?

Se a tabela precisa ser compreendida rapidamente, caption costuma ser muito útil.


O que é a tag <thead>?

A tag <thead> agrupa o cabeçalho da tabela.

É nela que normalmente ficam os títulos das colunas.

Exemplo?

<table>
  <thead>
    <tr>
      <th>Plano</th>
      <th>Preço</th>
      <th>Suporte</th>
    </tr>
  </thead>
</table>

Por que isso é útil?

Porque separa semanticamente o cabeçalho do restante dos dados.

Benefícios?


O que é a tag <tbody>?

A tag <tbody> agrupa o corpo principal da tabela.

É nela que normalmente ficam as linhas de dados.

Exemplo?

<table>
  <tbody>
    <tr>
      <td>Básico</td>
      <td>R$ 99</td>
      <td>E-mail</td>
    </tr>
    <tr>
      <td>Pro</td>
      <td>R$ 199</td>
      <td>Chat</td>
    </tr>
  </tbody>
</table>

Por que usar tbody?

Porque deixa claro onde estão os dados centrais da tabela.


O que é a tag <tfoot>?

A tag <tfoot> agrupa o rodapé da tabela.

Ela é útil para totais, resumos, observações ou encerramento do conjunto de dados.

Exemplo?

<table>
  <tfoot>
    <tr>
      <td>Total</td>
      <td>R$ 298</td>
      <td>-</td>
    </tr>
  </tfoot>
</table>

Quando usar?

Casos comuns:


O que é a tag <tr>?

A tag <tr> representa uma linha da tabela.

Exemplo?

<tr>
  <td>Básico</td>
  <td>R$ 99</td>
</tr>

Onde tr aparece?

Dentro de:

Regra prática?

Cada conjunto horizontal de células é uma linha, então cada linha é um tr.


O que é a tag <th>?

A tag <th> representa uma célula de cabeçalho.

Ela identifica o título de uma coluna ou de uma linha.

Exemplo de cabeçalho de coluna?

<tr>
  <th>Plano</th>
  <th>Preço</th>
  <th>Suporte</th>
</tr>

Exemplo de cabeçalho de linha?

<tr>
  <th>Básico</th>
  <td>R$ 99</td>
  <td>E-mail</td>
</tr>

Por que th é importante?

Porque ela não é apenas uma célula “em negrito”. Ela define semanticamente que aquele conteúdo é cabeçalho.

Isso ajuda:


O que faz o atributo scope em <th>?

O atributo scope ajuda a indicar a qual grupo aquele cabeçalho se refere.

Os valores mais comuns são:

Exemplo com cabeçalho de coluna?

<th scope="col">Plano</th>

Exemplo com cabeçalho de linha?

<th scope="row">Básico</th>

Por que isso importa?

Ajuda tecnologias assistivas a entenderem com mais precisão a relação entre cabeçalhos e células.

Regra prática?

Sempre que possível, use scope em th.


O que é a tag <td>?

A tag <td> representa uma célula comum de dado.

Exemplo?

<td>R$ 99</td>

Quando usar?

Use td para valores que são dados da tabela, não cabeçalhos.

Diferença entre th e td?


O que é a tag <colgroup>?

A tag <colgroup> agrupa colunas da tabela.

Ela é útil para configuração estrutural ou estilização por coluna.

Exemplo?

<table>
  <colgroup>
    <col />
    <col class="coluna-preco" />
  </colgroup>
</table>

Quando usar?

Quando quiser:

Observação?

Ela não é obrigatória em toda tabela, mas pode ser útil em tabelas maiores ou mais controladas.


O que é a tag <col>?

A tag <col> representa uma coluna dentro de colgroup.

Exemplo?

<colgroup>
  <col style="width: 40%" />
  <col style="width: 30%" />
  <col style="width: 30%" />
</colgroup>

Quando usar?

Quando precisar aplicar configuração por coluna.


Como montar uma tabela simples e correta?

Exemplo?

<table>
  <caption>
    Comparação de planos
  </caption>

  <thead>
    <tr>
      <th scope="col">Plano</th>
      <th scope="col">Preço</th>
      <th scope="col">Suporte</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Básico</th>
      <td>R$ 99</td>
      <td>E-mail</td>
    </tr>
    <tr>
      <th scope="row">Pro</th>
      <td>R$ 199</td>
      <td>Chat</td>
    </tr>
    <tr>
      <th scope="row">Premium</th>
      <td>R$ 399</td>
      <td>Prioritário</td>
    </tr>
  </tbody>
</table>

O que esse exemplo tem de bom?


Como montar uma tabela com rodapé?

Exemplo?

<table>
  <caption>
    Resumo de vendas
  </caption>

  <thead>
    <tr>
      <th scope="col">Produto</th>
      <th scope="col">Quantidade</th>
      <th scope="col">Total</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Curso A</th>
      <td>12</td>
      <td>R$ 1.200</td>
    </tr>
    <tr>
      <th scope="row">Curso B</th>
      <td>8</td>
      <td>R$ 800</td>
    </tr>
  </tbody>

  <tfoot>
    <tr>
      <th scope="row">Total geral</th>
      <td>20</td>
      <td>R$ 2.000</td>
    </tr>
  </tfoot>
</table>

Quando isso é útil?

Quando a tabela precisa de fechamento com total ou resumo.


Como montar uma tabela com colunas configuradas?

Exemplo?

<table>
  <colgroup>
    <col style="width: 40%" />
    <col style="width: 30%" />
    <col style="width: 30%" />
  </colgroup>

  <caption>
    Status de projetos
  </caption>

  <thead>
    <tr>
      <th scope="col">Projeto</th>
      <th scope="col">Status</th>
      <th scope="col">Prazo</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Site institucional</th>
      <td>Em andamento</td>
      <td>20/03/2026</td>
    </tr>
    <tr>
      <th scope="row">Landing page</th>
      <td>Concluído</td>
      <td>05/03/2026</td>
    </tr>
  </tbody>
</table>

Como pensar em acessibilidade em tabelas?

Tabelas mal estruturadas podem ser difíceis de interpretar, especialmente para tecnologias assistivas.

Boas práticas?

Por que isso importa?

Porque uma pessoa usando leitor de tela precisa entender:


Tabela simples ou lista? Como decidir?

Essa dúvida é comum.

Use tabela quando?

Houver relação entre linhas e colunas.

Use lista quando?

O conteúdo for apenas uma enumeração simples sem estrutura cruzada.

Exemplo que talvez não precise ser tabela?

Exemplo que pede tabela?

Regra prática?

Se a leitura depende de cruzar linha e coluna, é tabela.


Como lidar com tabelas grandes?

Tabelas extensas exigem ainda mais cuidado.

Boas práticas?

Importante?

Mesmo quando a tabela é correta semanticamente, o volume de dados pode exigir atenção de interface e CSS para leitura confortável.


O que evitar em tabelas?

Usar tabela para layout?

Esse é um erro clássico.

Misturar cabeçalhos e dados sem critério?

Isso quebra clareza e acessibilidade.

Não usar th quando existe cabeçalho?

Você perde semântica.

Não identificar a tabela?

Sem caption, algumas tabelas ficam pouco claras.

Criar tabelas desnecessárias?

Nem todo conjunto de informação merece virar tabela.

Colocar conteúdo demais em uma célula?

Pode dificultar leitura e entendimento.


Como decidir se uma célula deve ser th ou td?

Faça perguntas simples?

Essa célula nomeia uma coluna?

Use th.

Essa célula nomeia uma linha?

Use th.

Essa célula apenas apresenta um valor?

Use td.

Exemplo prático?

<tr>
  <th scope="row">Plano Pro</th>
  <td>R$ 199</td>
  <td>Chat</td>
</tr>

Nesse caso:


Como estruturar uma tabela de preços?

Exemplo?

<table>
  <caption>
    Tabela de preços dos serviços
  </caption>

  <thead>
    <tr>
      <th scope="col">Serviço</th>
      <th scope="col">Prazo</th>
      <th scope="col">Valor inicial</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Landing page</th>
      <td>7 dias úteis</td>
      <td>R$ 1.500</td>
    </tr>
    <tr>
      <th scope="row">Site institucional</th>
      <td>15 dias úteis</td>
      <td>R$ 3.500</td>
    </tr>
    <tr>
      <th scope="row">Loja virtual</th>
      <td>25 dias úteis</td>
      <td>R$ 5.500</td>
    </tr>
  </tbody>
</table>

Por que esse formato funciona?

Porque permite comparar claramente serviço, prazo e valor.


Como estruturar uma tabela de agenda?

Exemplo?

<table>
  <caption>
    Agenda semanal
  </caption>

  <thead>
    <tr>
      <th scope="col">Dia</th>
      <th scope="col">Horário</th>
      <th scope="col">Atividade</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Segunda</th>
      <td>09:00</td>
      <td>Reunião de alinhamento</td>
    </tr>
    <tr>
      <th scope="row">Terça</th>
      <td>14:00</td>
      <td>Apresentação do projeto</td>
    </tr>
  </tbody>
</table>

Como estruturar uma tabela administrativa?

Exemplo?

<table>
  <caption>
    Status de clientes
  </caption>

  <thead>
    <tr>
      <th scope="col">Cliente</th>
      <th scope="col">Projeto</th>
      <th scope="col">Status</th>
      <th scope="col">Próxima etapa</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th scope="row">Empresa A</th>
      <td>Site institucional</td>
      <td>Em desenvolvimento</td>
      <td>Revisão de layout</td>
    </tr>
    <tr>
      <th scope="row">Empresa B</th>
      <td>Landing page</td>
      <td>Aguardando conteúdo</td>
      <td>Receber copy final</td>
    </tr>
  </tbody>
</table>

Quais são os erros mais comuns com tabelas?

Usar tabela como ferramenta de layout?

Esse é o erro mais conhecido.

Não usar th em cabeçalhos?

Isso enfraquece semântica e acessibilidade.

Ignorar scope?

Perde clareza para tecnologias assistivas.

Não identificar a tabela com caption quando necessário?

Pode dificultar entendimento.

Criar tabelas para conteúdo que deveria ser lista ou cards?

Nem todo conteúdo comparável precisa virar tabela.

Misturar estrutura de forma bagunçada?

Exemplo: cabeçalhos mal posicionados, colunas incoerentes, linhas sem padrão.


Como saber se devo usar tabela?

Faça perguntas simples?

Existe relação entre linhas e colunas?

Se sim, provavelmente é tabela.

O conteúdo precisa ser comparado em grade?

Se sim, provavelmente é tabela.

Cada dado depende de um cabeçalho de linha ou coluna?

Se sim, provavelmente é tabela.

O objetivo é apenas organizar visualmente?

Se sim, provavelmente não é tabela.


Subgrupo prático das principais tags de tabela

Estrutura principal?

Identificação?

Agrupamento?

Linha?

Cabeçalho?

Dado?

Configuração de coluna?


Subgrupo prático das estruturas mais comuns

Tabela simples?

<table>
  <tr>
    <th>Nome</th>
    <th>Valor</th>
  </tr>
  <tr>
    <td>Item</td>
    <td>100</td>
  </tr>
</table>

Tabela semântica mais completa?

<table>
  <caption>
    Resumo mensal
  </caption>
  <thead>
    <tr>
      <th scope="col">Mês</th>
      <th scope="col">Receita</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Janeiro</th>
      <td>R$ 10.000</td>
    </tr>
  </tbody>
</table>

Tabela com rodapé?

<table>
  <tfoot>
    <tr>
      <th scope="row">Total</th>
      <td>R$ 10.000</td>
    </tr>
  </tfoot>
</table>

Tabela com colgroup?

<table>
  <colgroup>
    <col style="width: 60%" />
    <col style="width: 40%" />
  </colgroup>
</table>

Resumo prático sobre tabelas

Estrutura principal?

Título da tabela?

Cabeçalho?

Corpo?

Rodapé?

Linhas?

Colunas configuradas?

Regras mais importantes?


Checklist rápido para revisar uma tabela

Antes de publicar, vale conferir?


Conclusão

Tabelas continuam sendo muito importantes quando usadas para o que realmente foram feitas: representar dados tabulares.

Quando você estrutura uma tabela corretamente, melhora:

Dominar tabelas no HTML é entender que nem toda grade visual é uma tabela, mas que toda informação verdadeiramente tabular merece uma estrutura adequada.

Depois desse tema, o próximo passo natural costuma ser aprofundar em: