Fórum iBlue
Menu jQuery Com Efeito Animado Buddy_Group

Bem Vindos ao iBlue GAMES!

Registre-se para obter acesso especial em todo conteúdo presente no Fórum!
Tenha um bom uso do nosso fórum, e seja ativo!





Fórum iBlue
Menu jQuery Com Efeito Animado Buddy_Group

Bem Vindos ao iBlue GAMES!

Registre-se para obter acesso especial em todo conteúdo presente no Fórum!
Tenha um bom uso do nosso fórum, e seja ativo!





Somos ÚNICOS, somos o SEU fórum


Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir para baixo  Mensagem [Página 1 de 1]

Quakeline

1Menu jQuery Com Efeito Animado Empty Menu jQuery Com Efeito Animado Ter 1 Jan 2013 - 10:01

Quakeline
Membro
Menu jQuery

Umas das possibilidades criada pelo jQuery e que eu mais gosto de explorar é a criação de animações. Pequenas funções que somadas, geram resultados impressionantes e com poucas linhas de código.

Neste tutorial vou apresentar o passo-a-passo da criação do efeito que utilizei no menu do meu portfolio.

A idéia é de que, ao passar o mouse sobre um dos itens, uma lâmpada apareça e faça um movimento até o topo da palavra, dando uma leve piscada em seguida.

[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]

Veja aqui uma Demo deste Menu com Efeito Animado

Estrutura HTML Do Menu

Iniciamos com a estrutura HTML do menu.

Código:
<ul class="menu">
            <li ><a href="#" title="inicial" >inicial</a></li>
            <li><a href="#" title="sobre">sobre</a></li>
            <li><a href="#" title="portfolio">portfolio</a></li>
            <li><a href="#" title="serviços">serviços</a></li>
            <li><a href="#" title="clientes">clientes</a></li>
            <li><a href="#" title="blog">blog</a></li>           
            <li><a href="#" title="contato">contato</a></li>
          </ul>

Aparência Dos Elementos Com CSS

Começamos a definir a aparência dos elementos com o CSS.

Código:
.menu{margin:100px 80px;}

.menu li{display:inline; font-size:2em;}

.menu li a{color:#c8edef; padding:35px 30px 0 30px; position:relative; text-decoration:none;}

.menu li a div{position:absolute; top:-40px; left:0px; width:100%; height:115px; background:url(img/light.png) no-repeat top; display:none;}

Posicionamos o bloco do menu 100px distante do topo e 80px da borda esquerda.
Em seguida definimos para os itens da lista o display:inline, que posiciona-os um ao lado do outro.

Para os links é criado um espaçamento, que além de ser responsável por uma estética mais agradável cria um espaço para receber o ícone da lâmpada. Com o position:relative, informamos que o ícone será posiciona entre as fronteiras do elemento.

A div que será criada dentro dos links é posicionada absolutamente me relação a eles. Tem uma margem superior negativa para que fique acima dos itens do menu. A largura é de 100% para que a imagem de fundo fique exatamente no meio da palavra e a altura é a da imagem de fundo. Por fim escondemos esta div com um display:none.

Como você pode ver é uma estilização simples, mas com propriedades chave sem as quais o efeito não funciona

Arquivos Javascript

Antes de tudo adicione a biblioteca jQuery no cabeçalho do arquivo HTML. Você tem duas opções. Incluir o caminho do arquivo no seu servidor ou adicionar o endereço do arquivo existente nos servidores do Google.

Se você escolher a última opção inclua a linha abaixo antes da tag head do documeto HTML:
Código:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jQuery/1.3.2/jQuery.min.js"></script>

Crie um documento javascript e salve ele como “javascript.js” e inclua o caminho até o arquivo no cabeçalho logo após a linha que adiciona o jQuery. O cabeçalho deve ficar como aparece abaixo.

Código:
<link rel="stylesheet" type="text/css" href="estilo.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jQuery/1.3.2/jQuery.min.js"></script>
<script type="text/javascript" src="javascript/javascript.js"></script>

A primeira linha do arquivo javascript começa com

Código:
$(function(){

})

Selecionando O Elemento

Todo o código que precisa do jQuery será posto entre as chaves. E o código somente será executado quando a estrutura da página HTML estiver pronta. Por isso, se você quiser, pode adicionar o arquivo javascript no final da página que não haverá problemas.

Código:
$(function(){
  $('.menu li a').hover(function(){

  })
})

Observe agora como definimos para qual elemento o script deve atentar para saber quando rodar o código.

Código:
 <ul class="menu">
              <li >
<a href="#" title="inicial" >inicial</a></li>

No código HTML, somente um elemento tem a classe “menu”, então partimos deste elemento e fazemos o caminho passando pelo até chegar ao link que é o nosso objetivo.

Conhecer o código da página é vital para que você não precise criar ids para todo elemento que precisar de um código javascript.

Como o jQuery permite selecionar elementos a partir da classe, o código fica limpo e bem estruturado.

O hover funciona da mesma maneira que no CSS. Define o que acontecerá quando o usuário passe a seta do mouse sobre um link do menu.

Anexando A div Ao Código

Código:
$('.menu li a').hover(function()
  {
  $('.menu li a')
  .stop()
  .fadeTo("fast",0.5); 
  var bubble = "<div></div>";
  $(this).append(bubble)
  })

Ao passar o mouse sobre o link, toda animação que estiver rodando neste ou em outros links do menu (‘.menu li a’), será parada utilizando stop().

Com isso nós evitamos o problema de uma animação continuar acontecendo mesmo depois o evento desencadeador ter acontecido há tempos.

O jQuery oferece a possibilidade de encadear comandos. Por isso, depois do stop(), já aplicamos o fadeTo(), sem precisar informar que deve ser aplicado aos links do menu.
Após alterarmos a opacidade de todos os itens, criamos uma variável que contém um trecho de código HTML.

Na linha abaixo, o $(this) faz referência ao elemento que recebeu a seta do mouse (hover). Nesse link é anexada a div. Você não verá o resultado disso no código da página, mas a título de ilustração, fica assim:

Código:
<li >
<a href="#" title="inicial" ><div></div>inicial</a>
</li>

Essa é a div que contém a imagem da lâmpada no fundo. A esta altura do código ela somente foi anexada ao link, mas não é visível porque no código CSS definimos display:none para toda div que estivesse dentro de um link contido no menu.

Mostrando E Animando A Imagem

Agora que a div com a imagem faz parte do código vamos providenciar para que ela seja mostrada. A idéia é de que ela apareça, faça um leve movimento para cima, e pisque.

Código:
  $(this).append(bubble)
  .fadeTo("fast",1)
  .children('div').animate({opacity: "show", top: "-50"}, "slow")
  .fadeTo("fast",0.8)
  .fadeTo("fast",1);

Lembra que definimos que a opacidade dos links fique em 0.5? Pois agora, o link que recebeu a seta do mouse volta à opacidade normal com o fadeTo().

Chega o momento de animar a div que anexamos ao código. Como chegar a ela? No HTML, existe uma hierarquia, com nós, elementos pai e filho entre outros. A div que criamos, esta dentro do link que recebeu a seta do mouse, sendo assim ela é considerada filha deste elemento.

O jQuery possibilita o acesso a esta div usando o children(). Com isso também mudamos o foco do código, que agora passa a aplicar os efeitos nesta div. Por isso o animate() que vem em seguida, não será aplicado sobre o item do menu e sim sobre a div.

A função animate() oferece um grande número de opções que podem ser potencializadas encadeando a alteração nas propriedades. No caso da nossa animação são alteradas duas propriedades, a opacidade, para mostrar a div oculta e a distância em relação ao topo, que cria o movimento. E um último parâmetro que torna a execução lenta (slow).

Quando a lâmpada já estiver no lugar, encadeamos dois fadeTo() para criar um leve efeito onde ela pisca. E esta finalizada a primeira parte.

Código:
$('.menu li a').hover(function()
  {
  $('.menu li a')
  .stop()
  .fadeTo("fast",0.5);         
  var bubble = "<div></div>";
  $(this).append(bubble)
  .fadeTo("fast",1)
  .children('div').animate({opacity: "show", top: "-50"}, "slow")
  .fadeTo("fast",0.8)
  .fadeTo("fast",1);
  }

Revertendo A Animação

Quando a seta do mouse sair de sobre o link, a imagem tem que desaparecer e os outros itens do menu voltar a opacidade normal. Novamente vamos aproveitar a possibilidade de encadear as ações para tornar o código mais limpo.

O método hover() possibilita que você determine o que acontece quando a seta do mouse estiver sobre o elemento e quando ela mudar o foco em apenas uma declaração.

Código:
$('.menu li a').hover(function()
{
  // código para quando o mouse estiver sobre o elemento
}, function() {
  // código para quando o mouse estiver sair de sobre o elemento
}
)

Vamos fazer a segunda parte deste código.

Código:
  ,function()
  {
    $(this)
    .children('div')
    .animate({top: "-40", opacity: "hide"}, "slow");
    $('.menu li a')
    .stop()
    .fadeTo("fast",1); 
  }

Quando fechamos a chave da primeira função, retornamos o foco do código para o link do menu, e é a ele que nos referimos ao utilizar o $(this) agora. Utilizando o children() encontramos a div que foi animada e esta dentro do link. Com a função animate() a div é escondida e a posição alterada para baixo. Completado isso, a div é removida do HTML com o remove().

São selecionados todos os links do menu, é parada qualquer animação que estiver acontecendo com eles usando o stop(), e a opacidade retorna ao normal com o fadeTo().

Funcionando No IE

Ao rodar o código feito até aqui nos navegadores modernos, ele vai funcionar perfeitamente, menos no Internet Explorer…

O problema do IE é não animar corretamente quando aplicamos efeitos de opacidade, que foi o que fizemos com o fadeTo(). Se você testar nele, verá que é criado um fundo preto na imagem até ela ter a opacidade 1.

Eu gostei muito do efeito e decidi que não deixaria de utilizá-lo somente porque o IE não oferece suporte. Então vamos a solução

jQuery.support

Esta coleção de propriedades criada com o jQuery 1.3 serve para filtrar os navegadores baseada nas diferenças e bugs de cada um. No final das contas é uma maneira de saber quando isolar o IE.

Neste caso, vamos usar o jQuery.support.opacity, que vai rodar o código somente nos navegadores que interpretam corretamente a propriedade opacity. Que não é o caso do IE, que usa o alpha filter.

Na primeira parte do código vamos criar uma declaração condicional. Se o navegador suporta opacity, rodamos o código completo, do contrário são retirados alguns efeitos, mas a animação ainda acontece.

Código:
if (jQuery.support.opacity)
{
$(this).append(bubble)
  .fadeTo("fast",1)
  .children('div').animate({opacity: "show", top: "-50"}, "slow")
  .fadeTo("fast",0.8)
  .fadeTo("fast",1);
} else {
  $(this).append(bubble)
  .children('div')
  .animate({top: "-55"}, "slow")
  .show();
}

O mais interessante nesta abordagem do jQuery.support é de que, se em alguma versão futura o IE suportar a propriedade opacity o código completo vai rodar sem que você precise alterar o código.

Créditos WebMaster

Ver o tópico anterior Ver o tópico seguinte Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos