Hinweis
Dieser Beitrag ist schon etwas in die Jahre gekommen. Zwar funktioniert das Dropdown-Menü so wie es soll, der Code ist jedoch nicht hunderprozentig valide. Ich habe daher ein aktualisiertes Tutorial dazu geschrieben, welches du unter diesem Link findest.
Ich habe mir schon lange vorgenommen mal ein Tutorial für ein horizontales Dropdown-Menü zu erstellen. Und da ich gerade mal wieder ein wenig Zeit und Lust hatte, habe ich mal hingesetzt und ein wenig ausprobiert.
Das ist dabei rausgekommen:
Wenn ihr ebenfalls etwas Zeit und Lust mitbringt, zeige ich in diesem Tutorial, wie ihr ein schickes horizontales Dropdown-Menü erstellt. Das Menü wird, mit Ausnahme der Hauptmenü-Icons, CSS-only, wir verwenden also keine Bilddateien.
Das Grundgerüst
Fangen wir mit der HTML-Struktur eines einfachen Menüs (ohne Untermenüs) an. Wir definieren einen übergeordneten Div-Container (menu
) eine Aufzählungsliste (ul
) mit Listenelementen (li
), welche von einem Hyperlink (a
) umschlossen sind, damit das gesamte Listenelement und nicht nur der Name klickbar ist.
<div id="menu"> <ul> <a href="#"><li>Home</li></a> <a href="#"><li>Über mich</li></a> <a href="#"><li>Kategorien</li></a> <a href="#"><li>Tags</li></a> <a href="#"><li>Gästebuch</li></a> <a href="#"><li>Impressum</li></a> </ul> </div>
Ohne Style-Deklaration wird das Menü vertikal dargestellt:
Damit das Menü horizontal angeordnet wird, definieren wir den Div-Container sowie die Aufzählungsliste und die Listenelemente wie folgt:
#menu { position: relative; width: 900px; margin: 20px auto; } #menu ul { position: absolute; margin: 0 auto; list-style: none; } #menu ul li { float: left; margin: 0 0 0 20px; }
womit das Menü nun wie gewollt horizontal ausgerichtet ist:
Um das Menü um Untermenüs zu erweitern, fügen wir im HTML-Code beim entsprechenden Hauptmenüpunkt eine weitere Aufzählungsliste mit weiteren Listenelementen ein.
<div id="menu"> <ul> <li><a href="#">Home</a></li> <li><a href="#">Über mich</a></li> <li><a href="#">Kategorien</a> <ul> <a href="#"><li>Kategorie 1</li></a> <a href="#"><li>Kategorie 2</li></a> <a href="#"><li>Kategorie 3</li></a> <a href="#"><li>Kategorie 4</li></a> <a href="#"><li>Kategorie 5</li></a> </ul> </li> <li><a href="#">Tags</a></li> <ul> <a href="#"><li>Tag 1</li></a> <a href="#"><li>Tag 2</li></a> <a href="#"><li>Tag 3</li></a> <a href="#"><li>Tag 4</li></a> <a href="#"><li>Tag 5</li></a> </ul> </li> <li><a href="#">Gästebuch</a></li> <li><a href="#">Impressum</a></li> </ul> </div>
Die weiteren Aufzählungslisten sowie die darin enthaltenen Listenelemente müssen entsprechend formatiert werden: die Aufzählungsliste positionieren wir absolut, 30 Pixel unterhalb des Hauptmenüs. Die Listenelemente des Untermenüs sollen nicht mehr horizontal sondern vertikal ausgerichtet werden. Daher werden diese nicht mehr gefloatet.
#menu ul ul { position: absolute; top: 30px; padding: 0; margin: 0; } #menu ul ul li { float: none; margin: 0; }
Das Menü zeigt nun die Hauptmenüelemente sowie die Untermenüelemente an:
Damit die Untermenüs nur angezeigt werden, wenn das Hauptmenüelement gehovert wird, verschieben wir die Untermenüs aus dem Bildausschnitt. Bei :hover
des Hauptmenüelements wird das Untermenü dann wieder zurück ins Bild geholt:
#menu ul ul { top: -9999px; } #menu ul li:hover ul { top: 55px; }
Das Grundgerüst für unser Menü ist damit abgeschlossen. Machen wir uns nun an den Feinschliff.
Das Feintuning
Beginnen wir mit der Schriftart. Ich habe in der Demo den Google Web Font „Bree Serif“ verwendet. Diesen binden wir als Standard-Schriftart für das gesamte Menü in die Style-Deklaration wie folgt ein:
@import url(http://fonts.googleapis.com/css?family=Bree+Serif); #menu { font-family: 'Bree Serif', serif; }
Widmen wir uns nun den Hauptmenüpunkten. Wir formatieren die Schrift und binden bei jedem Listenelement ein vorangestelltes Icon ein. Gleichzeitig verändern wir auch noch das Aussehen der Hyperlinks.
Die Icons mit einer Größe von 20 x 20 Pixeln binden wir als img
in den HTML-Code ein. Mittels border-radius
erhalten diese einen runden Hintergrund.
Wo wir gerade beim HTML sind, ergänzen wir die bisherigen Untermenüs um eine Überschrift (h3
). Ändert die HTML-Deklaration von oben wie folgt:
<div id="menu"> <ul> <li><a href="#"><img src="../images/home.png">Home</a></li> <li><a href="#"><img src="../images/ich.png">Über mich</a></li> <li><a href="#"><img src="../images/kategorien.png">Kategorien</a> <ul> <h3>Meistgenutzte Kategorien</h3> <a href="#"><li>Kategorie 1</li></a> <a href="#"><li>Kategorie 2</li></a> <a href="#"><li>Kategorie 3</li></a> <a href="#"><li>Kategorie 4</li></a> <a href="#"><li>Kategorie 5</li></a> </ul> </li> <li><a href="#"><img src="../images/tags.png">Tags</a> <ul> <h3>Meistgenutzte Tags</h3> <a href="#"><li>Tag 1</li></a> <a href="#"><li>Tag 2</li></a> <a href="#"><li>Tag 3</li></a> <a href="#"><li>Tag 4</li></a> <a href="#"><li>Tag 5</li></a> </ul> </li> <li><a href="#"><img src="../images/gb.png">Gästebuch</a></li> <li><a href="#"><img src="../images/impressum.png">Impressum</a></li> </ul> </div>
und definiert im CSS
#menu h3 { font-size: 16px; color: #fff; padding: 10px; margin: 0; background: #000; line-height: 20px; } #menu ul li { line-height: 50px; } #menu ul li a { color: #000; text-decoration: none; } #menu ul li a:hover { color: #999; } #menu ul li img { float: left; width: 16px; height: 16px; margin: 14px 5px; padding: 6px; background: #999; -webkit-border-radius: 25px; -moz-border-radius: 25px; border-radius: 25px; }
Kurz zur Erklärung des line-height
: Die Listenelemente des Hauptmenüs erhalten eine Zeilenhöhe von 50 Pixeln. Das ist notwendig, da wir die Untermenüs nach unten versetzen. Zwischen Hauptmenü und Untermenü wäre damit ein Abstand, der das hovern auf die Untermenüelemente unmöglich macht. Durch die Erhöhung der Zeilenhöhe gibt es keinen Abstand mehr und man kann ohne Probleme vom Hauptmenü in das Untermenü wechseln.
Die Zeilenhöhe von 50 Pixeln macht es notwendig die Bilddateien vertikal zu zentrieren. Zu diesem Zweck, definieren wir einen Außenabstand (margin
).
So schaut’s mittlerweile aus:
Kommen wir zu den Untermenüs, welche wir noch etwas aufhübschen werden. Wir verpassen der Aufzählungsliste des Untermenüs einen schicken Box-Schatten (box-shadow
), passen Innen- und Außenabstände der Liste sowie deren Elementen an, trennen die Listenelemente durch eine dezente Rahmenlinie unten und formatieren die Hyperlinks.
#menu ul ul { margin: 0; -webkit-box-shadow: 0 10px 20px #888; -moz-box-shadow: 0 10px 20px #888; box-shadow: 0 10px 20px #888; } #menu ul ul li { float: none; font-size: 16px; padding: 5px 10px; text-align: left; text-transform: uppercase; margin: 0; border-bottom: 1px solid #ddd; line-height: 20px; } #menu ul ul li:hover { background: #333; color: #fff; } #menu ul ul a { color: #333; text-decoration: none; }
Da wären wir:
Die Untermenüs sollen einen kleinen Pfeil in Richtung des Icons des Hauptmenüelements erhalten
Dazu nutzen wir das Pseudo-Element :before
:
#menu ul ul:before { position: absolute; content:""; width: 10px; height: 10px; top: -5px; left: 20px; background: #000; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); }
Kurz erklärt: wir erstellen mit der Anweisung ein Quadrat, drehen es mittels transform
um 45 Grad und positionieren es in das Untermenü, so dass der Pfeil genau mittig auf das Hauptmenüelement zeigt.
Das letzte Element in der Liste werden wir anders formatieren; insbesondere entfernen wir die Rahmenliste unten. Dazu erstellen wir eine Klasse, die sich auf die Listenelemente des Untermenüs bezieht.
#menu ul ul li.last { font-size: 12px; border-bottom: none; text-transform: none; }
Die zusätzliche Klasse müssen wir im HTML-Code beim letzten Listenelement der Untermenüs ergänzen:
<div id="menu"> <ul> <li><a href="#"><img src="../images/home.png">Home</a></li> <li><a href="#"><img src="../images/ich.png">Über mich</a></li> <li><a href="#"><img src="../images/kategorien.png">Kategorien</a> <ul> <h3>Meistgenutzte Kategorien</h3> <a href="#"><li>Kategorie 1</li></a> <a href="#"><li>Kategorie 2</li></a> <a href="#"><li>Kategorie 3</li></a> <a href="#"><li>Kategorie 4</li></a> <a href="#"><li>Kategorie 5</li></a> <a href="#"><li class="last">Letztes Listenelement →</li></a> </ul> </li> <li><a href="#"><img src="../images/tags.png">Tags</a> <ul> <h3>Meistgenutzte Tags</h3> <a href="#"><li>Tag 1</li></a> <a href="#"><li>Tag 2</li></a> <a href="#"><li>Tag 3</li></a> <a href="#"><li>Tag 4</li></a> <a href="#"><li>Tag 5</li></a> <a href="#"><li class="last">Letztes Listenelement →</li></a> </ul> </li> <li><a href="#"><img src="../images/gb.png">Gästebuch</a></li> <li><a href="#"><img src="../images/impressum.png">Impressum</a></li> </ul> </div>
Dem letzten Listenelement verpassen wir noch einen Pfeil nach rechts mittels des HTML-Zeichens →
.
Damit wäre das Menü schon einsatzbereit.
Als Sahnehäubchen wollen wir zum Schluss noch die Listenelemente, genauer gesagt den Farbübergang bei :hover
, per transition
animieren. Wir fügen dazu noch hinzu:
#menu ul li a { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; }
für die Listenelemente des Hauptmenüs und
#menu ul ul li { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; }
für die Listenelement der Untermenüs.
Da fällt mir gerade noch eins ein: wir könnten den Hintergrund der Icons der Hauptmenüelemente noch bei :hover
verändern und den Farbübergang ebenfalls animieren. Dazu ergänzen wir
#menu ul li img { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; } #menu ul li:hover img { background: #000; }
Fertig.
Browserkompatibilität
Das Menü sollte in allen aktuellen Browsern einheitlich dargestellt werden. Da der Internet Explorer 9 keine transition
verarbeiten kann, sind die Farbübergänge der Listenelemente nicht animiert. Das sollte allerdings verschmerzbar sein.
Wie immer gibt es die Live-Demo zum Probefahren:
und den Download zur freien Verwendung
Variante
Eine Variante hätte ich noch. Ein wenig anders aufgemacht und mit Untermenüs:
Auch hier gibt es eine Live-Demo:
sowie den Download:
Viel Spass damit.
Hallo Olli,
zunächst muss ich Dir zu dieser wunderbaren Schritt-für-Schritt Anleitung gratulieren! Es ist extrem hilfreich gewesen und sehr gut nachzuvollziehen und zu verstehen gewesen. Allerdings habe ich ein Problem. Ich brauche für meine Navigation 4 Ebenen. Alles was allerdings bei mir raus kommt ist entweder, dass nichts in der Ebene angezeigt wird oder die ebene unter der vorherigen liegt. Ich habe schon einige andere Tutorialseiten ausprobiert, aber irgendwie fand ich nichts was ich so gut verstehen konnte.
Ich will dass die 3. und die 4. Ebene einfach zur Seite ausgeklappt werden, damit diese die jeweils vorhergehende Seite nicht überlagern. Bestimmt ist es am Ende wieder ganz leicht. Kannst Du mir da helfen?
Hier mal das HTML Gerüst (Ist nur zum Einstellen gedacht.)
…
wirst Du da schlau draus?
Hallo Wilhelm,
Code in WordPress-Kommentaren ist ein Graus :(
Veröffentliche den Code bitte mal über einen Paste-Service (z.B. Pastebin) und poste den Link im Kommentar. Werde dann mal einen Blick drauf werfen.
Gruß Olli
Moin Moin,
ich bin gerade dabei, das Tutorial mal auszuprobieren aber irgendwie habe ich da recht schnell Probleme bekommen. Bereits beim einfügen und formatieren der zweiten Ebene im Aufzählungsbereich sieht das Ganze schon nicht mehr aus wie es soll. Wenn ich mir die Seite im IE anschaue ist alles wesentlich weiter nach rechts gerückt und im Chrome Browser zuweit nach links. Obwohl laut Tutorial die zweite Ebene direkt unter der Ersten sein sollte.
Gibt es hier neuerdings irgendwelche Schwierigkeiten mit den Browsern oder sehe ich einfach den Wald vor lauter Bäumen nicht?
http://pastebin.com/yeUp1UT7 <- Quellcode
http://pastebin.com/zLae9EUM <- Css Datei
Bin für jeden Tip dankbar :)
Hallo zusammen,
danke erstmal an den Autor für das super Tutorial. Auch für einen Schüler wie mich sehr verständlich geschrieben. Ich habe allerdings noch eine (wahrscheinlich ziemlich dumme) Frage: Wo bekomme ich die Bilder her, die man im Hauptmenü einbinden kann?
LG, Matthias
Ich habs doch noch hinbekommen… war zu leicht ;-)
Schau mal hier:
http://www.flaticon.com/
Hallo Olli,
ich habe heute meine Homepage ins Netz gestellt und möchte dringend wissen, ob ich Ihre Rechte verletze. Bitte im Impressum nachlesen, ob das so stehen bleiben kann, was ich da gerade rein geschrieben habe?
Wenn das so ok. ist, schreibe ich eine Danksagung in Ihr Gästebuch.
Anmerkung: Ich bin 75 Jahre alt und kann fast kein Wort englisch, bin aber mit Basic groß geworden.
Herzliche Grüße
Ralf
Hallo Ralf,
alles okay, du kannst das Menü uneingeschränkt verwenden.
Viel Erfolg und alles Gute für deine Homepage.
Gruß Olli
Hallo Oli,
die Menüleiste ist echt spitze, aber kann ich diese auch in einem Frameset benutzen bzw. wie muss ich den den Code dann ändern.
würde diese gerne auf einer website benutzen die ein drei geteiltes Frameset hat. oben links und in der mitte.
dabei soll die leite in dem oberen Frameset liegen, sich aber die unter Punkte im mittleren frameset öffnen, da sonst der platz im unteren Bereich mir zu klein wird.
hoffe du kannst mir da weiter helfen. ist warhscheinlich ganz einfach wenns mach bar ist. kenn mich zwar etwas aus mit codes, bin jedoch etwas raus aus dem Thema. seid einer weile.
danke schön schonmal gruß patrick
Hallo Patrick,
Framesets sind heute eher selten. Von daher bin ich da nicht so firm. Aber du kannst imo einem Link sagen, in welchem Frame er geöffnet werden soll.
Gruß Olli
Hey Olli,
ich habe ein kleines Problem bei der Menüleiste. Also es klappt alles, aber wenn ich auf einen Menüpunkt gehe, um dann weiter auf einen Untermenüpunkt zukommen, geht das Untermenü wieder zu. Ich hab schon so oft geschaut, ob ich etwas vergessen hab, aber ich find den Fehler nicht, viellecht kannst du mir ja helfen.
Lg Hannah
Hallo Hannah,
zu diesem Thema gibt es ein aktualisiertes Tutorial. Vielleicht hilft dir das bei der Fehlersuche.
Gruß Olli
Habs jetzt gefunden, ich hatte einen kleinen Dreher drin.
Danke schön!
Das Menü geht doch immer noch weg.
Hast du vielleicht eine Idee, an was das liegen könnte?
Wie gesagt, ich hab schon öfter nachgeschaut und ich finde keinen Fehler :(
Oh doch endlich!
sorry :D
Aber das wollte ich noch sagen: du hast das echt gut erklärt!
Hallo Olli
ich habe eine Frage, kann ich diesen Code auch bei BLogger anwenden? Ich habe es zwar versucht aber irgendwie reagieren die Codes nicht, auch nicht deine neue Version, die du zur Verfügung gestellt hast.
Ist der Code also nur auf WordPress anwendbar?
Alles Liebe Ally
Hallo Ally,
der Code hat nichts mit WordPress zu tun. ich kenne Blogger nicht, aber wenn du dort HTML-Code und CSS-Anweisungen hinterlegen kannst, sollte das funktionieren.
Gruß Olli
Halli hallo.
ich komm mit dem Hover Code einfach nicht weiter :(
Wollte zum Testen dein Dropdown Menü nachgestalten (ist mein erstes :D)
aber wo und wie ich den hover code einfügen muss bekomme ich einf nicht hin. Habe alles ausprobiert und auf anderen Seiten gesucht – hoffnungslos. :o
Könntest du mir bitte helfen uns sagen wo genau ich Ihn eintragen muss
(und wäre es richtig wenn der vorhandene top:30px; durch die -9999px ausgetauscht wird oder hab ich das auch falsch verstanden?)
Kategorien
Kategorie 1
Kategorie 2
Kategorie 3
Kategorie 4
Kategorie 5
Hallo Tanja,
es gibt einen aktuelleren Beitrag zu dem Thema (s. hier). Ich empfehle dir das Tutorial dort durchzuarbeiten.
Gruß Olli
Servus
ich habe das Problem dass bei mir einige Befehle wie o-transition usw. nicht funktionieren und nur rot angezeigt werden, auserdem schließen sich die Unterpunkte immer wenn man daraufklicken will. Bei mir ist zwar alles vertikal usw. aber irgendwie wird der style nicht angezeigt. Bin neu in HTML.
Dange schonmal :D
Hey, erstmal danke für deine ausführliche Anleitung. Das sieht sehr gut aus!
Meine Frage wäre, ob es auch kommerziell nutzbar ist. Mit kosten verbunden? In deinem Download ist keine Verinbarung oder ähnliches.
Danke und Gruß
Hallo Rolf,
nein, keine Kosten. Darfst du mit machen, was du willst :)
Viel Erfolg.
Gruß Olli
[…] […]
Hi Olli,
bei mir funktionert es super, aber wenn ich einmal auf meinen link geklickt habe; dann formatiert er sich anders
wie kann ich das ändern?
Hallo Olli,
eine wirklich tolle Seite die sogar mir als totalem Anfänger schon einiges geholfen hat.
Ich habe mir deine Demo runter geladen und damit ein wenig rum probiert bis da alles so lief wie ich wollte :-)
bleibe jetzt allerdings dabei hängen …..
Wie kann ich denn wenn ich einen Dropdown-Punkt anklicke, dem Programm sagen dass es auf eine andere Seite springen soll ?
Habe schon sehr viel gelesen aber nichts gefunden was mir weiter hilft.
Gruß
Jörg
Hallo Olli,
sehr hilfreich und gut. Ich habe ein wenig rumgespielt und habe die Menüpunkte untereinander gemacht. Jetzt möchte ich das sich die Untermenüpunkte nach unten öffnen und sich die Menüpunkte nach unten verschieben. Geht das ohne JS überhaupt sprich nur mit HTML und CSS wäre toll eine Info oder Hinweis zu bekommen ich beiße mir gerade als Anfänger ein wenig die Zähne aus :D
Besten Dank vorab
Hallo,
wirklich tolle Seite. Bin Anfänger und habe das Menü mir mal angeschaut. Das ist das was ich brauche. Allerdings habe ich noch ein kleines Problem bei der Darstellung :
Ich möchte, dass wenn ich im Menü z.B. auf „Kategorien“ –> „Technik“ klicke dieser Inhalt des links nicht in einem neuen Tab sondern unterhalb des Menüs angezeigt wird (d.h. unter des Horizontalen Menüs).
Wie mache ich das ?
Ich habe dieses Tutorial befolgt und jetzt habe ich ein super Menü für mein Schul Projekt. Ein großes DANKESCHÖN an den Autor dieses Beitrages. Ich fand auch super, dass du alles so gut erklärt hast. Vielen Dank dafür.