CSS Sprites na prática: o carregamento da página caiu de 40s para 8s!

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:

Página principal do site com uma seta apontando para a tabela de ícones

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.

Mas é justo o contrário!

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.

Tela principal do CSS Sprite Generator

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;  }
...
— EOF —

Gostou desse texto? Aqui tem mais.