Google+
Google+
Facebook
Facebook
Linkedin
Linkedin
Twitter
Twitter
SlideShare
SlideShare
Homepage
Homepage

quarta-feira, 12 de outubro de 2011

Efeito de brilho com jQuery

A intenção é criar um efeito semelhante ao das abas do Chrome ou da barra de ferramentas do Windows 7, no qual um brilho se move sobre o botão acompanhando o cursor. Seguindo esse tutorial, nosso resultado será esse:


Vamos lá. O primeiro passo é baixar a biblioteca jQuery e ligá-la ao documento HTML. Se você não sabe como fazer eu já postei aqui no blog (Utilizando o jQuery). No nosso arquivo HTML nós teremos dois elementos div para cada botão, um para o botão em si (a depender da implementação pode ser um item de uma lista) e outro para o brilho. Vamos fazer três botões, então nosso código HTML ficará assim:

<html>
    <head>
        <script type="text/javascript" src="jquery.min.js"></script>
    </head>
    <body>
        <div class="botao twitter"><div class="brilho"></div></div>
        <div class="botao orkut"><div class="brilho"></div></div>
        <div class="botao facebook"><div class="brilho"></div></div>
    </body>
</html>

Agora o CSS. Você pode baixar as imagens aki: link
Para o elemento com a classe 'botão': definimos altura e largura, deixamos os elementos flutuando à esquerda (dessa forma o menu aparecerá como se estivesse inline), espaçamento de 10px à esquerda, overflow: hidden para esconder a parte do brilho que exceder o espaço do botão e borda arredondada na div para que a sombra fique da mesma forma e se adeque às imagens utilizadas.

(Atenção: certifique-se de ajeitar a sombra e as bordas porque são especificas do CSS3 e portanto sensíveis à inconsistências de renderização. Para esse exemplo usei o Chrome e não me preocupei com outros navegadores). 

Para o elemento com a classe 'brilho': definimos apenas altura e largura. Além disso, definimos o background de cada item. Nosso CSS ficará assim:

.botao{
    width:48px;
    height:48px;
    float:left;
    padding:0;
    margin-left:10px;
    overflow:hidden;
    border-radius: 8px;  
    box-shadow:3px 3px 5px #ddd;
}
.brilho{
    width:55px; 
    height:55px;
}
.twitter{
    background:url(images/twitter.png);
}
.orkut{
    background:url(images/orkut.png);
}
.facebook{
    background:url(images/facebook.png);
}

Por fim, o JavaScript utilizando jQuery. É nesse momento que adicionaremos a imagem do brilho ao elemento de classe 'brilho', para que não seja obstrutivo. Ou seja, caso o JavaScript não funcione não haverá o efeito, mas o menu continuará usável. Quando o mouse se mover sobre o botão o brilho aparecerá com uma margem à esquerda equivalente à distância do cursor subtraída da distância do botão, ambas a partir da borda esquerda do navegador. Para colocar a imagem exatamente no centro do cursor basta subtrair o valor anterior da metade do tamanho da imagem usada como brilho. Definimos a margem superior num processo semelhante. Ocultamos a imagem do brilho através do JavaScript e permitimos que ela apareça apenas quando o cursor estiver sobre o botão e torne a desaparecer caso contrário. Desse forma nosso código ficará assim:

$(document).ready(function() {
    var half = 27; // Metade do tamanho da imagem
    var pos; // Posição do botão
    $(".brilho").css("background","url(images/light.png)").hide();

    $(".botao").mousemove(function(mouse){
        pos = $(this).offset();
        $(this).find(".brilho").show();
        $(".brilho").css("margin-left",mouse.pageX - half - pos.left);
        $(".brilho").css("margin-top",mouse.pageY - half - pos.top);
    }).mouseout(function(){
        $(".brilho").hide();
    });
});


Nosso efeito está pronto. Veja o resultado: Demo.
Você pode substituir o show/hide do jQuery por fadeIn/fadeOut se quiser suavizar o efeito. Além disso a imagem que você criar para o brilho fará a diferença, essa que usei fiz às pressas. 

É isso aí, espero que tenham gostado.

domingo, 2 de outubro de 2011

Sprite com CSS

Para aqueles que se preocupam em otimizar seus sites uma boa técnica é juntar várias pequenas imagens em uma só, chamada Sprite, para diminuir a quantidade de requisições feitas ao servidor e o tempo de download da página. Através do CSS seleciona-se os pontos dessa imagem que devem ser mostrados. Já falei aqui no blog sobre como posicionar o Sprite (Rollover com Sprite), mas não falei sobre como produzir a imagem. Pelo menos não ainda.

Há outras opções além de fazer na unha usando ferramentas de edição de imagens. É possível fazer o Sprite de forma automática e on-line como no SpriteMe, Spritemapper, Sprite Cow, SmartSprites, Gerador de Sprites CSS e o CSS Sprites Generator. Aqui eu vou mostrar um pouquinho do SpriteMe funcionando.

Inicialmente é necessário instalar a ferramenta adicionando-a aos favoritos, como na imagem a seguir:


Basta ir à página web e abrir o SpriteMe. Ele ninjamente agrupa as imagens encontradas na página e então você pode gerar Sprites a partir desses grupos ou fazer seu próprio grupo clicando em "new sprite".


Na página acima o SpriteMe formou dois grupos: um com cinco imagens do rodapé e outro com a logo. Clicando em "make sprite" no primeiro grupo é gerado o Sprite com todas as imagens do rodapé:


É importante fazer o download da imagem e hospedá-la no servidor. Não tente usar o link gerado porque ele é apenas temporário.

Rollover com Sprite

O efeito rollover é criado no CSS mudando o background de um elemento, geralmente um botão ou item de um menu, ao passar o cursor do mouse sobre ele. O efeito pode não ficar muito legal usando imagens quando elas demoram de carregar. O botão some quando o cursor está sobre ele e só reaparece quando a segunda imagem carrega. Para evitar esse problema basta juntar as imagens em uma só para que todas as imagens utilizadas sejam carregadas de uma só vez, como nesse exemplo:


Ao invés de utilizar duas imagens, uma para o link normal e outra para quando o cursor do mouse estiver sobre o link, utilizamos uma só imagem e mostramos só a parte que interessa. Só para testar, podemos criar uma div com o tamanho exato de apenas uma imagem e setar a imagem como seu background:

<html> 
     <head> 
          <style type="text/css">
               div { 
                    height:48px;
                    width:48px;
                    background:url(twitter.png);
               }
          </style>
     </head>
     <body> 
          <div></div>
     </body> 
</html>


Para criar o efeito rollover basta mover a imagem usando o pseudo-elemento :hover e a propriedade background-position para alterar a posição da imagem em relação ao eixo x:

...
<head> 
     <style type="text/css">
          div { 
                height:48px;
               width:48px;
               background:url(twitter.png);
          }
          div:hover {
               background-position: -48px 0px;
          }
     </style>
</head>
...


A mesma solução pode ser aplicada a outros elementos HTML com sprites maiores, como esse: