KingHost
Canais iMasters

Web Standards

Tabelas Semânticamente Corretas (Parte 02)

Bom pessoal, nessa segunda parte do artigo iremos trabalhar com a apresentação de tabelas e, inicialmente, vamos retirar o atributo border que inserirmos na primeira parte.

A tabela que iremos trabalhar tem o seguinte código:

<table summary="Tabela de produtos e preços">
<caption align="top">Tabela de Produtos</caption>
 <tr>
  <th scope="col">Produto</th>
  <th scope="col">Pre&ccedil;o</th>
 </tr>
 <tr>
  <td>Mouse USB </td>
  <td>R$ 25,00 </td>
 </tr>
 <tr>
  <td>Teclado Ergonomico </td>
  <td>R$ 30,00 </td>
 </tr>
 <tr>
  <td>Monitor 17" </td>
  <td>R$ 450,00 </td>
 </tr>
</table>

Em um browser essa tabela aparecerá sem bordas e não podermos ver exatamente como é a sua apresentação padrão, mas se visualizarmos essa tabela em um editor visual de HTML teremos uma idéia de como ela está sendo apresentada:

Imagem da Tabela visualizada no editor HTML

Existe um pequeno cellpading (atributo de espaçamento interno nas células) e cellspacing (atributo de espaçamento entre uma célula e outra) default. Mais a frente vamos alterar esses espaços com o CSS.

Inserindo Bordas

Vamos usar o seguinte código CSS para inserir bordas em nossa tabela:

.tabelas{
  border-color: #990000;
  border-style: solid;
  border-width: 1px;
  }
  .tabelas th, .tabelas td{
  border-color: #6633CC;
  border-style: solid;
  border-width: 1px;
}

Observações: Vou evitar usar os resumos das propriedades CSS (shorthands) para que o código fique mais legível e compreensível. Se você tiver um bom domínio de CSS sinta-se livre para escrever como quiser.

Antes de visualizarmos a tabela alterada é necessário inserir o atributo class com o valor tabelas dentro da tag <table>:

<table class="tabelas" summary="Tabela de produtos e preços ">

Agora sim poderemos visualizar o resultado:

Tabela com a propriedes CSS de borda alteradas

Coloquei as cores azul e vermelho para diferenciar bem a borda das células e da tabela. A tag <th> apesar de atuar como cabeçalho também é tratada como célula na apresentação.

Vamos resolver o problema dos espaçamento inserindo a propriedade border-colapse na classe .tabelas.

.tabelas{
    border-color: #990000;
    border-style: solid;
    border-width: 1px;
    border-collapse:collapse;
  }
 

Em alguns Browser que são mais fiéis aos padrões a tabela será exibida sem a borda vermelha:

No IE a tabela será exibida com a borda externa vermelha e a borda interna azul:

Para evitar esse tipo de problema, sempre defina as bordas da tabela e células da mesma cor:

.tabelas{
  border-color: #6633CC;
  border-style: solid;
  border-width: 1px;
  border-collapse:collapse;
  }
.tabelas th, .tabelas td{
  border-color: #6633CC;
  border-style: solid;
  border-width: 1px;
}

Mudando o cabeçalho

Para mudar o cabeçalho em nossa tabela é bem simples. Já que usamos uma estrutura mais otimizada com a tag <th> basta somente alterar as propriedades CSS desta tag. Vamos inserir um background cinza para o cabeçalho. Para isso vamos inserir a seguinte regra CSS:

.tabelas th{
  background-color:#CCCCCC;
}

Resultado:

Aterando o Caption

O caption por padrão é centralizado. Podemos o seu background, alinhamento, fonte etc. Existe uma propriedade CSS, caption-side, que permite até a mudança de posição do caption, mas eu meus testes funcionou somente no Firefox. Vamos mudar um pouco o nosso caption:

.tabelas caption{
  text-align: left;
  color:#0000CC;
  font-weight: bold;
}

Alternando a cor da linhas

Para criar o efeito visual de linhas alternadas, vamos criar duas classes com propriedades de background diferentes:

.tabelas .linhaAzul{
  background-color:#E6F3FF;
}
.tabelas .linhaCinza{
  background-color:#eeeeee;
}

