Faz alguns anos já que leio aqui e ali sobre a tal técnica de CSS Sprites, mas nunca experimentei. Sempre achei que era complicado demais e que era desnecessário, que o ganho seria irrisório.
Como eu estava enganado!
Na cruzada sagrada para diminuir o tempo de carregamento do blog e do site, melhorando sua performance, descobri esta excelente ferramenta online WebPageTest.
Ela mede quanto tempo leva para carregar uma página completa, e depois lhe dá um relatório detalhado, inclusive com dicas do que você pode fazer para deixar o site mais rápido. Dicas estas, que são as mesmas usadas pelo Page Speed do Google, outra excelente ferramenta online.
Fiquei indignado ao saber que a página principal do meu site (home) estava levando inacreditáveis 40 segundos para carregar completamente! Uma eternidade para a internet.
Uma das sugestões que a ferramenta me deu para melhorar isso, foi justamente… o CSS Sprites. Tá, você venceu. Não vou mais te ignorar. Bora aprender de vez o que é isso e como implementar.
Mas antes, deixa eu te mostrar qual era o meu problema. Esta é uma foto da home do meu site, a página lerda:

Tá vendo aquela tabela cheia de ícones ali? São 30 ao todo. Pois é, eu sempre achei que era melhor ter várias imagens pequenas, que o navegador poderia baixar rapidamente cada uma e fazer cache. Na minha cabeça isso era melhor do que uma única imagem enorme com todos aqueles ícones.
No fim das contas o navegador consegue baixar mais rápido uma única imagem maior do que várias pequenas, pelo fato de que ele não pode abrir muitas conexões simultâneas. O número varia, mas consideremos que é no máximo quatro conexões.
É como um banco lotado com somente quatro atendentes. Aí forma uma fila com todas essas 30 imagenzinhas, que também concorrem com os arquivos CSS, Javascript, outras imagens e todos os outros componentes que compõem a página. E assim, de quatro em quatro por vez, todo mundo fica naquela fila enooorme esperando sua vez e a página demora pra carregar.
A técnica do CSS Sprites consiste em juntar todos estes 30 ícones numa única imagem e deixar que as regras do CSS façam os recortes necessários nesta imagem (usando background-position) para mostrar cada pedaço no lugar certo. A grande vantagem é que sendo uma única imagem em vez de 30, ela ocupa somente uma “atendente do banco”, deixando as outras três livres para atender os outros elementos, e assim a fila anda mais rápido.
É, o CSS Sprites é aquele office boy que chega com uma pasta lotada de boletos e monopoliza um dos caixas do banco por vários minutos :)
Ok, e como implementar o CSS Sprites?
Nem perca tempo querendo fazer isso “na mão” que já tem várias ferramentas prontas na web. Basta procurar por CSS Sprites generator.
A que eu mais gostei foi a http://spritegen.website-performance.org. Você coloca todas as imagens dentro de um ZIP (no meu caso, os ícones) e manda para o generator, que te retorna uma única imagem e ainda de brinde já te dá as regras CSS prontinhas para usar.
Dê uma olhada lá, há várias opções para você escolher na hora de compor a imagem final, como formato (PNG, JPG, GIF), número de cores e qualidade (ambos importantes para deixar o arquivo pequeno!). Também há opções para as regras do CSS, como adicionar prefixo ou sufixo para cada uma.
Dica: Para facilitar sua vida, atente para o nome de cada imagem antes de fazer o ZIP, deixe curto e descritivo, pois ele usará os nomes para gerar as regras do CSS.
Usei este site para gerar um PNG com todos os meus ícones, e depois passei este PNG no Smush.it para garantir que ele não fique pesado.
A imagem ficou com 120KB no final. Não é leve, mas também não é um monstro. Mas o mais importante foi a diferença brutal no tempo de carregamento da página: o que antes eram 40 segundos, agora com CSS Sprites ficou apenas 8 segundos!
Se o seu site está pesado e carrega muitas imagens pequenas, faça a experiência de juntá-las em uma só, que você pode ter um resultado parecido com o meu.
Ah, só pra ilustrar, veja um exemplo de como são as regras CSS que fazem os recortes de cada ícone:
#aa-matrix .sp-adiumbook { background-position: 0 0; }
#aa-matrix .sp-baterna { background-position: 0 -81px; }
#aa-matrix .sp-canivete { background-position: 0 -162px; }
#aa-matrix .sp-carve { background-position: 0 -243px; }
#aa-matrix .sp-codare { background-position: 0 -324px; }
#aa-matrix .sp-csssandbox{ background-position: 0 -405px; }
#aa-matrix .sp-curso { background-position: 0 -486px; }
#aa-matrix .sp-dialog { background-position: 0 -567px; }
#aa-matrix .sp-doc { background-position: 0 -648px; }
...



Pingback: Teste e melhore o desempenho do seu site, blog ou sistema web com o WebPagetest | Blog Projeto Web
“Nem perca tempo querendo fazer isso “na mão” que já tem várias ferramentas prontas na web.”
Estranho ler isso vindo do seu blog… Imaginei que você fosse fazer um shell script pequeno para criar a imagem de “sprites”. Coisa que, aliás, não é difícil de se fazer.
Vou confessar que esta é sempre a minha primeira ideia :)
Mas neste caso, como já tinha uma ferramenta pronta que me satisfazia 100%, não vi motivo para reinventar.
Você pode utilizar este site para diminuir (sem perdas) o tamanho do arquivo sprite: http://www.punypng.com/
Testei pelo menos 10 soluções diferentes e esta foi a melhor.
Outra muito boa, especialmente se vc tem várias imagens para otimizar, o que torna o upload manual no site acima um saco, é esta: http://imageoptim.pornel.net/
O tamanho final é muito próximo ao do Puny PNG e a praticidade é incomparável, pode arrastar pra ele um diretório raiz de imagens e ele otimizará todas. Vc pode clicar no reotimizar que ele vai utilizando diferentes algorítimos de otimização até esgotar todas as possibilidades.
Tinha o mesmo problema que você na hora de desenvolver…. sprite chato e tal.. mas vou testar essas ferramentas…
ah só uma coisa: acho que você deveria dar um destaque maior para as redes sociais nos artigos, onde os usuários compartilham… Achei meio escondido, sei lá… Indico fazer uns testes pra ver se melhora sua divulgação nas redes
Show de bola Aurelio, ficou bem melhor, parabéns!
Vish, não entendi.
Como eu trocaria este fundo por exemplo?
background: url(link da imagem.png) repeat-x top;
Quero trocálo por um fundo que está na posição 0 0,
Mais acho que seu tutorial está faltando explicar mais.
Muito legal sua aula sobre CSS sprites. Sua didática é admirável.