CSS sprites in de praktijk: Plan België titels

Dit is het eerste deel van een reeks artikels over CSS technieken waarbij sprites op een creatieve manier worden gebruikt om flexibele en performante resultaten te bekomen.

Aan de hand van CSS sprites kan je het aantal requests op een website beperken, door verschillende afbeeldingen in 1 of meerdere afbeeldingen te combineren. Dit heeft een grote impact op de performantie van je website. Als de sprites dan ook nog eens gecached worden, kan dit de rendering van de pagina’s drastisch optimaliseren.

Plan België

Zo hebben we ondermeer gezorgd voor een grondige frontend optimalisatie bij de uitwerking van de Plan België website. Het doel daar, was om het aantal requests tot een minimum beperken, omwille van het grafische karakter van de site. Daarom leek het ons wel een uitdaging om creatief aan de slag te gaan met PNG afbeeldingen en trachten 1 sprite te maken voor alle titels over heel de website.

Flexibele en herbruikbare PNG’s

Doorheen de Plan België website vind je dit soort titels:

Voorbeeld titels op Plan België website

Voorbeeld titels op Plan België website

Zoals je kan zien: verschillende kleuren en variabele breedtes zijn mogelijk.

Analyse en aanpak

Het idee dat we hadden, was om een transparante afbeelding te gebruiken, waarbij we hetgene dat wit moet zijn, wit houden en hetgene ingekleurd moet worden, transparant. Daardoor kunnen we via CSS een achtergrondafbeelding + achtergrondkleur specifiëren.

Om het gewenste effect te krijgen, maken we gebruik van een 24-bit PNG file. De afbeelding omvat tevens een semi-transparant gedeelte, waar een lichtere variant van de kleur doorschijnt (opacity 85%).

(Semi)transparante 24-bit PNG waarbij ter illustratie het transparante gedeelte groen is ingekleurd

(Semi)transparante 24-bit PNG waarbij ter illustratie het transparante gedeelte groen is ingekleurd

De sprite bestaat dus uit twee delen: .bg en .border

De sprite bestaat dus uit twee delen: .bg en .border

Omdat transparante 24-bit PNG files niet ondersteund worden in Internet Explorer 6, opteren we ervoor om in die browser een 8-bit PNG versie te voorzien. Het resultaat in deze browser is een iets ruwere versie, maar omdat bij Plan België het toch ging om een grunge look, vormde dat geen probleem.

De code

HTML
  1. <h2>
  2. <span class="border">Steun Plan</span>
  3. <span class="bg"></span>
  4. </h2>

Er zijn twee extra spans nodig om de styling naar behoren uit te voeren.

CSS
  1. h2 {
  2. position: relative;
  3. font-size: 15px;
  4. height: 32px;
  5. }

Position wordt op relative geplaatst, om een span absoluut te kunnen positioneren t.o.v. de h2. Verder wordt een vaste hoogte bepaald, omdat de children ofwel absoluut gepositioneerd zullen zijn, ofwel een float zullen krijgen.

  1. .bg {
  2. position: absolute;
  3. left: 0;
  4. height: 18px;
  5. padding: 7px 10px 3px;
  6. color: #fff;
  7. background: #0D5F99 url(img/sprite.png) no-repeat 0 0;
  8. }

De .bg class is het gekleurde vlak achter de tekst. Het wordt absoluut gepositioneerd, krijgt een witte tekstkleur, als achtergrond een kleur én een afbeelding (het bovenste deel van de sprite).

De totale hoogte is 18px + 7px (padding-top) + 3px (padding-bottom) = 28px.

  1. .border {
  2. float: left;
  3. margin: 2px 0 0;
  4. height: 28px;
  5. width: 100%;
  6. background: #0D5F99 url(img/sprite.png) no-repeat 0 100%;
  7. }

De .border class krijgt een float: left, alsook de achtergrondkleur en afbeelding (het onderste deel van de sprite). De hoogte wordt ook ingesteld op 28px, maar met een margin-top van 2px, zodat de lijn net onder het tekstvlak wordt getoond.

De breedte van de .border krijgt een waarde van 100%. Hij neemt dus de hele breedte van zijn parent in (dus de h2). Hierdoor zal de titel steeds even breed zijn als de container waarin hij zich bevindt (bvb smalle kolom, volledige pagina breedte, …)

Om een gelijkaardig resultaat te krijgen in IE6 waren nog enkele aanpassingen nodig in de conditional stylesheet.

  1. .bg, .border {
  2. background-image: url(img/sprite_8bit.png);
  3. z-index: 20;
  4. }
  5. .example .border {
  6. position: absolute;
  7. margin-top: 0;
  8. height: 30px;
  9. z-index: 10;
  10. }

Varianten

Op de Plan België website wordt ook een vereenvoudigde versie van deze titels gebruikt, waarbij een grunge lijntje onder de titel staat. Ook hier hanteren we dezelfde techniek.

Voorbeeld van vereenvoudigde PNG titels

Voorbeeld van vereenvoudigde PNG titels

Demo

Voor het gemak heb ik een demo klaargezet.

Voordelen van deze techniek

  • Slechts 1 HTTP request voor de afbeelding
  • Alle kleuren van titels (voor- en achtergrond alsook het semi-transparante gedeelte) kunnen eenvoudig via CSS aangepast worden
  • Geen image replacement technieken nodig
  • Titel zijn horizontaal schaalbaar
  • Je moet geen afzonderlijke images maken voor de verschillende titels of kleuren

Reacties

Dirk zei op 7 June 2009 om 00:25

Pffew. De voordelen zijn er naar maar dit gaat even duren om helemaal juist te krijgen ;)

Mathias Bynens zei op 19 November 2009 om 11:57

Mooie tutorial!

Je kan span.border ook gewoon weglaten in de markup, en voor de stijling simpelweg h3 gebruiken. Nog eenvoudiger :)

Links naar dit artikel

Momenteel zijn er nog geen links naar dit artikel.

Reageer op dit artikel