O uso de bibliotecas JavaScript vem crescendo muito atualmente, mas às vezes utilizamos certas bibliotecas (como a jQuery) para simples tarefas, que poderíamos fazer apenas com JavaScript.
Vejamos na Listagem 1 o que acontece muito nas páginas da web de hoje.
Listagem 1: Pegando o atributo src de uma imagem com jQuery
Poderíamos usar simplesmente o JavaScript para ter o mesmo resultado usando o código da Listagem 2.
Listagem 2: Pegando o atributo src de uma imagem com JavaScript
A intenção do artigo não é desencorajar ninguém a deixar de usar jQuery, mas para quem quer ser um bom front end, um ninja front end, é bom começar a estudar o JavaScript puro. Muitos desanimam ao estudar essa tecnologia por causa da maneira um pouco “diferente” de obter um efeito legal e com um código curto, como acontece com o jQuery, mas com o JavaScript puro dá para se ter efeitos, digamos “muito show”.
Muito bem, chega de conversa, vamos dar inicio ao nosso treinamento “ninja”…
Estrutura HTML e CSS
Vamos criar um pequeno exemplo para mostrar os efeitos fadeIn e fadeOut. Primeiro vamos elaborar nossa estrutura HTML, criando uma div que irá sofrer o efeitos através de dois botões.
dica: Antes de criar algum efeito com javascript ou qualquer outra biblioteca javascript, sempre seguimos estas três ordens: Primeiro construimos a estrutura html, depois elaboramos o nosso estilo com o css, e por último, começamos a brincar com as nossas linhas de códigos javascript
Observe a Listagem 3.
Listagem 3: Estrutura html5 simples
A marcação html é simples, temos uma tag section, que sofrerá as mudanças de opacidade, determinadas como fadeIn e fadeOut. Temos também dois botões qualquer, que serão responsáveis por chamar as funções de acordo com seu “id”.
Em seguida, aplicamos nosso style,conforme a Listagem 4.
Listagem 4: Estilo CSS
Note que só estilizamos a tag section, pois o estilo do botão não é relevante neste exemplo, só é necessário uma cor de fundo na section para que possamos visualizar ela sumindo e aparecendo.
agora iremos aplicar a função dos botões quando o documento for carregado. Observe a Listagem 5.
Listagem 5: Anexando a função de clique nos botões quando o documento for lido
Nestas linhas de códigos acima, anexamos a função de clique para os botões e, de acordo com seu “id”, chamamos a função de fadeIn e/ou fadeOut
Em seguida, criaremos as funções fadeIn (que servirá para determinar quando elemento irá aparecer) e fadeOut (para determinar quando o elemento irá sumir), conforme as Listagens 6 e 7.
Listagem 6: Função fadeIn
**Listagem 7: **Função fadeOut
Estas funções tem como parâmetros element, time, intial, e end, onde:
· element – Elemento que sofrerá o fadeIn ou fadeOut;
· time – Tempo que o fade acontecerá (neste caso, um segundo);
· initial – Estado inicial do elemento;
· end – Estado final do elemento.
Agora criaremos uma função que será responsável por processar os efeitos de fadeIn e fadeOut, conforme abaixo:
No escopo da nossa função, declararemos uma variável responsável pelo incremento (no caso do fadeIn) ou decremento (no caso do fadeOut) do efeito. Esta variável será a chave principal para setar o efeito na opacidade do nosso elemento. Observe a Listagem 8.
Listagem 8. Criação da variável de incremento da função processa
Se o estado inicial do elemento for igual a zero, declaramos o incremento como positivo para que o elemento possa aparecer, colocando-o com um display:block. Mas se o estado inicial do elemento for diferente de zero, então declaramos o incremento como negativo, assumindo o efeito de fadeOut
Agora iremos declarar a opacidade inicial do nosso elemento, declarando uma variável cujo nome será “opc” que irá “sofrer” as mudanças de incremento ou decremento. Observe a Listagem 9.
Listagem 9: declaração da variável de opacidade
Obs: Declaramos a variável “opc”, porque iremos precisar do valor “initial” para fazer uma verificação, em um loop mais na frente, mas também iremos precisar que o valor da variável “initial” também mude para que possamos aplicar as mudanças na tag section
Agora iremos criar um intervalo para simular o efeito fadeIn / fadeOut no nosso elemento. Este intervalo irá se repetir em um intervalo de 10 milissegundos, pois queremos que aconteça o fade em um segundo (1 * 10) == (time * 10), conforme a Listagem 10.
Listagem 10: Intervalo responsável por aplicar efeito de fadeIn ou fadeOut
Dentro do nosso intervalo verificaremos se a variável opc chegou ao estado final, ou seja, se o intervalo completar o efeito de fade limpamos o mesmo, pois ele não será mais necessário. Observe a Listagem 11.
Listagem 11: Verificando se o fade foi completado
Note que foi feita uma nova verificação para ver se o estado final do elemento é zero. Se está em zero, então teremos que esconde-lo para que não ocupe espaço na tela.
Logo após a verificação, setaremos a opacidade do nosso elemento, conforme a Listagem 12.
Listagem 12: setando a opacidade do elemento
Os comandos dentro deste bloco serão executados a cada 10 milissegundos. Na linha “opc += increment;”, a opacidade incrementa ou decrementa. Por exemplo, se a opacidade for 0, o incremento é positivo e teremos a seguinte repetição:
0 + 2= 2 (na primeira execução do loop);
2 + 2 = 4 (na segunda execução do loop);
(………………)
98 + 2 = 100 (na ultima execução do loop);
Mas se a variável opc for maior que 0 (no caso 100), significa que o incremento é positivo, pois no topo do escopo da nossa função processa(), temos uma verificação do parâmetro “initial”, e se initial não for igual a zero (que declaramos a variável opc = initial) a variável increment é negativa. Logo teremos a seguinte função:
100 – 2= 98 (na primeira execução do loop);
98 – 2 = 96 (na segunda execução do loop);
(……………)
98 – 2 = 100 (na ultima execução do loop);
Já na linha “element.style.opacity = opc/100;” seta a opacidade no elemento.
E quem disse que o nosso efeito não é cross browser? Esta linha abaixo faz o nosso efeito de opacidade funcionar no ie8 até o ie6,
O Internet Explorer do 8 abaixo, interpreta a propriedade filter:alpha(opacity=100) como opacity:1;
Disponibilizei o código no github, clique aqui.
Um forte abraço e até a próxima.