jul
23
2009
2

Aviso aos navegantes

Pessoal,

Essa semana não teremos posts, pois estou com trabalho até as tampas. Enquanto isso me siga no Twitter.

Até semana que vem.

Abraços,
Diego.

jul
13
2009
1

Minicurso de HTML: Parte XII – Formulários Web: mais alguns elementos e atributos

Olá Pessoal,

Continuando com o assunto formulários web, falaremos hoje sobre mais alguns elementos e atributos, e dicas para criação de formulários acessíveis. Aproveitem bem o conteúdo e estudem com calma:

Elementos FIELDSET e LEGEND

No decorrer da nossa vida como profissionais de web (designers, programadores de interfaces, desenvolvedores etc.), construiremos desde simples formulários de contato, até complexos e extensos formulários de cadastro ou compra de produtos. E em todos os casos teremos a necessidade de agrupar os elementos de um formulário conforme características relacionadas. Já imaginou um formulário de cadastro onde os campos para dados pessoais se misturassem com os campos para dados profissionais, ou escolares? Sem uma distinção clara entre cada grupo de campos o formulário seria uma zona, aumentando em muito o tempo levado para preenchê-lo e a taxa de usuários que desistiriam.

Para agrupar os campos de um formulário com características comuns, utilizamos o elemento FIELDSET. Todos os campos serão englobados pelas tags <fieldset></fieldset>. Visualmente o elemento FIELDSET criará uma borda em torno dos elementos nele contidos, criando um bloco de conteúdo isolado de outros elementos. Se nosso formulário possuir vários elementos FIELDSET, teremos então várias caixas de elementos, separadas umas das outras. Cada elemento FIELDSET pode possuir uma legenda, ou seja, um texto indicando ao que se referem os elementos contidos nele (Ex: Dados Pessoais, Dados Escolares, Dados Residenciais, Dados Profissionais etc.). Essas legendas são marcadas pela tag LEGEND – <legend></legend>. Veja um exemplo dos elementos FIELDSET e LEGEND:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<form action="" method="post">
   <fieldset>
         <legend>Formulário de Contato</fieldset>
         <label for="nome">Nome:</label> <input type="text" id="nome" /><br />
         <label for="email">Email:</label> <input type="text" id="email" /><br />
         <label for="masc">MASC:</label> <input type="radio" name="masc" /> <label for="fem">FEM</label> 
         <input type="radio" name="sexo" id="fem" /><br />
         <label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" /><br />
         <label for="como">Como nos conheceu:</label> 
         <select id="como">
            <option>Google</option>
            <option>Indicação de amigo</option>
            <option>Outros</option>
         </select><br />
         <label for="msg">Mensagem:</label> <textarea cols="7" rows="40" id="msg"></textarea>
         <button type="submit">Enviar</button>
   </fieldset>  
</form>

Resultado:


Formulário de Contato








Antes de prosseguir, façam o seguinte exercício:

Entrem na página de cadastro do Mercado Livre e observem o formulário: esqueçam o layout e diagramação, e reconstruam esse formulário separando os elementos por FIELDSET e LEGEND (Dados Pessoais e Dados do Usuário no Mercado Livre).

Atributos NAME, ID e VALUE

Quem tem nos acompanhado desde o primeiro post sobre formulários, tem visto que utilizo em alguns momentos os atributos NAME, ID e VALUE, e sempre prometo que irei explicá-los “mais pra frente”. Pois bem, “mais pra frente” é agora! :D

Qualquer controle de formulário (INPUT, SELECT, TEXTAREA, BUTTON) permite ao usuário passar informações para o nosso site, e essas informações serão enviadas para algum script (em PERL, CGI, PHP, ASP.NET, JAVA etc.) que receberá os dados, verificá-los e por fim dará um fim ao formulário (envio por email, inserção num banco de dados etc.). Ok, mas como esse script saberá qual foi o valor digitado pelo usuário num campo de texto, por exemplo? Simples: quando clicamos no botão ENVIAR, mandamos uma espécie de catálogo de dados, onde cada campo do formulário corresponde a uma ficha desse catálogo. Essa ficha, por sua vez, é dividida em duas partes: índice (uma forma de referenciar o campo, e diferenciá-lo) e conteúdo (o valor digitado pelo usuário). Sabemos o que é o conteúdo, mas o que são os índices? O atributo NAME funciona como índice de um campo do formulário, ou seja, é o NAME do elemento que será referenciado pelo script responsável por processar o formulário.

Vários elementos HTML admitem o uso do atributo NAME (lembrem-se que utilizamos NAME para criação de links âncoras), assim como o atributo ID. Ambos os atributos tem uma única função: identificar um elemento. Simples assim! No caso dos controles de formulário, o atributo NAME tem uma função de integração com linguagens de programação para o tratamento de dados; assim como tanto NAME e ID podem ser usados como referência de elementos para JavaScript, CSS etc.

Ok! Qual é a diferença entre NAME e ID? O atributo ID funciona como “o CPF do elemento”, ou seja, não podem haver dois ou mais elementos, na mesma página, com o mesmo ID. Já o atributo NAME admite repetição, podemos ter vários elementos com o mesmo NAME. Por isso o elemento LABEL se vincula ao campo de formulário através do atributo ID… Veja um formulário com ambos os atributos ID e NAME:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="" method="post">
   <fieldset>
         <legend>Formulário de Contato</fieldset>
         <label for="nome">Nome:</label> <input type="text" id="nome" name="nome" /><br />
         <label for="email">Email:</label> <input type="text" id="email" name="email" /><br />
         <label for="masc">MASC:</label> <input type="radio" name="masc" /> <label for="fem">FEM</label> <input type="radio" name="sexo" id="fem" /><br />
         <label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" name="news" id="news" /><br />
         <label for="como">Como nos conheceu:</label> 
         <select id="como" name="como">
            <option>Google</option>
            <option>Indicação de amigo</option>
            <option>Outros</option>
         </select><br />
         <label for="msg">Mensagem:</label> <textarea cols="7" rows="40" id="msg" name="msg"></textarea>
         <button type="submit">Enviar</button>
   </fieldset>  
</form>

Muitos de vocês já viram formulários web que apresentam algum conteúdo dentro da caixa de texto, normalmente uma instrução de preenchimento. E nesse momento devem se perguntar: como posso fazer isso? Simples: basta adicionar o atributo VALUE em seus elementos. Veja como funciona:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="" method="post">
   <fieldset>
         <legend>Formulário de Contato</fieldset>
         <label for="nome">Nome:</label> <input type="text" id="nome" name="nome" value="Digite seu nome.." /><br />
         <label for="email">Email:</label> <input type="text" id="email" name="email"  value="Digite seu email..." /><br />
         <label for="masc">MASC:</label> <input type="radio" name="masc" id="masc" value="masc" /> <label for="fem">FEM</label> <input type="radio" name="sexo" id="fem" value="fem" /><br />
         <label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" name="news" id="news" value="" /><br />
         <label for="como">Como nos conheceu:</label> 
         <select id="como" name="como">
            <option>Google</option>
            <option>Indicação de amigo</option>
            <option>Outros</option>
         </select><br />
         <label for="msg">Mensagem:</label> <textarea cols="7" rows="40" id="msg" name="msg">O elemento textarea não possui o atributo VALUE</textarea>
         <button type="submit">Enviar</button>
   </fieldset>  
</form>

Resultado:


Formulário de Contato









Reparem que mesmo não exibindo nenhum texto na tela, usamos o atributo VALUE nos elementos INPUT RADIO, INPUT CHECKBOX e OPTION. Esses controles permitem ao usuário escolher uma ou mais opções, dentre uma lista, e o conteúdo do atributo VALUE será o valor enviado para o script de processamento do formulário, assim que o mesmo for disparado.

Atributos CHECKED e SELECTED

Podemos também apresentar um elemento INPUT CHECKBOX (aquelas caixinhas onde marcamos / desmarcamos com um clique) já preenchido, por padrão. Para isso basta adicionar o atributo CHECKED no elemento.

1
2
3
<form action="" method="post">
   <label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" name="news" id="news" value="news" checked="checked" />
</form>

Resultado:


Da mesma forma podemos escolher um elemento OPTION para aparecer selecionado, por padrão, dentro de um SELECT. Basta adicionar, ao OPTION, o atributo SELECTED. Veja como fica:

1
2
3
4
5
6
7
<form action="" method="post">
   <select id="como" name="como">
       <option value="google">Google</option>
       <option value="amigo">Indicação de amigo</option>
       <option value="outros" selected="selected">Outros</option>
   </select> 
</form>

Resultado:

Atributos READONLY e DISABLED

Existem situações em que o usuário não pode manipular um elemento de formulário. Imagine que você tem alguns campos para compor o endereço do usuário, e o usuário não poderá digitar diretamente o endereço, precisará primeiro preencher o CEP, e aí será feita uma consulta na base de endereços completando os demais campos (rua, cidade, estado etc.); ou então, você quer manter o botão de envio do formulário desabilitado, enquanto alguns campos não forem preenchidos. Enfim, não importa o seu motivo, se for necessário desativar elementos de um formulário, utilizaremos os atributos READONLY ou DISABLED.

READONLY é um atributo aplicado apenas nos elementos INPUT e TEXTAREA, e impede o usuário de editar o conteúdo da caixa de texto. O valor do campo será enviado para o script de processamento, assim como o usuário poderá dar foco normalmente no campo e a navegação via teclado funcionará normalmente. A única coisa que o usuário não poderá fazer é: editar o conteúdo.

DISABLED é um atributo aplicado nos elementos INPUT, TEXTAREA, SELECT, OPTGROUP, OPTION e BUTTON, e desabilita o campo do formulário, impedindo a edição do seu valor. Quando desabilitamos um campo, seu valor não será enviado junto com os demais campos do formulário, o usuário não conseguirá colocar o foco no campo e a navegação via teclado será desabilitada.

Veja um exemplo dos atributos READONLY e DISABLED:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="" method="post">
   <fieldset>
         <legend>Formulário de Contato</fieldset>
         <label for="nome">Nome:</label> <input type="text" id="nome" name="nome" value="Diego" readonly="readonly" /><br />
         <label for="email">Email:</label> <input type="text" id="email" name="email"  value="Digite seu email..." /><br />
         <label for="masc">MASC:</label> <input type="radio" name="masc" id="masc" value="masc" /> <label for="fem">FEM</label> <input type="radio" name="sexo" id="fem" value="fem" /><br />
         <label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" name="news" id="news" value="" /><br />
         <label for="como">Como nos conheceu:</label> 
         <select id="como" name="como" disabled="disabled">
            <option>Google</option>
            <option>Indicação de amigo</option>
            <option>Outros</option>
         </select><br />
         <label for="msg">Mensagem:</label> <textarea cols="7" rows="40" id="msg" name="msg">O elemento textarea não possui o atributo VALUE</textarea>
         <button type="submit">Enviar</button>
   </fieldset>  
</form>

Resultado:


Formulário de Contato









Por hoje é só, pessoal! No próximo post terminaremos essa parte sobre formulários web, falando um pouco sobre como incrementar a acessibilidade em nossos formulários. Até lá e bom estudo!

Abraços,
Diego.

jul
10
2009
0

Minicurso de HTML: Parte XII – Formulários Web: elementos de um formulário

Olá Pessoal,

Falamos anteriormente sobre o que são formulários web e o elemento INPUT. Hoje continuaremos a descrever os elementos que compõem um formulário. Então, mãos à obra:

Elementos SELECT, OPTION e OPTGROUP

Chamamos de SELECT aquelas caixinhas de seleção, onde ao pressionar uma seta para baixo, visualizamos uma lista de opções, dentre as quais escolheremos apenas uma. Para criar uma caixa de seleção, basta utilizar as tags <select></select>. Uma vez criada a caixa de seleção, utilizaremos o elemento OPTION para criar as opções a serem selecionadas. Cada opção será marcada pelas tags <option></optiont>. Veja o exemplo abaixo:

1
2
3
4
5
6
7
8
<form action="" method="post">
<select>
<option>HTML & XHTML</option>
<option>CSS</option>
<option>JavaScript</option>
<option>PHP</option>
</select>
</form>

Resultado:

Em caixas de seleção extensas, onde o usuário terá uma lista enorme de opções para escolha, pode ser interessante agrupar as opções que tenham relações entre si. Para criar grupos de opções, utilizaremos o elemento OPTGROUP. Veja como fica o código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<form action="" method="post">
<select>
<optgroup label="Camada Visual">
    <option>HTML & XHTML</option>
    <option>CSS</option>
    <option>JavaScript</option>
</optgroup>
<optgroup label="Programação">
    <option>PHP</option>
    <option>Phyton</option>
    <option>Ruby</option>
</optgroup>
<optgroup label="Banco de Dados">
    <option>Modelagem de Dados</option>
    <option>Linguagem SQL</option>
    <option>MySQL Server</option>
</optgroup>
</select>
</form>

Resultado:

Elemento TEXTAREA

Sabemos como criar caixas de texto com uma única linha mas, não temos idéia de como permitir ao usuário digitar uma mensagem em várias linhas. Para criar esse tipo de caixa de texto, usaremos o elemento TEXTAREA. Veja o código abaixo:

1
2
3
<form action="" method="post">
<textarea rows="7" cols="40"></textarea>
</form>

Resultado:


Os atributos ROWS e COLS definem o tamanho do TEXTAREA: ROWS fica responsável pela quantidade de linhas (altura); COLS define a quantidade de colunas (largura) da caixa de texto.

Elemento BUTTON

Podemos criar botões para nossos formulários, com muito mais liberdade do que o elemento INPUT. Com o uso do elemento BUTTON, podemos inserir conteúdo dentro de nossos botões: imagens, flash, texto etc. Veja o código abaixo:

1
2
3
4
<form action="" method="post">
<input type="text" /> 
<button type="submit">Enviar</button>
</form>

Resultado:


Usamos o atributo TYPE para definir o tipo do botão, possuímos três valores distintos para esse atributo: SUBMIT – cria um botão para envio de formulário; RESET – cria um botão para limpar todos os valores de um formulário; BUTTON – cria um botão associado a um evento do JavaScript, que normalmente inicia uma função do sistema (Ex: botões para inserção, alteração e exclusão de itens). Dentro das tags <button></button> podemos inserir qualquer tipo de conteúdo: imagens, flash, texto etc. Isso nos dá uma grande vantagem sobre o elemento INPUT, que é um elemento vazio.

Elemento LABEL

Com o que vimos até agora, podemos criar nossos formulários web. Já conhecemos o elemento INPUT e seus tipos, SELECT, TEXTAREA e BUTTON. Não construímos um formulário apenas enfileirando elementos, é preciso que cada campo possua um texto indicando como devemos preenchê-lo. Vamos montar um pequeno formulário de cadastro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form action="" method="post">
Nome: <input type="text" /><br />
Email: <input type="text" /><br />
Sexo: <input type="radio" name="sexo" />MASC 
<input type="radio" name="sexo" />FEM<br />
Deseja receber nossa newsletter: <input type="checkbox" /><br />
Como nos conheceu: <select>
   <option>Google</option>
   <option>Indicação de amigo</option>
   <option>Outros</option>
</select><br />
Mensagem: <textarea cols="7" rows="40"></textarea>
<button type="submit">Enviar</button>
</form>

Resultado:

Nome:
Email:
Sexo:
MASC

FEM
Deseja receber nossa newsletter:
Como nos conheceu:

Mensagem:

Antes de mais nada: o uso da tag BR não é aconselhável. Diagramação de elementos fica por conta do CSS, como já falamos anteriormente. Feito esse aviso, reflitam por um instante: visualmente, conseguimos associar a legenda NOME ao INPUT TEXT correspondente, mas, quando construímos um site, temos diversos perfis de visitantes e o conteúdo deve ser acessível a todos eles. A tag LABEL associa um elemento de formulário à sua legenda correspondente, essa tag possui um atributo chamado FOR, cujo valor deve ser igual ao valor do atributo ID do elemento referenciado pelo LABEL. Veja como funciona:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<form action="" method="post">
<label for="nome">Nome:</label> <input type="text" id="" /><br />
<label for="email">Email:</label> <input type="text" id="" /><br />
<label for="masc">MASC:</label> <input type="radio" name="masc" /> <label for="fem">FEM</label> 
<input type="radio" name="sexo" id="fem" /><br />
<label for="news">Deseja receber nossa newsletter:</label> <input type="checkbox" /><br />
<label for="como">Como nos conheceu:</label> 
<select id="como">
   <option>Google</option>
   <option>Indicação de amigo</option>
   <option>Outros</option>
</select><br />
<label for="msg">Mensagem:</label> <textarea cols="7" rows="40" id="msg"></textarea>
<button type="submit">Enviar</button>
</form>

Resultado:







Bom pessoal, por hoje é só! No próximo tutorial continuamos a falar sobre formulários web. Até lá.

Abraços,
Diego.

jul
07
2009
3

Parte XI – Formulários Web: Introdução e primeiros elementos

Olá Pessoal,

Hoje invadimos o fantástico mundo dos formulários web. Com o uso de formulários podemos criar mecanismos de interação do usuário com o site, desde caixas de busca até complexas fichas de cadastro e compra de produtos. Usamos formulários o tempo inteiro: para fazer login, buscas, cadastros, compras e enviar mensagens via fale conosco. Quando enviamos emails ou scraps no Orkut, pesquisamos no Google, participamos de fóruns e chats, em todos esses momentos fazemos uso de formulários web. Portanto, fiquem de olhos abertos e estudem com atenção, porque o assunto é MUITO IMPORTANTE.

Características Gerais

Veja o formulário abaixo:



Podemos perceber que esse formulário é composto de duas partes: uma caixa de texto e um botão. Todo formulário é composto por elementos ou controles, e o usuário interagirá com esses controles seja digitando dados, subindo arquivos, escolhendo opções etc. A primeira coisa que vocês precisam aprender: todo formulário é marcado pelas tags <form></form>, e dentro dessas tags são inseridos os controles do formulário. A tag <form> exige alguns atributos essenciais para o seu bom funcionamento:

  • ACTION: Declaramos a página de destino do formulário, ou seja o documento que receberá todos os dados inseridos pelo usuário. Essa página possuirá algum script, que verificará a consistência dos dados inseridos, e por fim enviará o formulário para seu destino (banco de dados, email etc.);
  • METHOD: Define a forma como enviaremos o formulário, ou seja como os dados serão transmitidos. Admite dois valores GET e POST.

Qual é a diferença entre GET e POST?

No método GET, enviamos os dados do formulário como parte da URL declarada no atributo ACTION. Imaginem um formulário com um campo apenas: texto_busca. Declaramos o atributo ACTION com o valor “processa_form.php” (essa página receberá os dados do formulário, verificará se está tudo ok e executará uma ação). Quando o usuário clicar no botão de disparo do formulário, o mesmo será enviado para a página declarada na ACTION, e o valor digitado dentro da caixa de texto fará parte da URL. Ficará assim: processa_form.php?texto_busca=valor digitado pelo usuário.

Quando você acessa o site do Google, na verdade, está pedindo uma permissão ao servidor do site. Seu navegador faz uma requisição ao servidor, pedindo acesso, o servidor decide se você pode ou não ver o site. Em linhas gerais, a coisa funciona mais ou menos assim. No método POST, os dados do formulário são enviados em anexo à essa requisição ao servidor. Tais dados são enviados de forma oculta, podendo ser criptografados e tratados por outros mecanismos de segurança.

Ok, a diferença entre um e outro todos já sabem, mas qual deles devemos usar? Existem uma série de fatores relacionados ao trabalho do programador, o que não é do nosso escopo. Simplificando o problema: usamos GET para formulários que exijam rapidez e poucos requisitos de segurança, tais como formulários de busca; e para todo o resto (login, cadastro, fale conosco, compras online etc.), usamos POST.

Elementos de um formulário: INPUT

Vamos aprender a escrever nossos formulários web, e conhecer seus principais elementos.

Caixa de texto simples – input text

Quando fazemos uma busca no Google, digitamos algo naquela caixa de texto e clicamos no botão “buscar”, e aí acessamos a página de resultados. Simples assim, né? Pois então, aquela caixa de texto é obtida pela tag HTML <input type=”text” />. A tag <input /> cria um campo de formulário para entrada de dados, com o atributo TYPE podemos criar diferentes tipos de campos, e a caixa de texto simples é um deles. Veja como ficaria o código abaixo:

1
2
3
<form action="" method="post">
<input type="text" />
</form>

Resultado:

Reparem que todos os elementos de um formulário ficam dentro das tags <form></form>. Não podemos usar nenhum controle, fora dessas tags.

Checkbox – input checkbox

Checkbox são aquelas caixas de seleção, onde marcamos ou desmarcamos uma opção. São campos de entrada de dados, onde o usuário assinala os campos que deseja responder com “SIM”, e deixa em branco aqueles que deseja marcar com “NÃO”. Veja o código abaixo:

1
2
3
<form action="" method="post">
<input type="checkbox" />
</form>

Resultado:

Radio buttons – input radio

O controle input radio permite ao usuário escolher apenas uma, dentre uma lista de opções. Ao contrário do controle input checkbox, onde o usuário pode escolher vários itens dentro de uma lista. Veja o código abaixo:

1
2
3
4
5
6
<form action="" method="post">
<input type="radio" name="form" />
<input type="radio" name="form" />
<input type="radio" name="form" />
<input type="radio" name="form" />
</form>

Resultado:

* Estudaremos mais adiante o atributo NAME.

Campo oculto – input hidden

Podemos armazenar informações sobre o usuário em campos ocultos de um formulário. Esses campos não serão renderizados pelo navegador, e são de grande importância para qualquer sistema dinâmico (que utiliza alguma linguagem de programação). Veja o código abaixo:

1
2
3
<form action="" method="post">
<input type="hidden" value="valor do campo oculto" />
</form>

* Estudaremos mais adiante o atributo VALUE.

Caixa de texto para senhas – input password

Já perceberam que quando vamos digitar uma senha em qualquer site, ao invés de aparecer o texto digitado, surgem pequenos marcadores (normalmente bolinhas escuras e preenchidas)? Pois é, não seria nada legal digitar nossas senhas, para que qualquer um possa ver na tela do nosso monitor. Podemos criar campos de formulários específicos para digitação de senhas. Veja o código abaixo:

1
2
3
<form action="" method="post">
<input type="password" />
</form>

Resultado:

Campo para upload de arquivos – input file

Em muitas situações precisamos anexar arquivos aos nossos formulários (uma foto, um arquivo de texto, uma planilha etc.). Nesses casos, sempre há um caixa de texto com um botão embutido, e ao clicar nele podemos escolher um arquivo qualquer em nosso computador, para fazer um upload. Para criar esse campo, basta seguir o código abaixo:

1
2
3
<form action="" method="post">
<input type="file" />
</form>

Resultado:

Botões – input submit e reset

Podemos também criar botões para enviar formulários, ou simplesmente apagar seus dados. Veja o código abaixo:

1
2
3
4
<form action="" method="post">
<input type="submit" value="ENVIAR" /> 
<input type="reset" value="LIMPAR" />
</form>

Resultado:

Bom pessoal, por hoje finalizamos! No próximo tutorial vamos terminar a lista de elementos de um formulário. Bom estudo e até lá!

Abraços,
Diego.

jul
06
2009
0

Minicurso de HTML: Parte X – Tabelas Complexas e Acessíveis

Olá Pessoal,

Para finalizar o assunto, vamos falar hoje sobre tabelas complexas. Até agora criamos tabelas simples, com apenas um cabeçalho, corpo e rodapé; porém, o XHTML nos fornece recursos para criar tabelas complexas, com várias cabeçalhos, rodapés e corpos. E nesse tipo de tabelas, temos mais uma série de tags e atributos para facilitar nosso trabalho, e incrementar a acessibilidade das mesmas. Arregacem as mangas e mãos à obra!

Reparem na tabela abaixo:

Tabela de Alunos
Turma A Turma B
Aluno 1º Bimestre 2º Bimestre 3º Bimestre 4º Bimestre Aluno 1º Bimestre 2º Bimestre 3º Bimestre 4º Bimestre
Aprovados
João 5 6 7 8 Maria 6 6 8 7
José 6 7 8 9 Joaquim 4 7 6 5
Maria 6 6 8 7 João 5 6 7 8
Joaquim 4 7 6 5 José 6 7 8 9
Reprovados
Manoel 5 6 7 8 Joana 6 6 8 7
Maricota 6 7 8 9 Juvenal 4 7 6 5
Joana 6 6 8 7 Manoel 5 6 7 8
Juvenal 4 7 6 5 Maricota 6 7 8 9

Parece complicado? Um pouquinho mas… todos vocês já viram o suficiente para criar uma tabela dessas. Para prosseguir com esse tutorial, vocês terão que montá-la em seus próprios computadores. Sem reclamações, podem começar! Só avancem para o próximo parágrafo depois de terminar essa tabela, simbora!

Quero que vocês olhem para o código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<table border="2" cellpadding="4" cellspacing="4" summary="Tabela de notas dos alunos do 3º ano">
<caption>Tabela de Alunos</caption>
 
<thead>
<tr>
<th colspan="5">Turma A</th>
<th colspan="5">Turma B</th>
</tr>
 
<tr>
<th>Aluno</th>
<th>1º Bimestre</th>
<th>2º Bimestre</th>
<th>3º Bimestre</th>
<th>4º Bimestre</th>
<th>Aluno</th>
<th>1º Bimestre</th>
<th>2º Bimestre</th>
<th>3º Bimestre</th>
<th>4º Bimestre</th>
</tr>
</thead>
 
<tbody>
<tr>
<th id="aprovados" colspan="10">Aprovados</th>
</tr>
<tr>
<td>João</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>Maria</td>
<td>6</td>
<td>6</td>
<td>8</td>
<td>7</td>
</tr>
<tr>
<td>José</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>Joaquim</td>
<td>4</td>
<td>7</td>
<td>6</td>
<td>5</td>
</tr>
<tr>
<td>Maria</td>
<td>6</td>
<td>6</td>
<td>8</td>
<td>7</td>
<td>João</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
<tr>
<td>Joaquim</td>
<td>4</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>José</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
 
<tr>
<th id="reprovados" colspan="10">Reprovados</th>
</tr>
<tr>
<td>Manoel</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>Joana</td>
<td>6</td>
<td>6</td>
<td>8</td>
<td>7</td>
</tr>
<tr>
<td>Maricota</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>Juvenal</td>
<td>4</td>
<td>7</td>
<td>6</td>
<td>5</td>
</tr>
<tr>
<td>Joana</td>
<td>6</td>
<td>6</td>
<td>8</td>
<td>7</td>
<td>Manoel</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
<tr>
<td>Juvenal</td>
<td>4</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>Maricota</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>

Como já dito anteriormente, um leitor de tela irá apresentar os dados de uma tabela, de forma linear, ou seja, coluna por coluna, linha por linha. O uso de legendas e tags TH ajuda a contornar o problema em tabelas simples, com um único cabeçalho, o que não é o caso do exemplo acima. Para incrementar a acessibilidade em tabelas complexas, faremos uso dos atributos ID e HEADER. O atributo ID estabelece um identificador para um elemento HTML, distinguindo-o de qualquer outro elemento da página, ou seja, um ID aplicado em uma tag, não pode ser utilizado em nenhuma outra tag dentro da mesma página. Eu costumo brincar com meus alunos que o ID é o CPF de um elemento: podem ter vários com o mesmo nome, mas com aquele CPF só tem um!

Uma vez criado um ID para cada coluna cabeçalho da tabela, podemos referenciá-los nas demais células de conteúdo, estabelecendo uma conexão entre o cabeçalho e células de uma coluna. Para isso basta declarar o atributo HEADER em cada uma das células, referenciando os ID’s dos cabeçalhos aos quais essas células estejam relacionadas. Parece complicado, mas veja como fica a marcação do exemplo acima, com os atributos ID e HEADER:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<table border="2" cellpadding="4" cellspacing="4" summary="Tabela de notas dos alunos do 3º ano">
<caption>Tabela de Alunos</caption>
<thead>
<tr>
<th id="turma-A" colspan="5">Turma A</th>
<th id="turma-B" colspan="5">Turma B</th>
</tr>
 
<tr>
<th id="turma-A-nome">Aluno</th>
<th id="turma-A-bim-1">1º Bimestre</th>
<th id="turma-A-bim-2">2º Bimestre</th>
<th id="turma-A-bim-3">3º Bimestre</th>
<th id="turma-A-bim-4">4º Bimestre</th>
<th id="turma-B-nome">Aluno</th>
<th id="turma-B-bim-1">1º Bimestre</th>
<th id="turma-B-bim-2">2º Bimestre</th>
<th id="turma-B-bim-3">3º Bimestre</th>
<th id="turma-B-bim-4">4º Bimestre</th>
</tr>
</thead>
 
<tbody>
<tr>
<th headers="" id="aprovados" colspan="10">Aprovados</th>
</tr>
<tr>
<td headers="turma-A turma-A-nome aprovados">João</td>
<td headers="turma-A turma-A-bim-1 aprovados">5</td>
<td headers="turma-A turma-A-bim-2 aprovados">6</td>
<td headers="turma-A turma-A-bim-3 aprovados">7</td>
<td headers="turma-A turma-A-bim-4 aprovados">8</td>
<td headers="turma-B turma-B-nome">Maria</td>
<td headers="turma-B turma-B-bim-1 aprovados">6</td>
<td headers="turma-B turma-B-bim-2 aprovados">6</td>
<td headers="turma-B turma-B-bim-3 aprovados">8</td>
<td headers="turma-B turma-B-bim-4 aprovados">7</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome aprovados">José</td>
<td headers="turma-A turma-A-bim-1">6</td>
<td headers="turma-A turma-A-bim-2">7</td>
<td headers="turma-A turma-A-bim-3">8</td>
<td headers="turma-A turma-A-bim-4">9</td>
<td headers="turma-B turma-B-nome">Joaquim</td>
<td headers="turma-B turma-B-bim-1 aprovados">4</td>
<td headers="turma-B turma-B-bim-2 aprovados">7</td>
<td headers="turma-B turma-B-bim-3 aprovados">6</td>
<td headers="turma-B turma-B-bim-4 aprovados">5</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome aprovados">Maria</td>
<td headers="turma-A turma-A-bim-1">6</td>
<td headers="turma-A turma-A-bim-2">6</td>
<td headers="turma-A turma-A-bim-3">8</td>
<td headers="turma-A turma-A-bim-4">7</td>
<td headers="turma-B turma-B-nome">João</td>
<td headers="turma-B turma-B-bim-1 aprovados">5</td>
<td headers="turma-B turma-B-bim-2 aprovados">6</td>
<td headers="turma-B turma-B-bim-3 aprovados">7</td>
<td headers="turma-B turma-B-bim-4 aprovados">8</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome aprovados">Joaquim</td>
<td headers="turma-A turma-A-bim-1">4</td>
<td headers="turma-A turma-A-bim-2">7</td>
<td headers="turma-A turma-A-bim-3">6</td>
<td headers="turma-A turma-A-bim-4">5</td>
<td headers="turma-B turma-B-nome">José</td>
<td headers="turma-B turma-B-bim-1 aprovados">6</td>
<td headers="turma-B turma-B-bim-2 aprovados">7</td>
<td headers="turma-B turma-B-bim-3 aprovados">8</td>
<td headers="turma-B turma-B-bim-4 aprovados">9</td>
</tr>
 
<tr>
<th headers="" id="reprovados" colspan="10">Reprovados</th>
</tr>
<tr>
<td headers="turma-A turma-A-nome reprovados">Manoel</td>
<td headers="turma-A turma-A-bim-1 reprovados">4</td>
<td headers="turma-A turma-A-bim-2 reprovados">3</td>
<td headers="turma-A turma-A-bim-3 reprovados">6</td>
<td headers="turma-A turma-A-bim-4 reprovados">3</td>
<td headers="turma-B turma-B-nome reprovados">Joana</td>
<td headers="turma-B turma-B-bim-1 reprovados">4</td>
<td headers="turma-B turma-B-bim-2 reprovados">4</td>
<td headers="turma-B turma-B-bim-3 reprovados">4</td>
<td headers="turma-B turma-B-bim-4 reprovados">5</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome reprovados">Maricota</td>
<td headers="turma-A turma-A-bim-1 reprovados">2</td>
<td headers="turma-A turma-A-bim-2 reprovados">4</td>
<td headers="turma-A turma-A-bim-3 reprovados">5</td>
<td headers="turma-A turma-A-bim-4 reprovados">5</td>
<td headers="turma-B turma-B-nome reprovados">Juvenal</td>
<td headers="turma-B turma-B-bim-1 reprovados">3</td>
<td headers="turma-B turma-B-bim-2 reprovados">3</td>
<td headers="turma-B turma-B-bim-3 reprovados">4</td>
<td headers="turma-B turma-B-bim-4 reprovados">5</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome reprovados">Joana</td>
<td headers="turma-A turma-A-bim-1 reprovados">6</td>
<td headers="turma-A turma-A-bim-2 reprovados">3</td>
<td headers="turma-A turma-A-bim-3 reprovados">3</td>
<td headers="turma-A turma-A-bim-4 reprovados">2</td>
<td headers="turma-B turma-B-nome reprovados">Manoel</td>
<td headers="turma-B turma-B-bim-1 reprovados">4</td>
<td headers="turma-B turma-B-bim-2 reprovados">4</td>
<td headers="turma-B turma-B-bim-3 reprovados">5</td>
<td headers="turma-B turma-B-bim-4 reprovados">5</td>
</tr>
<tr>
<td headers="turma-A turma-A-nome reprovados">Juvenal</td>
<td headers="turma-A turma-A-bim-1 reprovados">3</td>
<td headers="turma-A turma-A-bim-2 reprovados">3</td>
<td headers="turma-A turma-A-bim-3 reprovados">5</td>
<td headers="turma-A turma-A-bim-4 reprovados">5</td>
<td headers="turma-B turma-B-nome reprovados">Maricota</td>
<td headers="turma-B turma-B-bim-1 reprovados">4</td>
<td headers="turma-B turma-B-bim-2 reprovados">3</td>
<td headers="turma-B turma-B-bim-3 reprovados">2</td>
<td headers="turma-B turma-B-bim-4 reprovados">5</td>
</tr>
</tbody>
</table>

Ok! Escrevemos pra caramba, né? Vamos a algumas ponderações:

  1. É necessário levar em consideração se o uso dos HEADERS não deixará a página pesada, dificultando o carregamento da mesma;
  2. Como podemos ver, os HEADERS são uma lista com todos os ID’s relacionados à célula;
  3. Devemos usar nomes simples para os ID’s, evitando nomes compridos e de difícil indexação;
  4. É preciso ter todo cuidado ao escrever os HEADERS, sob o risco de prejudicar a leitura correta dos dados da tabela;
  5. É preciso levar a escrita dos HEADERS em consideração, em sistemas dinâmicos, onde as tabelas são alimentadas via banco de dados.

Bem pessoal, por hoje é só. Falamos bastante sobre tabelas, e o assunto não acaba aqui. Continuem estudando e praticando. No próximo tutorial falaremos sobre FORMULÁRIOS, até lá!

Abraços,
Diego.

jul
02
2009
1

Minicurso de HTML: Parte IX – Tabelas Acessíveis

Olá Pessoal,

Continuando com o último post, falaremos hoje sobre tabelas acessíveis. Já falei isso por aqui: quando construímos um site, visamos atingir todos os públicos e perfis de usuário: usuários sem e com necessidades especiais, acessando a partir de dispositivos móveis, computadores comuns, leitores de tela, robôs de busca e qualquer outro software; devemos oferecer condições para que todos eles possam acessar ao conteúdo da página, cada um ao seu jeito. Criar uma bela página, visualmente impecável, pode impedir o acesso de todos os demais usuários do seu site: portadores de deficiências, robôs de busca etc. Com certeza isso não é um bom negócio, e seu cliente vai ficar meio P… da vida, quando descobrir o quanto ele está perdendo…

Código Produto Preço
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

Visualmente essa tabela é legível, mas qualquer outro usuário impossibilitado de enxergá-la, seria obrigado a ler seu código (softwares, por exemplo) de forma seqüencial. A leitura dessa tabela ficaria assim: Código, Produto, Preço, 001, Notebook Acer, R$1.800,00, 002… Em resumo, uma tortura! Com algumas poucas tags e atributos podemos criar tabelas acessíveis para qualquer usuário: desde um cego, até o robôzinho do Google… Parece um bom negócio? É um ótimo negócio.

Criando tabelas com cabeçalhos

O primeiro passo rumo ao incremento da acessibilidade em nossas tabelas, é a utilização de cabeçalhos, permitindo que um leitor de telas, por exemplo, associe um cabeçalho a uma célula, ou seja, indique a qual coluna aquele conteúdo pertence. A primeira medida é trocar as tags <td></td>, da primeira linha da tabela, onde colocaremos os nomes das colunas (os cabeçalhos), por tags próprias para formar cabeçalhos de colunas: <th></th>. Outra tag importante é a CAPTION, onde eu posso criar um título que descreva a minha tabela. O título aparecerá centralizado logo acima da tabela, o que pode ser modificado via CSS. A tag TABLE possui um atributo chamado SUMMARY, onde eu posso colocar um texto descrevendo a tabela. Esse texto não será renderizado no navegador do usuário, mas é de grande ajuda para outros softwares que leiam nossa página. Veja como ficará nossa tabela, com o incremento das novas tags e atributos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<table border="2" cellpadding="4" cellspacing="4" summary="Tabela dos produtos de informática da loja X">
<caption>Tabela de Produtos - Informática</caption>
<tr>
<th>Código</th>
<th>Produto</th>
<th>Preço</th>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Resultado:

Tabela de Produtos – Informática
Código Produto Preço
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

Percebam que a primeira linha da tabela apresentou algumas modificações visuais: o texto está centralizado e em negrito. Em termos de marcação, qualquer dispositivo conseguirá associar o cabeçalho ao conteúdo das células da coluna correspondente. Isso é efeito das tags <th></th>. Já o título da tabela, centralizado acima da mesma, é por conta da tag <caption></caption>. E o atributo SUMMARY, conforme dito, não aparece na tela, mas tem grande valor para a acessibilidade de nossas tabelas. Acabou? Não… Podemos fazer bem mais! Veja a tabela abaixo:

Tabela de Produtos – Informática
Código do Produto Nome do Produto (notebook) Preço do produto (em R$)
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

