Menu

Tabela HTML: linhas, colunas, cabeçalhos e legenda

Como fazer uma tabela em HTML: linhas com <tr>, células com <td>, células de cabeçalho com <th> e scope, legendas, thead, tbody e tfoot, linhas zebradas e tabelas que rolam em telas pequenas.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Como fazer uma tabela em HTML

Uma tabela é um elemento <table> formado por linhas (<tr>), e cada linha é formada por células: <th> para células de cabeçalho e <td> para células de dados.

A tabela não tem bordas próprias; a única regra CSS as adiciona para você ver as células. As colunas vêm das células: a primeira célula de cada linha é a coluna um, a segunda é a coluna dois, e assim por diante. Cada linha deve ter o mesmo número de células. Apague um <td> e aquela linha termina antes, deixando um buraco.

As células <th> ficam em negrito e centralizadas por padrão. Isso é só a aparência; o que importa é que elas são rótulos, que é o assunto da próxima seção.

Os elementos de tabela

ElementoO que é
<table>A tabela
<caption>O título da tabela, o primeiro filho de <table>
<thead>O grupo das linhas de cabeçalho
<tbody>O grupo das linhas do corpo (uma tabela pode ter vários)
<tfoot>O grupo das linhas de rodapé, como os totais
<tr>Uma linha
<th>Uma célula de cabeçalho
<td>Uma célula de dados
<colgroup>, <col>Colunas, para estilizar uma coluna inteira (larguras, fundo)

As bordas estão em borda da tabela HTML, e as células que ocupam várias colunas ou linhas em colspan e rowspan.

Células de cabeçalho, scope e legenda

Uma tabela com cabeçalhos no topo e na lateral precisa dizer para que lado cada cabeçalho aponta. scope="col" nomeia a coluna abaixo, scope="row" nomeia a linha ao lado. <caption> dá à tabela um título visível:

Com essa marcação, um leitor de tela que chega à célula 14:00 pode anunciar "Saturday, Closes, 14:00", então o número nunca é lido sozinho. Numa tabela simples com uma linha de cabeçalho, os navegadores normalmente descobrem os cabeçalhos sem scope, mas escrever não custa nada e elimina o palpite.

A legenda também é o que o leitor de tela anuncia quando chega à tabela. Prefira-a a um título colocado acima da tabela, que não fica ligado a ela.

thead, tbody e tfoot

Os três grupos dividem as linhas em cabeçalho, corpo e rodapé. O rodapé é o lugar dos totais:

Dois detalhes deixam os números legíveis: text-align: end alinha as casas decimais (todo preço tem duas casas), e font-variant-numeric: tabular-nums dá a todos os dígitos a mesma largura.

Se você escreve <tr> direto dentro de <table>, como no primeiro exemplo, o navegador adiciona um <tbody> em volta das linhas mesmo assim. Por isso um seletor CSS como table > tr nunca encontra nada: na página, as linhas estão dentro de tbody. Use table tr, ou escreva o <tbody> você mesmo.

Estilizando uma tabela: zebrado, hover e largura

:nth-child alterna a cor das linhas, :hover destaca a linha sob o ponteiro e width: 100% estica a tabela pela largura do contêiner:

text-align: start alinha o texto do cabeçalho com os dados abaixo; sem isso, o th fica centralizado. start em vez de left mantém o alinhamento correto em idiomas da direita para a esquerda.

Tabelas responsivas que rolam

Uma tabela não consegue ficar mais estreita que o seu conteúdo. No celular, uma tabela larga empurra a página inteira para o lado. Envolva-a num contêiner que rola:

O contêiner está limitado a 300 pixels aqui para simular a tela de um celular; role-o para o lado. tabindex="0" permite que quem usa teclado coloque o foco no contêiner e role com as setas, e role="region" com um aria-label dá um nome a essa parada.

Tabelas são para dados

Use uma tabela quando o conteúdo tem mesmo linhas e colunas: preços, horários, comparações, resultados. Não use tabela para colocar coisas lado a lado na página. Tabelas de layout confundem os leitores de tela, que anunciam linhas e colunas sem sentido, e não se adaptam a telas pequenas. Layout se faz com flexbox e grid do CSS.

Erros comuns

  • Linhas com números diferentes de células. As linhas curtas terminam antes e as colunas deixam de se alinhar.
  • Usar <td> com texto em negrito como cabeçalho. Use <th> para que os cabeçalhos sejam rótulos de verdade.
  • Os atributos obsoletos border, cellpadding, cellspacing, bgcolor e align. Use CSS.
  • Colocar conteúdo direto em <tr> ou <table>, fora de qualquer célula. Os navegadores o tiram da tabela, normalmente para cima dela.
  • Um título acima da tabela em vez de um <caption>.
  • table > tr no CSS. O navegador inseriu um <tbody>; escreva table tr ou tbody tr.

Perguntas frequentes

Como criar uma tabela no HTML?

Envolva tudo em <table>, escreva um <tr> por linha e coloque as células dentro: <th> para células de cabeçalho e <td> para células de dados. Toda linha deve ter o mesmo número de células, a não ser que algumas ocupem várias colunas.

Qual a diferença entre th e td?

<th> é uma célula de cabeçalho que nomeia uma coluna ou linha, e <td> é uma célula de dados. Os navegadores mostram <th> em negrito e centralizado, e os leitores de tela leem o cabeçalho correspondente antes de cada célula de dados para que os números façam sentido.

Para que servem thead, tbody e tfoot?

Eles agrupam as linhas no cabeçalho, no corpo e no rodapé (totais) da tabela. Deixam a estrutura clara para as tecnologias assistivas, dão ao CSS algo para mirar e, quando uma tabela longa é impressa, os navegadores podem repetir o <thead> em cada página.

Por que minha tabela HTML não tem bordas?

Tabelas não têm bordas por padrão. Adicione com CSS: table { border-collapse: collapse; } th, td { border: 1px solid #ccc; }. O antigo atributo border="1" está obsoleto.

Como deixar uma tabela HTML responsiva?

Coloque a tabela num contêiner com overflow-x: auto. Numa tela estreita, a tabela rola para os lados dentro do contêiner em vez de alargar a página inteira.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR