Manchmal möchte man aus rein optischen Erwägungen auf seiner Seite eine aus Grafiken bestende Navigation haben. Das bedeutet im Normalfall viel Arbeit. Man muss die ganzen Einzelgrafiken zurechtscheiden (und jeweils Mouseover-Versionen), sich dann den Kopf darüber zerbrechen wie man den Mouseover-Effekt realisiert (Javascript? Kann man abschalten. CSS-Pseudoklasse :hover? Geht beim IE auf img-Elementen nicht...) und am Ende muss man sich dann auch noch darum bemühen, dass der Mouseovereffekt ohne Verzögerung beim Nachladen der entsprechenden Grafik kommt.
Weniger ist mehr
Die Lösung all dieser Probleme besteht darin, die entsprechenden Schritte beim Bau einer Bildernavigation einfach nicht auszuführen. Nehmen wir erst einmal eine ganz einfache HTML-Navigation her:
<ul id="navi"> <li><a href="/">Startseite</a></li> <li><a href="projekte.html">Projekte</a></li> <li><a href="referenzen.html">Referenzen</a></li> <li><a href="impressum.html">Impressum</a></li> </ul>

Dies Bildnis ist bezaubernd schön... bzw. hässlich. Macht aber nichts, es ist ja nur ein Beispiel.
Passend dazu basteln wir uns dann die grafischen Repräsentationen der Navigationspunkte (inkl. Varianten für den Mouseover-Effekt), lassen sie aber, statt sie wie gewohnt in Einzelbilder zu zerlegen, in einem Stück.
Dieses Bild wird in Folge nicht mehr angerührt - ab jetzt brauchen wir nur noch css und ein paar kleinere Änderungen an der HTML-Datei. Der Plan sieht wie folgt aus:
- Die Navigationspunkte (Der Text zwischen den a-Tags) werden mit einem Image-Replace-Trick durch das große Navigationsbild ersetzt.
- Durch individuelles CSS-Styling wird das Navigationsbild für jeden Punkt so positioniert, dass es aussieht als wäre dort jeweils ein Einzelbild am Werke.
- Weil das ganze in a-Tags stattfindet, ist es kein Problem mit der :hover-Pseudoklasse den Mouseovereffekt zu erstellen. Es wird einfach das Navigationsbild für a:hover so verschoben, dass statt der normalen Grafik die Mouseover-Version zu sehen ist.
Schritt 1
Image-Replace-Trick
bedeutet in diesem Fall, dass die a-Tags zu Block-Elementen werden, ein Hintergrundbild bekommen - und dass der Text zwischen den a-Tags verschwindet. Wir setzen ihn einfach in einen Span und stylen diesen unsichtbar. CSS-Fähige Browser werden ihn nicht anzeigen, aber für Suchmaschinen, Screenreader und Textbrowser ist der Text immer noch da. Der Code für diesen Schritt:
<ul id="navi"> <li><a href="/"><span>Startseite</span></a></li> <li><a href="projekte.html"><span>Projekte</span></a></li> <li><a href="referenzen.html"><span>Referenzen</span></a></li> <li><a href="impressum.html"><span>Impressum</span></a></li> </ul>
CSS macht aus den Links Block-Elemente und verpasst ihnen unser Navibild als Hintergrund.
#navi { list-style-type:none; margin:0; padding:0; } #navi li a { display:block; width:160px; height:32px; background:white url(navi.jpg) no-repeat top left; } #navi li a span { display:none; }
Jetzt sieht die Navigation schon richtig nach etwas aus, allein die richtige Positionierung des Hintergrundbildes für die einzelnen Punkte fehlt noch.
Schritt 2 und 3
Mit CSS und background-position
kein ist die Positionierung des Hintergrunds kein Problem; und um Zeit zu sparen, legen wir das ganze gleich so an, dass die Position beim Mouseover eine andere ist. Weil das ganze ja nur Hintergrundbilder eines a-Tags sind, brauchen wir dafür nicht mehr als die :hover-Pseudoklasse. Um die einzelnen Links in den Navigationspunkte zu identifizieren, verpassen wir den Listenpunkten noch IDs. Jetzt schaut das ganze so aus:
<ul id="navi"> <li id="navi-start" ><a href="/"><span>Startseite</span></a></li> <li id="navi-projekte"><a href="projekte.html"><span>Projekte</span></a></li> <li id="navi-referenzen"><a href="referenzen.html"><span>Referenzen</span></a></li> <li id="navi-impressum"><a href="impressum.html"><span>Impressum</span></a></li> </ul>
Das CSS mit all den Zahlen ist dann doch etwas mühsam (Beziehungsweise es wird schnell mühsam wenn die Navigationsliste lang wird), aber schneller als sich im Grafikprogramm einen Wolf zu schnibbeln ist's allemal. Letztendlich ist es ja nur einfachstes Rechnen.
#navi-start a:link, #navi-start a:visited, #navi-start a:active { background-position:0px 0px; } #navi-start a:hover { background-position:0px -128px; } #navi-projekte a:link, #navi-projekte a:visited, #navi-projekte a:active { background-position:0px -32px; } #navi-projekte a:hover { background-position:0px -160px; } #navi-referenzen a:link, #navi-referenzen a:visited, #navi-referenzen a:active { background-position:0px -64px; } #navi-referenzen a:hover { background-position:0px -192px; } #navi-impressum a:link, #navi-impressum a:visited, #navi-impressum a:active { background-position:0px -96px; } #navi-impressum a:hover { background-position:0px -224px; }
Uns schon ist unsere Navigation fertig. Kein Javascript, keine großen IE-Probleme, keine Nachladezeit-Probleme. Die optimale Lösung wenn's denn mal Bilder sein müssen.
Nachtrag vom 26. August 2007
Die Methode, die hier zum Verstecken des Textes der Navigationspunkte verwendet wird, hat den Nachteil, dass die versteckten Elemente von Screenreadern nicht erfasst werden. Wie man es besser besser macht ist im Artikel über Image Replacement beschrieben.
Kommentare (12)
Heiko ¶
11. September 2006, 06:48 Uhr
Eine altbewehrte Möglichkeit Navigationen zu realisieren. Man sollte aber auch darauf achten, dass wenn man Grafiken ausblendet, dass die Navigation trotzdem noch navigierbar bleibt. Klasse Weblog im übrigen!
Ralph ¶
25. November 2006, 21:46 Uhr
Super Weblog bzw. tolle Beiträge! Dieses Tutorial ist u.a. für mich sehr hilfreich gewesen. Danke für die Mühe dieses zu erstellen!
no.plan ¶
5. März 2007, 18:13 Uhr
Hättest du passend dazu vielleicht noch eine Option parat, wo das Hover-Image gleichzeitig irgendwie als Link-Active-Image benutzt wird? Ich weiß, dass a:active nicht wirklich brauchbar ist, aber gibt es dafür nicht auch eine simple Methode?
Peter ¶
5. März 2007, 21:30 Uhr
Das Bild auch für den Active-Zustand zu benutzen ist an sich kein Problem. Schwierig wird es dann, wenn der betroffene Navigationspunkt auch als Aktiv ausgezeichnet werden muss, denn da gibt es keine reine HTML/CSS-Lösung. Anders als dem betroffenen Punkt mit PHP oder ähnlichem zusätzlich zur ID eine Klasse zuzuweisen und diese in CSS entsprechend zu formatieren dürfte das kaum gehen.
no.plan ¶
10. März 2007, 16:55 Uhr
Bin mir gar nicht sicher, ob ich deinen Kommentarbereich wegen meine Fragerei verhunze. Aber ich mache es mal trotzdem, da ja vielleicht noch andere an einer Antwort interessiert sind. So denn.
Ich habe diese Methode - etwas modifiziert (für alle Menüpunkte sind die Backgrounds gleich, jedoch sieht man bei mir dann natürlich den Text im a-Tag) - jetzt endlich auf eine meiner Webseiten eingebaut. Aber ich komme sowas von nicht darauf, wie ich diese Liste nicht untereinander, sondern die Menüpunkte nebeneinander angezeigt bekomme?!
Das liegt wohl am display:block des a-Tags, den ich aber benötige, da sonst auch nicht die angegebene Breite übernommen wird.
Hast du einen Tipp für mich?
Peter ¶
10. März 2007, 17:47 Uhr
Du kannst die Navigationspunkte entweder mit
position:absolute;
bzw.position:relative;
von Hand nebeneinander platzieren oder du könntest es mitfloat:left;
bzw.float:right;
versuchen.no.plan ¶
11. März 2007, 11:25 Uhr
So ein Mist. Das float-Tag kam mir eigentlich auch in den Sinn, aber ich glaube ich habe es nicht wirklich ausprobiert und irgendwie überflogen. Geht zumindest. Danke!
Einen Blick auf die Navigation gibt es hier.
Damokles ¶
28. Oktober 2008, 23:31 Uhr
Hey, ich wollte mich erkundigen, ob es auch eine Möglichkeit gibt, diesen Hover-Effekt nicht vertikal, sondern auch horizontal anzuwenden...
Peter ¶
28. Oktober 2008, 23:35 Uhr
Öhm, sicher. Müsstest nur das Bild anders anlegen und entsprechend mit CSS anders verschieben.
_dNick ¶
22. Dezember 2009, 16:38 Uhr
Zitat Peter:
das ist gerade mein ziel diese Navigation horizontal anzulegen.
Jedoch habe ich da ein Problem da es eine Liste ist ordnet es das bild dementsprechend untereinander an. weiss jemand vieleicht eine lösung?
Whitestar ¶
7. Januar 2011, 22:33 Uhr
Hallo,
erstmals vielen Dank für die tolle Beschreibung. Hat soweit alles super geklappt. Der Eintrag ist zwar schon länger her, aber vielleicht kann mir jemand doch weiterhelfen. Ich frage mich, wie ich folgendes realisieren kann, wenn ich diese Navigation weiter ausbaue:
Wenn ich nun auf einen Link klicke bsp. Startseite, dann möchte ich dass der aktive Link, auch als aktiv sichtbar bleibt solange die "Startseite" geöffnet ist.
Normalerweise läuft das ja über a:active oder nicht? aber an dieser Stelle funktioniert dass dann nicht.
Jemand eine Idee?
Danke im Vorraus
Peter ¶
7. Januar 2011, 23:41 Uhr
Das geht leider nicht mit CSS. Da musst du schon PHP oder etwas ähnliches bemühen und dem Link manuell eine Klasse verpassen, die den Link als aktiv markiert.