Ok! Apenas aumentamos os cabeçalhos… Porém, um leitor de tela irá associar o nome do cabeçalho ao conteúdo da célula. Ficaria assim: Nome do Produto (notebook) – Notebook Acer; Nome do Produto (notebook) – Notebook Dell… Não precisamos torturar o internauta, basta adicionar uma legenda ao cabeçalho, ou seja, um valor reduzido que não será renderizado no navegador, mas que substituirá o texto do cabeçalho em um leitor de tela. Para isso, basta adicionar o atributo ABBR nas tags <th></th>. Veja como fica a nossa tabela, agora:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<table border="2" cellpadding="4" cellspacing="4" summary="Tabela dos produtos de informática da loja X">
<caption>Tabela de Produtos - Informática</caption>
<tr>
<th abbr="código">Código do Produto</th>
<th abbr="nome">Nome do Produto (notebook)</th>
<th abbr="preço">Preço do produto (em R$)</th>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Acessibilidade em tabelas complexas

Com o que vimos até aqui, podemos construir tabelas com um bom nível de acessibilidade. Porém, em certas ocasiões teremos tabelas com alguns níveis a mais de complexidades: mesclagem de linhas e colunas, divisão por áreas e grupos etc. Em casos assim, precisamos adicionar mais alguns recursos de marcação.

Nossas tabelas podem ser divididas em três áreas: cabeçalho, corpo e rodapé. O cabeçalho já sabemos do que se trata; o rodapé corresponde a última linha da tabela, onde iremos inserir alguma informação complementar; e o corpo corresponderia a todo o conteúdo, ou seja, a tabela propriamente dita. Essas áreas são marcadas pelas tags: <thead></thead>, <tbody></tbody> e <tfoot></tfoot>. A ordem de declaração dessas tags é a seguinte: cabeçalho, rodapé e corpo. Veja como ficaria a marcação de nossa tabela:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<table border="2" cellpadding="4" cellspacing="4" summary="Tabela dos produtos de informática da loja X">
<caption>Tabela de Produtos - Informática</caption>
<thead>
<tr>
<th abbr="código">Código do Produto</th>
<th abbr="nome">Nome do Produto (notebook)</th>
<th abbr="preço">Preço do produto (em R$)</th>
</tr>
</thead>
 
<tfoot>
<tr>
<td colspan="3">Produtos com 10% de desconto</td>
</tr>
</tfoot>
 
<tbody>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</tbody>
</table>

Resultado:

Tabela de Produtos – Informática
Código do Produto Nome do Produto (notebook) Preço do produto (em R$)
Produtos com 10% de desconto
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

O uso de TFOOT não é obrigatório, a menos que a tabela possua um rodapé. Além de produzir uma marcação melhor estruturada, e com isso organizar melhor as nossas tabelas, alguns browsers, quando as tabelas ocupam mais de uma página, manteriam o cabeçalho e rodapé fixo na tela, enquanto apenas o corpo se movimenta. Essas são implementações futuras, que irão melhorar a experiência do internauta, além de ser um grande facilitador para quem acessa nossos sites, a partir de dispositivos móveis (celulares, smartphones etc.). Outra vantagem: se imprimirmos uma tabela extensa, o cabeçalho e rodapé aparecerão no topo e fim, respectivamente, de cada página. Bem profissional, não acham?

Bom, encerramos o assunto tabelas acessíveis! Para fechar o tema, no próximo tutorial, falaremos sobre tabelas complexas. Assunto importante, então estudem com calma e atenção.

Abraços,
Diego.

jul
01
2009
0

Minicurso de HTML: Parte VIII – Tabelas HTML

Olá Pessoal,

Hoje vamos tratar de um tema importante e controverso. Importante, pois o uso de tabelas é comum em sites. Controverso por existir todo uma discussão histórica, envolvendo o uso indevido de tabelas, gerando certo preconceito em relação ao elemento HTML.

O uso indevido de tabelas na diagramação de sites

Nos tempos negros do desenvolvimento web, quando as pessoas desconheciam o W3C e WebStandards, a diagramação de sites era feita com o uso de tabelas. Imaginem uma planilha do Excel (ou qualquer software de planilhas), onde você vá mesclando linhas e colunas, formando as áreas que componham o layout. Os sites de antigamente eram feitos assim…

Problemas: em HTML, uma tabela tem como finalidade apresentar dados de forma tabular, usar uma tabela para diagramação de páginas, é subverter o uso do elemento; HTML é uma linguagem de marcação, unicamente, e usá-la para diagramação é fazer um péssimo uso da linguagem, além de descumprir as orientações e diretrizes do W3C; o uso de tabelas faz com que toda a diagramação do site fique engessada dentro de cada página, sendo necessário alterar todas as páginas, para realizar uma simples alteração de layout (imagine isso em 10, 100, 1000 páginas… trabalhoso, não?).

WebStandards, Tableless etc.

Com o advento do W3C, a divulgação dos WebStandards (padrões, orientações e diretrizes para desenvolvimento web) e sua ampla aceitação pelos designers e desenvolvedores, fazer um site se tornou uma tarefa bem mais simples. Ao invés de utilizar HTML para marcar, formatar e diagramar conteúdo, dividimos isso em duas camadas: HTML para marcação, e CSS para estilização (formatação / diagramação). Agora, alterar um layout não requer modificar todas as páginas do site, e sim alterar um único arquivo CSS com todas as definições do visual do site. Bem mais fácil, né?

Porém, nesse mundo capitalista tudo é uma questão de marketing, e o nome WebStandards (Padrões Web, na tradução) não é muito chamativo. Para fazer frente ao uso de tabelas, criou-se o termo TABLELESS (do inglês, SEM TABELAS) e aí gerou-se a confusão… Um site tableless é um site que não tenha uma tabela sequer, mas isso não significa que o site seja standard ou acessível. Um site standard é aquele que atende às recomendações do W3C, e o uso de tabelas para apresentação de dados tabulares, é uma recomendação do W3C. Usar outros elementos HTML, ao invés de TABLE, para criar tabelas é conflitar com os webstandards só para fazer sites tableless… E convenhamos: o que tem de site sem tabelas, com uma marcação confusa, mais parecendo uma sopa de tags é impressionante…

Enfim: um site webstandard é aquele que possui uma marcação HTML correta, usa CSS para estilização e atende às demais diretrizes do W3C. Tableless é marketing, e não uma regra…

Criando as primeiras tabelas

Temos que criar uma listagem dos produtos de uma loja qualquer, especificando o código, nome e preço do produto. Isso é, claramente, uma tabela de produtos. Para criar tabelas, usamos a tag TABLE: <table></table>.

Uma tabela é constituída de linhas e colunas, a intersecção entre linhas e colunas formam as células. E dentro das células inserimos o conteúdo das tabelas. As linhas de uma tabela são dadas pelas tags <tr></tr>, colocadas entre <table></table>. O resultado seria: <table><tr></tr></table>. Podemos criar quantas linhas forem necessárias em nossas tabelas, e dentro dessas linhas criamos colunas / células com as tags <td></td>. Veja como ficaria a nossa tabela:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<table>
<tr>
<td>Código</td>
<td>Produto</td>
<td>Preço</td>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Resultado:

Código Produto Preço
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

Podemos ainda especificar alguns atributos do elemento TABLE, para melhorar a visualização de nossas tabelas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<table border="2" cellpadding="4" cellspacing="4">
<tr>
<td>Código</td>
<td>Produto</td>
<td>Preço</td>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Resultado:

Código Produto Preço
001 Notebook Acer R$1.800,00
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

O atributo BORDER cria bordas em volta das células de uma tabela, permitindo uma melhor separação entre seus conteúdos. Podemos especificar uma medida numérica como valor de BORDER, referente a espessura da mesma. Quanto maior o valor, mais grossa será a borda. O atributo CELLPADDING fica responsável pelo espaçamento interno de cada célula, ou seja, o espaço entre a borda e o conteúdo. Quanto maior o valor de CELLPADDING, maior será o espaçamento do conteúdo. Já o atributo CELLSPACING fica responsável pelo espaçamento externo da célula, ou seja, o espaço entre as células de uma tabela. Quanto maior o valor, maior o seu espaçamento. Todos esses efeitos podem ser obtidos via CSS, dando maior liberdade para a nossa marcação HTML.

Mesclando colunas e linhas: atributos colspan e rowspan

Como eu disse anteriormente: é possível mesclar linhas e colunas. Esses recursos permitiram, por muito tempo, a criação de layouts baseados em tabelas. Apesar disso ser passado, esses recursos ainda são muito úteis. Veja a tabela abaixo:

Código Produto Preço
001 Notebook Acer R$1.800,00
Produtos com desconto de 10%
002 Notebook Dell R$2.200,00
003 Notebook Sony Vaio R$3.800,00

Perceberam que em um dado momento, eu criei uma linha com uma única coluna? Tentem criar uma tabela igual a essa… Conseguiram? Não, né? Essa linha com uma coluna só, acabou não funcionando direito… Relaxem! Para mesclar colunas basta usar o atributo COLSPAN no elemento TD. Em COLSPAN iremos especificar quantas colunas devem ser mescladas. Veja o código da nossa tabela:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<table border="2" cellpadding="4" cellspacing="4">
<tr>
<td>Código</td>
<td>Produto</td>
<td>Preço</td>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td colspan="3">Produtos com desconto de 10%</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell</td>
<td>R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Podemos também mesclar linhas, ao invés de colunas. Veja a tabela abaixo:

Código Produto Preço
001 Notebook Acer R$1.800,00
Produtos com desconto de 10%
002 Notebook Dell – Modelo 01 R$2.200,00
003 Notebook Dell – Modelo 02
003 Notebook Sony Vaio R$3.800,00

Legal, né? Para conseguir esse feito, basta adicionar o atributo ROWSPAN na tag TD, indicando o número de linhas que serão mescladas em uma coluna. Veja o código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<table border="2" cellpadding="4" cellspacing="4">
<tr>
<td>Código</td>
<td>Produto</td>
<td>Preço</td>
</tr>
<tr>
<td>001</td>
<td>Notebook Acer</td>
<td>R$1.800,00</td>
</tr>
<tr>
<td colspan="3">Produtos com desconto de 10%</td>
</tr>
<tr>
<td>002</td>
<td>Notebook Dell - Modelo 01</td>
<td rowspan="2">R$2.200,00</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Dell - Modelo 02</td>
</tr>
<tr>
<td>003</td>
<td>Notebook Sony Vaio</td>
<td>R$3.800,00</td>
</tr>
</table>

Bom, por hoje é só! No próximo tutorial iremos nos aprofundar no tema, e estudar mais algumas tags e atributos, visando a acessibilidade em nossas tabelas. Tópico pra lá de importante, portanto muita atenção, ok?

Abraços,
Diego.

jun
30
2009
0

Minicurso de HTML: Parte VII – Caminhos de arquivos: relativo e absoluto

Olá Pessoal,

Para complementar o assunto LINKS e IMAGENS, vamos aprender a manipular o caminho dos arquivos a serem linkados ou inseridos em nossas páginas. É um assunto importante, e usuários iniciantes costumam ter alguma dificuldade. Por isso tenham atenção e pratiquem bastante.

Caminho relativo X Caminho absoluto

Podemos classificar os caminhos de arquivos em dois tipos: absoluto e relativo. O caminho absoluto utiliza toda a estrutura de pastas e diretórios, desde a raiz, para montar a URL do arquivo. Seria algo como:

C:/Documents and Settings/All Users/Meus Documentos/sites/site/home.html

Por questões de praticidade e flexibilidade, não usamos esse tipo de caminho para montar links internos, ou seja, aqueles que apontam para páginas e arquivos dentro do nosso próprio servidor. O caminho absoluto é usado em URL’s que apontem para arquivos dentro de outro servidor. Veja um exemplo:

http://www.google.com.br ou http://www.google.com.br/intl/pt-BR_br/images/logo.gif

Já os caminhos relativos são aqueles que tomam o próprio documento HTML como referência para encontrar outros artigos. Nos caminhos relativos, partimos do documento onde criamos o link, inserimos a imagem etc., e vamos navegando pela estrutura de pastas até achar o documento a ser linkado / inserido. Usamos caminhos relativos sempre que precisamos referenciar arquivos dentro do nosso próprio servidor: imagens, vídeos, links internos etc.

Vamos estudar no decorrer desse tutorial como trabalhar com caminhos relativos. Imaginemos que exista a seguinte de estrutura de pastas e arquivos:

  • Site
    • IMAGENS
      • logo.jpg
      • foto.jpg
    • CLIENTES
    • FLASH
    • home.html
    • perfil.html
    • servicos.html
    • contato.html
  • Site2
    • IMAGENS2
      • logo2.jpg
      • foto2.jpg
    • CLIENTES2
    • FLASH2
    • home2.html
    • perfil3.html
    • servicos4.html
    • contato5.html

Linkando arquivos na mesma pasta

Eu preciso criar um link para me levar da página HOME.HTML para CONTATO.HTML. Como eu faria isso?

1
<a href="contato.html" title="Ir para a página de contato">Contato</a>

Como HOME e CONTATO são arquivos dentro da mesma pasta, para estabelecer um link entre eles basta especificar o nome do arquivo e sua extensão.

Linkando arquivos em pastas diferentes

Agora, como eu faria para inserir a imagem LOGO.JPG na página HOME? A primeira coisa que vocês devem perceber: o arquivo LOGO.JPG está na pasta IMAGENS, logo para acessá-la precisarei especificar a pasta IMAGENS no meu caminho de arquivo. Veja como ficará:

1
<img src="IMAGENS/logo.jpg" alt="Logomarca do site X" title="Logomarca do site X" />

Para especificar uma ou mais pastas necessárias para se chegar a um arquivo, basta colocar o nome das pastas e subpastas (respeitando o uso de caixa alta e caixa baixa) separados por “/”. Ficaria algo assim: PASTA/SUBPASTA1/SUBPASTA2/arquivo.jpg.

Essa estrutura é usada tanto em links, quanto em imagens, ou qualquer outra situação onde seja necessário estabelecer um caminho para um arquivo qualquer (dentro de pastas e subpastas).

Linkando arquivos em níveis diferentes

No exemplo anterior, tanto a pasta IMAGENS, quanto o arquivo HOME.HTML estão no mesmo nível, por assim dizer. Percebam que ambos se encontram dentro da mesma pasta: SITE. Por esse motivo podemos acessar diretamente a pasta IMAGENS. Porém, como eu poderia linkar a página HOME2.HTML, dentro do arquivo HOME.HTML? Os dois arquivos estão em níveis diferentes: HOME está dentro da pasta SITE; HOME2 está na pasta SITE2.

Sempre que precisarmos subir um nível, ou seja sair da nossa pasta atual, e ir para uma pasta um nível acima (do mesmo modo que navegamos pelas pastas e diretórios do Windows), basta escrever “../” no caminho do arquivo. Veja como ficará o nosso link:

1
<a href="../Site2/home2.html" title="Link para o site2">Ir para o site 2</a>

Se for necessário subir três níveis de pastas, basta usar três “../”: ../../../PASTA/arquivo.html. Trabalhar com caminhos de arquivos não é difícil ou complicado, exige apenas um pouco de atenção para a hierarquia de arquivos e pastas no site. É normal se enrolar na contagem de pastas, quando precisamos subir vários níveis, e com a prática você irá se acostumar e errar cada vez menos. Uma dica importante: sempre que você errar um caminho com vários níveis, tente adicionar ou retirar “../”, para verificar se você não errou na contagem de pastas.

Bem, por hoje é só pessoal! Próximo tutorial abordará o assunto TABELAS. Até lá.

Abraços,
Diego.

jun
29
2009
0

Curso SEO: Otimizando sites para o Google e outros buscadores

Olá Pessoal,

Irei ministrar nos dias 06 a 09 de JULHO, no Rio de Janeiro (capital), um curso de SEO: Otimização de sites para buscadores. Esse é um curso totalmente modelado por mim, com material didático próprio e minha inteira responsabilidade, ou seja: modéstia às favas, O CURSO É MUITO BOM!!!! :-)

Acessem a página do curso: http://www.diegomarques.com

Para quem não sabe SEO corresponde a um conjunto de técnicas e práticas para obter bons resultados em buscadores (Google, Yahoo! etc.). Qualquer profissional web seja designers, programadores, pessoal de marketing, empresários, blogueiros etc., podem e devem participar. Qualquer pessoa que indicar um amigo (e esse amigo se inscrever) ganha 10% de desconto na inscrição, portanto procurem aquele colega/amigo/parceiro e façam o curso junto com ele.

Acessem a página do curso (http://www.diegomarques.com) e confiram a grade curricular, valores e façam sua inscrição online. Vocês podem pagar via Boleto Bancário, Transferência ou Cartão de Crédito – tudo pela plataforma PAGSEGURO, da UOL.  Aproveitem, experimentem e indiquem!!!

Qualquer dúvida estou à disposição de vocês.

Abraços,
Diego.

jun
26
2009
0

Minicurso de HTML: Parte VI – Inserindo e trabalhando com imagens na web

Olá Pessoal,

Antes de começar: o Projetista Digital está no Twitter! A partir de agora você pode me seguir e acessar diariamente os links de artigos, blogs, sites e tudo mais relacionado a nossa área, que eu leio e encontro na web. Achei um tutorial legal, um site maneiro, qualquer coisa interessante: vou postar o link no Twitter. Então me siga no Twitter, e receba atualizações diárias sobre novidades de Design e Desenvolvimento Web. Agora voltamos com a programação normal:

O tutorial de hoje refere-se ao uso de imagens. Incluir imagens em sites é um processo simples, sem maiores complicações. A possibilidade de inserir imagens e gráficos, ajudou, e muito, a enriquecer a experiência dos internautas. Podemos criar layouts sofisticados, além de inserir fotos, gráficos e qualquer outro tipo de informação. O bom uso de imagens é uma ferramenta essencial para o sucesso de um site. As imagens influenciam na acessibilidade, usabilidade, peso e rankeamento de um site nos buscadores: em resumo, o mal uso de imagens pode comprometer seu site em várias áreas.

Formatos de imagens

Todos vocês estão acostumados com imagens: são as fotos de aniversário, natal, álbuns do Orkut, a logomarca do Google… O tempo todo usamos e vemos imagens, seja no nosso computador, seja na web. Todo arquivo possui uma extensão (arquivo HTML possuem extensão .html, Word é .doc, Excel é .xls, PowerPoint é .ppt etc.), e imagens possuem várias extensões, sendo que na web são usadas apenas três:

  • GIF – Graphics Interchange Format
  • JPG / JPEG – Joint Photographic Experts Group
  • PNG – Portable Network Graphics

Qual a diferença entre elas? GIF é um formato que admite apenas 256 cores, sendo usado em desenhos e gráficos; JPG / JPEG admite milhões de cores, é ideal para fotografias; GIF admite fundo transparente; JPG / JPEG NÃO admite fundo transparente; GIF possui melhor compressão para imagens simples; JPG / JPEG possui melhor compressão para imagens complexas; quanto maior a compressão da imagem, menor o tamanho do arquivo, e mais rápido é o carregamento da imagem na página. E como todos sabem: páginas que demoram a carregar são um pé no saco…

E o formato PNG? Esse é um formato relativamente novo, que reúne o melhor dos dois mundos: alta compressão, fundo transparente e milhões de cores para detalhamento.

O que preciso para conseguir imagens?

O XHTML apenas insere as imagens na página: criá-las, editá-las e tratá-las é por conta de ferramentas específicas (editores de imagens). As ferramentas mais usadas: Adobe Fireworks, Adobe Photoshop e Gimp. O Gimp é uma ferramenta gratuita, enquanto as outras duas são pagas. Se você precisar usar um editor de imagens, e não tem dinheiro para comprar um software pago, use o Gimp ou Infran View (uma ferramenta simples e gratuita).

Você pode também baixar imagens diretamente da internet (lembre-se que existem direitos autorais sobre imagens, apesar de não ser o escopo desse tutorial debater o tema), basta clicar com o botão direito do mouse sobre a imagem, e clicar em “Salvar Imagem Como” (o texto varia de navegador para navegador, mas você conseguirá identificar a opção).

Inserindo imagens em uma página web

Para inserir imagens em um documento XHTML você usará a tag <img />. Essa tag possui um atributo chamado SRC, onde iremos declarar o caminho da imagem que desejamos inserir na página. Veja a tag <img /> em funcionamento:

1
<img src="imagem.jpg" />

Resultado:

Logo do Google

Simples, né? Não tem segredo: basta colocar o caminho correto da imagem e pronto. Percebam que a tag <img /> é um elemento vazio, ou seja, não possui tag de fechamento </img >; para fechar a tag de imagem usamos a barra (/) na própria tag de abertura: <img />.

Podemos também usar imagens hospedadas em outros sites, como por exemplo:

1
<img src="http://www.google.com.br/intl/pt-BR_br/images/logo.gif" />

Resultado:

Logo do Google

Imagens também podem servir de links. Veja como:

1
<a href="http://www.google.com.br" target="_blank"><img src="http://www.google.com.br/intl/pt-BR_br/images/logo.gif" /></a>

Resultado:

Atributos alt e title

Nosso site pode ser acessado por vários perfis de usuários: internautas com deficiência visual, sem deficiências, com dificuldades motoras, acessando a partir de celulares e dispositivos móveis, spiders, crawlers e outros robôs usados por buscadores para indexar sites etc. É importante desenvolver sites ACESSÍVEIS, ou seja, que permitam o acesso a qualquer perfil de usuário. Acessibilidade é um tópico à parte, e terá seu próprio minicurso. Mas desde agora podemos aprender a escrever um código XHTML visando a Acessibilidade. E em imagens temos dois atributos visando esse fim: alternativas para usuários que não podem visualizar imagens.

Se por algum motivo o usuário não visualizar imagem (caminho errado, dificuldade visual, configuração do navegador, ser um robô de busca etc.), podemos apresentar um texto alternativo. Esse texto alternativo é uma rápida descrição da imagem, inserida dentro da tag ALT. Veja o código abaixo:

1
2
<!-- Eu errei o nome da imagem propositalmente -->
<img src="http://www.google.com.br/intl/pt-BR_br/images/logoooooo.gif" alt="logomarca do Google - texto alternativo" />

Resultado:

logomarca do Google - texto alternativo

Repararam que o texto do ALT apareceu no lugar da imagem? Legal, né? Além de inserir uma descrição alternativa, eu posso inserir uma rápida descrição da imagem, a ser renderizada pelos navegadores sob a forma de uma caixinha amarela, quando passamos o mouse por cima de uma imagem. Essa descrição também será usada em leitores de tela, usados por usuários com deficiência visual; e robôs de buscadores. Veja como funciona:

1
<img src="http://www.google.com.br/intl/pt-BR_br/images/logo.gif" alt="Logo do Google" title="Logo do Google" />

Resultado:

Logo do Google

Pessoal, por hoje é só! No próximo tutorial falaremos sobre “caminhos de arquivos”, um assunto importante para complementar o uso de links e imagens (atributos HREF e SRC). Não percam!

Abraços,
Diego.

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com