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.
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.
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:
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:
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).
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!
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:
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.
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:
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:
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.
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:
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:
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.
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.
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:
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.
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.
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:
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.
Vamos aprender a escrever nossos formulários web, e conhecer seus principais elementos.
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 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:
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.
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.
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:
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:
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.
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:
| 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:
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.
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.
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:
| 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:
| 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> |
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:
| 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.
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.
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?).
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…
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.
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.
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.
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:
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.
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).
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.
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
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.
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.
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:
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 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).
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:

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:

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:
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:

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:

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