O comando principal para criar uma tabela é <table>, similar ao <ul> usado para listas. Dentro da tabela, usamos <tr> para definir linhas e <td> para definir células (colunas) dentro dessas linhas.
<tr>: Representa uma linha da tabela. Cada <tr> equivale a uma linha e dentro dele colocamos as células <td>.
<td>: Representa uma célula dentro de uma linha. Cada <td> contém os dados da célula.
Observe que todas as linhas possuem a mesma quantidade de células <td>. Se uma linha tiver mais ou menos células, isso pode causar desalinhamento visual na tabela. Veja o exemplo abaixo:
A1
B1
C1
D1
A2
B2
C2
D2
A3
B3
C3
A4
B4
C4
D4
E4
Observe que a terceira linha tem uma célula a menos e a quarta linha tem uma célula(<td>) a mais.
Portanto, é importante entender que a tag <td> representa uma célula dentro de uma linha, e não uma coluna inteira. Embora visualmente pareça que <td> define colunas, na verdade, cada <td> é uma célula específica dentro de uma linha. Como desenvolvedor web, você deve saber que <td> define células de linha, e não colunas completas.
Estilos para Tabelas
Existem muitos estilos que podem ser aplicados em tabelas, como bordas, alinhamentos, efeitos zebrados, fixar linha e coluna. Vamos ver cada um deles.
Aplicando Bordas em Tabelas
Para aplicar bordas em tabelas, você pode usar a propriedade CSS border diretamente nas células da tabela (<td>). No entanto, fazer isso manualmente para cada célula pode ser muito trabalhoso. Uma abordagem mais eficiente é definir um estilo CSS que se aplique a todas as células da tabela de uma vez. Veja o exemplo abaixo:
É importante lembrar que, para obter o efeito de colapso das bordas, é necessário declarar a propriedade border com o valor solid para os elementos <td> na folha de estilo.
Alinhamentos em tabela
Para alinhar o texto horizontalmente, usamos a propriedade text-align e para alinhar o texto verticalmente, usamos a propriedade vertical-align. Ambas as propriedades devem ser aplicadas diretamente nas células da tabela (<td>). Veja os exemplos abaixo:
Para aplicar esse estilo em várias células de uma tabela específica, sem afetar todas as demais tabelas, você pode usar um seletor de ID ou classe para a tabela e, em seguida, aplicar o estilo apenas às células dessa tabela. Veja o exemplo abaixo:
O código CSS para aplicar o estilo apenas às células dessa tabela é:
O efeito zebrado em tabelas é uma técnica que utiliza a pseudo-classe :nth-child para aplicar estilos alternados às linhas da tabela, facilitando a leitura dos dados. Abaixo estão algumas formas de usar essa pseudo-classe:
:nth-child(2n): Aplica o estilo a cada segunda linha, ou seja, uma linha sim, outra não.
:nth-child(3n): Aplica o estilo a cada terceira linha.
:nth-child(3n-1): Divide a tabela em grupos de 3 em 3 linhas, então ele volta 1 linha nesse caso e aplica o estilo, podendo voltar mais que 3 e, nesse caso, ele aplica o estilo no grupo anterior.
:nth-child(odd): Aplica o estilo às linhas ímpares.
:nth-child(even): Aplica o estilo às linhas pares.
Assim como no Excel, onde podemos congelar a primeira linha da tabela para manter os títulos das colunas visíveis, podemos fazer o mesmo em HTML. Para isso, basta aplicar o estilo position: sticky; e top: 0; na linha que deseja fixar. Veja o exemplo abaixo:
Caption
Aluno
Nota 1
Nota 2
Nota 3
João
8.5
7.0
9.0
Maria
9.0
8.5
9.5
Carlos
7.5
6.0
8.0
Ana
8.0
7.5
8.5
O código HTML para criar essa tabela é:
<thead style="position: sticky; top: 0;">
Neste exemplo, o estilo foi aplicado diretamente na tag <thead>, mas você também pode aplicar o estilo na tag <tr> para obter o mesmo efeito.
OBS.: Caso fique um espaço entre o navegador e o <thead>, você pode ajustar o valor de top com valores negativos como: top: -2px; até que o espaço desapareça.
Tabela Responsiva
Criar tabelas responsivas é uma tarefa simples. Basta envolver a tabela em uma <div> e aplicar a classe responsiva a essa <div>. No estilo CSS, defina a propriedade overflow-x: auto; para a <div>. Veja o exemplo abaixo:
OBS.: A largura (width) foi definida para exemplificar como a tabela se ajusta.
Quando você usa uma tabela dentro de um contêiner, a propriedade `position: sticky` pode parar de funcionar. Isso ocorre porque o elemento pai do elemento sticky precisa ter uma altura definida para que o comportamento sticky funcione corretamente. Se o contêiner não tiver uma altura definida ou se houver overflow, o navegador pode não conseguir calcular corretamente a posição sticky.
Mesclagem de células
Mesclar células em uma tabela é uma tarefa simples que pode ser realizada usando dois atributos: colspan e rowspan. Esses atributos são adicionados à tag <td>. Veja a explicação abaixo:
colspan="2": Este atributo mescla a célula atual com a próxima célula à direita, formando uma única célula que ocupa o espaço de duas colunas. Você pode aumentar o número para mesclar mais colunas.
rowspan="3": Este atributo mescla a célula atual com as próximas duas células abaixo, formando uma única célula que ocupa o espaço de três linhas. Você pode aumentar o número para mesclar mais linhas.
O objetivo de trabalhar com tabelas semânticas é organizar melhor os dados. A W3C recomenda o uso desse tipo de tabela sempre que for trabalhar com tabelas grandes e com muitos dados. Além disso, o Google valoriza essa semântica, o que pode melhorar o SEO do seu site.
As tabelas semânticas possuem algumas diferenças em relação às tabelas comuns. Elas incluem:
<caption>: Título da tabela
<thead>: Cabeçalho da tabela
<tbody>: Corpo da tabela
<tfoot>: Rodapé da tabela
Essas diferenças ajudam a separar visualmente e semanticamente os dados dos títulos e resumos, facilitando a leitura e a interpretação da tabela.
Além disso, temos a tag <th>, que é usada no lugar de <td> para definir títulos de colunas ou linhas:
<th>: Table Header (Títulos das colunas ou das linhas)
<td>: Table Data (Dados da tabela)
O <th> não precisa estar apenas no escopo da tag <thead>; ele pode estar no <tbody> para ser o título de uma linha também.
Scope
O atributo scope é usado no <th> para indicar se ele é o título de uma linha, coluna ou grupo de linhas ou colunas. Isso é importante para melhorar o SEO e a acessibilidade da tabela.
scope="col": Usado para títulos de colunas
scope="colgroup": Usado quando o título abrange mais de uma coluna
scope="row": Usado para títulos de linhas
scope="rowgroup": Usado quando o título abrange mais de uma linha
Quando queremos aplicar estilos a colunas inteiras em uma tabela, a tag <colgroup> é muito útil. Ela nos permite definir estilos para colunas específicas sem precisar aplicar estilos individualmente a cada célula (<td>).
Vamos ver como usar a tag <colgroup> na prática.
Exemplo de Uso
Primeiro, vamos definir a estrutura da tabela no corpo do HTML:
O resultado final será uma tabela com colunas coloridas de acordo com os estilos definidos:
A1
B1
C1
D1
A2
B2
C2
D2
A3
B3
C3
D3
A4
B4
C4
D4
Atributo para col
Assim como as tags <td> e <th> possuem os atributos colspan e rowspan para mesclar células, a tag <col> possui o atributo span. Esse atributo permite aplicar o mesmo estilo a várias colunas adjacentes.
O uso do atributo span é simples. Veja o exemplo abaixo:
Repare que a coluna com a classe "B" expandiu para duas colunas, aplicando o estilo de fundo azul-violeta a ambas. A coluna com a classe "D" não teve seu estilo aplicado, pois a coluna "B" ocupou seu espaço.