Introdução ao DHTML - Parte II


Em nosso artigo anterior (Introdução ao DHTML - Parte I), eu mostrei como alterar dinamicamente a formatação de um bloco de texto usando JavaScript. Hoje vamos ver como mudar a formatação de outros objetos do HTML e como criar um link usando JavaScritp.

Formatando as células de uma tabela (cor e bordas)

Neste exemplo vamos criar uma tabela, com algumas células, e vamos utilizar Javascript para transformar essas células em botões, com animação de foco, de clique e com link. Tudo isso usando apenas o interceptador de eventos do HTML.Vamos por a mão na massa: abra seu editor de HTML (o bloco de notas serve) e digite o código abaixo:

<html>
<body>
<center>
 <table width="480" border="0" cellspacing="2" cellpadding="5">
  <tr>
   <td width="120" align="center"><div style="font-size: 12px; font-weight: bold;">A Empresa</div></td>
   <td width="120" align="center"><div style="font-size: 12px; font-weight: bold;">Nossos Produtos</div></td>
   <td width="120" align="center"><div style="font-size: 12px; font-weight: bold;">Nossos Serviços</div></td>
   <td width="120" align="center"><div style="font-size: 12px; font-weight: bold;">Contato</div></td>
  </tr>
 </table>
</center>
</body>
</html>

A tabela deve ficar como abaixo:

A Empresa Nossos Produtos Nossos Serviços Contato

Nota: usei a tag <div> para formatar o texto. Poderia ter feito assim:

<font size="12px"><strong>A Empresa</strong></font>

Mas usando o div posso concentrar toda a formatação em um unico objeto, assim fica mais facil programar e dar manutenção. Quando começarmos a falar sobre CSS, vou explicar cada atributo da subclasse style, e quais objetos podem ser formatados usando ela. Por hora, vou explicar os usados acima: font-size define o tamanho da fonte em pixels(px) ou pontos(pt); font-weight define o peso da fonte, pode ter os valores bold (negrito), bolder (negrito forte) ou lighter (negrito claro). Mas nosso estudo hoje não vai se concentrar no objeto div, e sim na célula da tabela (<td>).

Vamos iniciar a formatação: acrescente a cada célula o seguinte codigo:

bgcolor="#E1F7E9" style="border: thin outset #E1F7E9;"

bgcolor define a cor de fundo da célula (diferente do restante da tabela) e style.border define as configurações da borda da celula. O primeiro valor passado (thin) define a largura da borda, o segundo (outset) define o estilo e o terceiro (#E1F7E9) define a cor da borda (ou sua variante, se o estilo definir algum tipo de relevo). Veja a tabela abaixo:

Atributo Valor Descrição
Largura (o primeiro valor na definição de style.border) thin fino
medium médio
thick espesso
valor pode-se especificar um valor numérico, sucedido de px (pixels) ou pt (pontos)
Estilo (o segundo valor na definição de style.border) none não há borda, independe de Largura ou Cor
dotted pontilhado
dashed tracejado
solid solido
double duas linhas (duplo)
groove entalhe (3D)
ridge ranhura (3D)
inset baixo-relevo (3D)
outset auto-relevo (3D)
Cor (o ultimo valor da definição de styel.border) valor qualquer valor hexadecimal que configura uma cor aceita para paginas html

Abaixo, como deve ficar a tabela agora (se você usa o Dreamweaver, vai precisar salvar a pagina e carregar no navegador para ver as bordas):

A Empresa Nossos Produtos Nossos Serviços Contato

 

Ótimo, até aqui, nossas células ja parecem botões, mas ainda falta as animações. Vamos lá:

Interceptando os Eventos de Mouse

No exemplo anterior (Introdução ao DHTML - Parte I) já vimos dois eventos relacionados ao mouse. Agora vamos ver outros dois. A tabela abaixo traz uma pequena descrição dos eventos ja vistos e dos que veremos aqui.

Evento Descrição
onMouseOver Disparado quando o mouse é detectado sobre o objeto.
onMouseOut Disparado quando é detectado o movimento do mouse, que estava sobre o objeto, para sobre outro objeto, externo ou não ao primeiro.
onMouseDown Disparado quando é detectado o pressionar de um dos botões do mouse com o ponteiro sobre o objeto.
onMouseUp Disparado quando é detectado o soltar de um dos botões do mouse com o ponteiro sobre o objeto, independente de o pressionar do botão ter se realizado sobre o mesmo objeto ou não.

Os dois primeiros eventos, como já vimos no artigo anterior, serão usados para detectar quando o mouse passa por cima do botão.O onMouseDown é o evento que vamos utilizar para detectar quando o botão deve ser apertado e o onMouseUp vamos usar para detectar quando o botão deve ser solto.

Foco

Para avisar o usuário que a área que o mouse está em cima é clicável, usamos um recurso chamado foco. Foco é a mudança de uma caracteristica de forma bem clara, para que o usuário saiba que aquele objeto não é apenas um adorno gráfico, mas sim uma área útil, e que acontecerá algo se ele clicar lá. Um exemplo são os links, que em alguns navegadores são sublinhados quando o mouse passa por cima deles.

No nosso exemplo, vamos alterar a cor de fundo da célula para que o usuário saiba que o objeto está em foco. A cor da célula é #E1F7E9. Vamos substitui-la pela cor #D1F7D9, que é um tom diferente de verde. Programando a mudança de cor no evento onMouseOver e retornando a cor original em onMouseOut, ficamos com o seguinte código:

onMouseOver="this.bgColor='#D1F7D9'" onMouseOut="this.bgColor='#E1F7E9'"

Este codigo deve ser incluído em cada declaração de célula (<td>) da tabela. A tabela deve ficar assim:

A Empresa Nossos Produtos Nossos Serviços Contato

Apertar e Soltar

Como nosso objetivo é criar botões, vamos fazer eles darem a impressão de serem apertados e soltos quando o botão do mouse é apertado e solto. Para tanto, vamos alterar o Estilo da borda das células de outset (alto-relevo) para inset (baixo-relevo). No evento onMouseDown vamos alterar as configurações de style.border para que o estilo seja setado como inset. E no evento onMouseUp vamos alterar novamente as configurações da borda para o estilo original (outset).

Quando passei a definição da propriedade style.border (no inicio do artigo) mostrei que o valor dessa propriedade é composta por tres parametros. Pois bem, mesmo em javascript temos que informar os tres para alterar um deles. Assim, o codigo para apertar e soltar o botão quando o mouse for clicado fica como abaixo:

onMouseDown="this.style.border='thin inset #E1F7E9';" onMouseUp="this.style.border='thin outset #E1F7E9';"

Este codigo deve ser incluído em cada declaração de célula (<td>) da tabela. A tabela deve ficar assim:

A Empresa Nossos Produtos Nossos Serviços Contato

Se você clicar sobre um desses botões, segurar o ponteiro do mouse apertado, e arrastar para fora do botão, e soltar fora do botão, verá que o botão permanece apertado, mesmo quando o botão do mouse é solto. Isso ocorre porque o evento onMouseUp não foi detectado (pois o mouse não estava sobre o objeto quando o botão foi solto). Para contornar esse problema, vamos incluir a mesma instrução do evento onMouseUp no evento onMouseOut. Assim, quando o mouse for retirado de cima do botão, se este estiver apertado, será solto. O Código do evento onMouseOut deve ficar assim:

onMouseOut="this.bgColor='#E1F7E9';this.style.border='thin outset #E1F7E9';"

Criando um Link no Botão

Se você simplesmente definir um link no texto do botão, esse link não funcionará se o botão for clicado sem o ponteiro do mouse estar sobre o texto. Se você tentar definir o link na célula, é possível que em alguns navegadores funcione, mas não é uma pratica aconselhável. Para que uma outra página seja carregada ao clicar um botão desses não vamos criar um link (<a>), vamos sim usar o Javascript.

O parametro location do objeto window guarda a url da pagina em exibição. Para o navegador ir para outra pagina, basta alterar o valor deste parâmetro para a url que desejamos exibir. Vamos programar para que, depois de clicar o botão (apertar e soltar) ele abra uma nova pagina, na mesma janela. O código será o seguinte (no exemplo vou abrir a home page do macoratti):

location='http://www.macoratti.net';

Essa instrução deve ser colocada no evento onMouseUp, depois da instrução que já está lá, para que só seja executada quando o botão for solto, e depois da animação que restaura a borda dele. Assim dará o efeito de que apertar o botão chama o link. Em um pagina na web, que demora alguns segundos para ser descarregada no navegador, é importante que o estado original do botão (borda em alto-relevo) seja restaurado ao soltar, e depois a pagina é carregada. Assim, o código torna-se o seguinte:

onMouseUp="this.style.border='thin outset #E1F7E9';location='http://www.macoratti.net';"

Lembrando sempre que se mais de uma instrução for colocada na mesma linha, o ponto-e-virgula deve ser usado para separá-las, independente de haver espaços entre elas ou não. Abaixo, temos um botão criado como os da barra acima, que redireciona esta pagina para a home page do macoratti.

Macoratti

 

Lembrando ainda que usei o http:// para indicar que se trata de um endereço absoluto na web. Você pode indicar um endereço relativo na sua Web, como por exemplo: location='loja/compar.asp'. Tambem pode-se passar parametros para o servidor nessa instrução, assim: location='loja/comprar.asp?prod=1205'.

 

Janela com Frames

Para usar o exemplo acima em uma pagina com frames, é necessário especificar em qual frame deseja abrir a pagina. Cada frame possui seu próprio atributo location.

Assim, se o seu botão estiver em uma pagina em um frame, e você deseja abrir em outro, é necessário usar o seguinte código: parent.nomeFrame.location='endereco'. O objeto parent deve ser colocado sempre que os botões tambem estiverem em uma pagina dentro de um frame e deseja-se abrir em outro. Para abrir no mesmo frame, basta apenas location='endereco'.

Se os botões estiverem um nível acima do frame, ou seja, na pagina que define o <frame>, basta então referenciar o nome do frame, assim: nomeFrame.location='endereco'. Observe o codigo abaixo:

<center>
 <table width="500" border="0" cellspacing="5" cellpadding="5">
  <tr>
   <td align="center">
    <table width="120" border="0" cellspacing="0" cellpadding="5">
     <tr>
      <td width="120" align="center" bgcolor="#E1F7E9" style="border: thin outset #E1F7E9;" onMouseOver="this.bgColor='#D1F7D9'" onMouseOut="this.bgColor='#E1F7E9';this.style.border='thin outset #E1F7E9'" onMouseDown="this.style.border='thin inset #E1F7E9';" onMouseUp="this.style.border='thin outset #E1F7E9';frmTeste.location='http://www.macoratti.net'">
       <div style="font-size: 12px; font-weight: bold;">Macoratti</div>
      </td>
     </tr>
    </table>
   </td>
  </tr>
  <tr>
   <td>
    <iframe frameborder="1" height="280" width="480" name="frmTeste"></iframe>
   </td>
  </tr>
 </table>
</center>

O resultado deste código está abaixo:

Macoratti

Espero que este segundo artigo tenha ajudado a clarear mais as nossas idéias sobre o que da pra fazer combinando HTML e JavaScript. No próximo artigo vou mostrar como ocultar e exibir partes da página, e como alterar trechos de texto sem recarregar a pagina.

Até a próxima...

Elieser Carlos Topassi
Web Master -
elieser_topassi@yahoo.com.br

São José do Rio Preto, SP