Para visualizar a mudança é necessário inserir o atributo class nas tags <tr>:

<table class="tabelas" summary="Tabela de produtos e preços">
<caption align="top">Tabela de Produtos</caption>
 <tr>
  <th scope="col">Produto</th>
  <th scope="col">Preço</th>
 </tr>
 <tr class="linhaCinza">
  <td>Mouse USB </td>
  <td>R$ 25,00 </td>
 </tr>
 <tr class="linhaAzul">
  <td>Teclado Ergonômico </td>
  <td>R$ 30,00 </td>
 </tr>
 <tr class="linhaCinza">
  <td>Monitor 17" </td>
  <td>R$ 450,00 </td>
 </tr>
</table>

Ajustes Finais

Segue abaixo o código com algumas modificações de espaçamento e fonte:

.tabelas{
  border-color: #6633CC;
  border-style: solid;
  border-width: 1px;
  border-collapse:collapse;
}
.tabelas th, .tabelas td{
  border-color: #6633CC;
  border-style: solid;
  border-width: 1px;
  font-family:Verdana, Arial, Helvetica, sans-serif;
  font-size:12px;
  padding: 3px;
}
.tabelas th{
 background-color:#CCCCCC;
}
.tabelas caption{
  text-align: left;
  color:#0000CC;
  font-weight: bold;
  font-family:Verdana, Arial, Helvetica, sans-serif;
  font-size:12px;
  padding-bottom: 7px;
}
.tabelas .linhaAzul{
  background-color:#E6F3FF;
}
.tabelas .linhaCinza{
  background-color:#eeeeee;
}

Consideracões Finais

Nosso exemplo foi bem simples mas pode e deve ser aplicado em tabelas com maior quantidade de informações. Editores HTML criam uma apresentação errada de tabelas gerando atributos de apresentação. Quando usar editores de HTML procure otimizar o código manualmente.

Abraço a todos!


Comente também

21 Comentários

Leandro Vieira
Leandro Vieira

Legal Lauro, ta indo bem a sequência. Só não concordo com o seguinte: você cria as seguintes classes: .linhaAzul e .linhaCinza. Aí se futuramente a cor for alterada, o nome da classe perde completamente o sentido, somente.

Mauricio Samy
Mauricio Samy

Um esclarecimento necessário: O autor comete uma série de erros de sintaxe, uso indevido de código e emprego impróprio de escrita de regras CSS nesta matéria: 1-)A presença do atributo align:top para o elemento caption é uma prática ultrapassada, além de desnecessária - Não misture apresentação com marcação. 2-) O uso do atributo scope não é necessário em tabelas simples. Mesmo para tabelas complexas com dois ou mais níveis de cabeçalhos prefira usar id e headers em lugar de scope. 3-)A finalidade do atributo summary é a de fornecer uma descrição resumida da tabela e mais importante: descrever a estrutura da tabela. O summary usado pelo autor não diz e nem serve para nada. 4-) Declarações CSS que admitem abreviação devem ser abreviadas. Use border {1px solid #63c;} e não como o autor escreveu (que não está errado mas não é a melhor prática). 5-)Abrevie código de cores hexadecimais. 6-)Já apontada no comentário do Leandro: escolha nomes de classes e de ID's com a função desempenhada pelo elemento de marcação em mente e não com a apresentação ou forma ou renderização ou cor ou etc. 7-) Use codificação de caracteres unificada em seus documentos o autor escreveu preços e pre&ampccedil;os. 8-)Raros agentes de usuário ainda não honram a propriedade border-collapse. Se você vai servir suas tabelas para um deles (o que é muito pouco provável), use o atributo cellspacing=0. Este é o único caso que eu me lembro onde é tolerável um atributo de apresentação dentro da marcação.

Lauro Santos
Lauro Santos

Leandro e Mauricio Samy. Obrigado pelos comentários críticos logo em primeira mão no artigo. Já que vocês me deram o previlégio de uma análise tão minunciosa sobre o meu artigo, também estarei dissecando as suas colocações.
Se vocês analisarem em primeira mão a questão da didática que é esquecida pelas maioria dos tecnologos ao escrever os seus artigos é o foco deste artigo, dois "erros" apontados por vocês, com um pouco de boa vontade, seriam vistos como abordagem didática.
A linhaAzul e linhaCinza foram usados para melhorar a compreenssão das classes. Se eu colocasse .primeiraLinha e segundaLinha também não estaria errado?


No Itens 1 e 8 apontados por Maurício, ele se contradiz. O uso do atributo align:top não é uma prática ultrapassada já que o IE6 não suporta a propriedade caption-side do CSS. Já que não podemos usar o align porque usar o atributo "cellspacing=0" (vale salientar que os valores dos atributos devem estar entre aspas)?. O atributo cellspacing, ao meu ver, é menos necessário que o atributo pois visa somente abranger "raros Browsers", o atributo align na tag caption visa oferecer suporte ao IE6 que ainda responde pela maioria dos usuários.

No Item 2 vale lembrar que a tabela é somente um pequeno exemplo de estrutura. Não conheço nenhuma literatura confiável que cite o atributo Scope como desnecessário. Como eu disse na primeira parte do artigo estarei falando sobre acessibilidade na terceira parte do artigo.

Item 3. Não entendi... Eu tenho a obrigação de criar uma descrição elaborada para um exemplo de um arquivo técnico?

Itens 4 e 5(?). Como o foco é didático preferi não resumir as propriedades. Gostaria de informar também que atributos resumidos não são bem intepretados em alguns dispositivos. Isso eu não achei em nenhum artigo de gringo. Posso afirmar com base em testes em celulares.

Item 6. Concordo que os nomes de seletores de Classe e ID devem possuir nomes focados no elemento e funcionalidade. Mas como disse acima o foco do artigo é a didática.

Item 7. Aqui finalmente uma observação que considero correta. Como estava escrevendo o código manualmente no Aptana não escrevi corretamente a codificação dos caracteres.

Vinicius Depizzol
Vinicius Depizzol

Olá, Lauro. Existem vários erros de formatação e marcação no seu artigo. ao invés de usar classe linhaCinza e linhaAzul, deveria usar algo mais semântico, como <tr> e <tr class="odd"> (odd == ímpar). Cores como #CCC ao invés de #CCCCCC também iriam bem, além do agrupamento de estilos de borda (border: 1px solid #CCC; ao invés de border-color: #CCC; border-style: solid; border-width:1px;).

Lauro Santos
Lauro Santos

Olá Vinicius. Dá uma olhadinha na minha resposta acima. Correta a colocação do par e impar, mas porque não escrever para e impar mesmo no lugar do termo em inglês?
Abraço

Marcelo Rodrigues
Marcelo Rodrigues

Não seria uma matéria relacionada a Webstandards, e não a técnica do tableless?

Walter Cruz
Walter Cruz

Posso estar enganado, mas TABLELESS não significa SEM TABELA? Se for, não vejo motivo pra este artigo ser publicado na seção TABLELESS, visto que ele trata justamente de algo que deveria evitar tratar: tabelas. Algo mais apropriado seria postá-lo numa seção CSS, por exemplo.

No mais, achei o texto bem didátivo, apesar dos erros de síntaxe apontados pelo Maurício Samy (o que é perfeitamente perdoável se levarmos em conta a finalidade didática do artigo).

Abraços!

Luiz Gustavo Rocha Soares
Luiz Gustavo Rocha Soares

Parabéns por essa série de artigos.
Já no primeiro vi coisas bem interessantes quanto ao uso das tabelas, tag bem úteis que não são utilizadas, tanto que passei a utilizar algumas.

Sobre as críticas: eu apoio seu enfoque didático.

o/

yuri nascimento
yuri nascimento

Walter Cruz: Tabelas não são mais usadas para montar o layout mas dados tabulares como mostrado nos exemplos acima são completamente dentro dos padroes ... (no uso de tabela)

Rafael Ritter
Rafael Ritter

Fala-se tanto em HTML semântico e as pessoas esquecem de analisar a semântica do que lêem. Se o fizessem, teriam pensado 2 vezes antes de postar algumas considerações.

Parabéns pelo seu artigo, muito útil e esclarecedor.

Daniel Guimarães Ferreira
Daniel Guimarães Ferreira

Lauro,

parabéns pelo artigo. Bem didático e explicativo. Garanto que é mto útilo para aqueles que ainda estão iniciando.

Maurício Samy, algumas observações interessantes mas a maioria desnecessária. A seção de comentários não é para aparecer... a maioria dos seus pontos poderiam ter sido tratadas em privado com o autor.

Quanto ao nome genérico da linha... nessa caso NÃO EXISTE... não se põe a cor como identificador pq eu posso mudá-la.. e se eu quiser depois usar a classe ímpar na linha par? Isso não existe... identifique de uma forma lógica... IDENTIFIQUE.. apenas isso.. os metidos a entendido vão estudar um pouco de Análise e Desenvolvimento... vão estudar conceitos de Orientação a Objetos...

A única observação realmente válida é a questão do Tableless... que tb comprei gato por lebre... Mas até q a opinião do Yuri me convenceu...rs

Washington Campos
Washington Campos

Parabéns pelo ditatismo da matéria. Para quem não entendeu o seu objetivo, sugiro reler o texto.

emerson lopes
emerson lopes

Já que estes artigos devem ser analisados e "palpitados" minuciosamente, convido o Sr. Mauricio Samy a postar algum artigo de seu conhecimento, o qual NÃO deverá haver 1(um) mínimo quesito ou erro a se discutir. Caso todos os comentaristas avaliem seu artigo como Ótimo e obtenha avaliação 5 estrelas, farei coro para que todos os comentaristas desta matéria que criticaram sua avaliação do Lauro,peçam desculpas e lhe digam "Ave, Samy!"

Leonardo dos Santos Paula
Leonardo dos Santos Paula

Opa Blz?

Parabéns pelo seu Artigo... ajudou realmente a esclarecer diversas Dúvidas. Abraços!

João Melo
João Melo

Lauro muito bom seu artigo!
Para alguns o não uso de tabelas para layout pode ser coisa do "passado" isso é completamente errôneo ao meu ver, mas cada um cada um.
Seu artigo está muito bem explicado para quem está aprendendo, é melho LinhaAmarela do que TD.LY

Raphael Martins
Raphael Martins

http://raphamartins.com/2007/02/16/jihad/

Não acredito que a tabela esteja tão errada assim. Como o próprio autor colocou, o código tem um fim didático, antes de tudo. Ao invés de falar que o autor comete uma "série de erros de sintaxe", bastaria mostrar seu ponto de vista como opinião, e não como verdade.

Abraço

Roberto Rabadan
Roberto Rabadan

Acredito que o comentário Esclarecimento é feito numa linha muito pouco amigável e muito tendenciosa, fazendo uma exposição negativa muito forte do próprio comentador. Que entre nós, nunca me pareceu capaz de tal feito. Simplesmente mudei minha idéia sobre algumas pessoas.

Valter Dias
Valter Dias

Como professor, avalio como positiva a explanação de Lauro. Ele deixa claro que alguns termos citados podem ser substituído por outros, de acordo com nossos conhecimentos e predileções.

Sobre o posicionamento deste artigo dentro de "Tableless" (tradução fiel para "sem tabela"), ele justifica no artigo de mesmo nome, porém "parte 1": Minha intenção aqui é mostrar alguns recursos para tabelas de dados tabulares. Segundo o W3C, o uso de tabelas é permitido para "dados tabulares", não para organização de layout.

E como citado logo acima, é bom colocarmos nossas opiniões, não nossas verdades.

Guilherme Maia
Guilherme Maia

Lauro,


Muito bom esse teu artigo cara! Tá de Parabéns!!!!!
Muito interessante como o professor Valter tambem ressaltou logo, que você diz que os termos podem ser substituidos!Parabéns !





Guilherme Maia

Web Designer Demétrios Martins
Web Designer Demétrios Martins

Com esta matéria abriu meus horizontes na hora de trabalhar com tabelas, com essas tags posso diminuir a quantidade de classes numa tabela e também aumentar a personalização da mesma.

Meu site: www.mdesigner.com.br

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.
KingHost

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize