Das Navigationsmenü von Kram-hochladen.de funktioniert zuverlässig in allen Browsern - sogar im Internet Explorer. Augenscheinlich sogar ohne Javascript und nur mit CSS, was aber, wenn man die IE betrachtet, nur bedingt stimmt. Aufgrund mehrfacher Anfragen habe ich dieses kompaktes Tutorial für die bei KH eingesetzte Art der Navigation geschrieben.
HTML-Struktur
Die Struktur der Navigation setzen wir sinnvollerweise als Liste in HTML um.
<ul id="navi"> <li><a href="#">Willkommen</a></li> <li><a href="#">Über uns</a> <ul> <li><a href="#">Angebot</a></li> <li><a href="#">Geschichte</a></li> <li><a href="#">Jobs</a></li> </ul> </li> <li><a href="#">Projekte</a> <ul> <li><a href="#">Alpha</a></li> <li><a href="#">Beta</a></li> <li><a href="#">Gamma</a></li> </ul> </li> <li><a href="#">Impressum</a></li> </ul>
In Sachen HTML ist damit auch schon die Arbeit getan, der Rest ist (fast) komplett mit CSS zu erledigen.
Gestaltung mit CSS
Bevor wir uns an die Funktionalität machen, wird die Liste zunächst optisch etwas zweckdienlicher gestaltet. Vor allem müssen die Listen von ihren üblichen Formatierungsmerkmalen (Aufzählungszeichen, Margins usw.) befreit werden. Wer schlau ist und einen Reset-Stylesheet benutzt, kann sich diesen Schritt natürlich sparen.
#navi, #navi ul { list-style-type:none; margin:0; padding:0; }
Als nächstes werden die Oberpunkte der Navigation (im Beispiel: Willkommen, Über uns, Projekte und Impressum) horizontal angeordnet und in Form gebracht.
#navi li { width:128px; float:left; }
Aufklapp-Funktion mit CSS
Um das Auf- und Einklappen des Menüs zu realisieren, bedienen wir uns der Pseudoklasse :hover
. Die Listen mit den Unterpunkten werden ganz einfach ausgeblendet und nur dann angezeigt, wenn ihr Elternelement (das <li>
des Oberpunktes) einen Mouseover meldet.
#navi li ul { display:none; } #navi li:hover ul { display:block; }
Das wäre es eigentlich auch schon... gäbe es da nicht den immer noch verbreiteten Internet Explorer 6.
IE-Tauglichkeit mit HTC
Der IE6 unterstützt :hover
ausschließlich für Links. Wie so oft hilft in solchen Fällen ein HTC-Script, mit dem man dem Browser nicht nur PNG-Unterstützung, sondern auch andere moderne Features beibringen kann - so auch :hover
-Support für alle Elemente. Das unter LGPL stehende Script whatever:hover ist genau das, was wir brauchen.
Der Einbau erfolgt im Idealfall mittels einem mit Conditional Comments eingebundenen IE-Stylesheet.
body { behavior:url("csshover.htc"); }
Schon unterstützt der Internet Explorer :hover
als hätte er es immer schon gekonnt. Die Navigation ist damit einsatzbereit.
Schlussbetrachtungen
Wie es die Überschrift des Artikels schon verrät, ganz ohne Javascript geht es eben nicht - eine HTC-Datei enthält nichts anderes als spezialisiertes JS. Das bedeutet auch, dass das Menü in einem Internet Explorer mit abgeschaltetem Javascript streikt.
Damit die Navigation auch schön aussieht, ist natürlich weiteres Styling nötig. Insbesondere müsste das Menü so positioniert werden, dass bei Aus- und Einklappen nicht darunter liegende Elemente verschoben werden. Eine andere Anordnung oder noch tiefere Verschachtelung ist natürlich auch immer möglich.
Wie so eine Navigation aussehen kann, lässt sich auf dieser Beispielseite (mit reichlich kommentierten CSS) betrachten.
Kommentare (50)
Stefan ¶
7. August 2007, 18:16 Uhr
DANKE genau das habe ich gesucht! :-)
Ich habs übrigens mal im IE 6 ohne diese HTC probiert, ging wunderbar . . .
Hans ¶
2. September 2007, 14:08 Uhr
Mit FF klappts bei mir wunderbar. Bei IE hab ich aber noch das Problem das wenn ich auf einen der aufgeklappten Links gehen möchte, sich das Menü wieder schließt bevor ich auf nen Link klicken kann?
Wie könnte ich das beheben?
gerri ¶
12. September 2007, 12:40 Uhr
@hans haben deine unterelemente ein margin zueinander !? sollte das der fall sein schließt der ie das menü immer dann wenn du über den margin fährst... lös es am besten über ein padding.....
habe ein anderes problem weis jemand eine möglichkeit das aufklappen nach oben zu ermöglichen, ohne ein negatives margin-top !?
Peter ¶
12. September 2007, 12:51 Uhr
Was spricht gegen negativen Top-Margin? Die Standards erlauben das.
gerri ¶
12. September 2007, 19:50 Uhr
ja die standarts erlaubens aber nach dem ich die menü punkte dynamisch durch ein cms erstellen lasse müsste ich den margin-top jedes mal neu berechnen lassen, wenn der benutzer einen neuen untermenüpunkt anlegt...
Moritz ¶
9. November 2007, 18:17 Uhr
Funktioniert eigentlich... Echt klasse.
Nur, wenn die Liste unterhalb eines Menupunktes zu lange ist dann wird sie vom Context verdeckt.
Wie bekomme ich es hin das die Liste immer ON-TOP ist?
Danke und Grüße
Moritz
Peter ¶
9. November 2007, 18:20 Uhr
Ich glaube du suchst z-index.
Moritz ¶
9. November 2007, 18:28 Uhr
Genau, ich habe nur 1 Element mit z-index, und zwar das hat dieses zugewiesen.
Die anderen nicht!
Klappt also nicht.
Peter ¶
9. November 2007, 18:33 Uhr
Kannst du die fragliche Seite mit dem Menü irgendwo hochladen? Ferndiagnose ist bei sowas immer schwer.
Moritz ¶
9. November 2007, 18:46 Uhr
Klar
Klick
Peter ¶
9. November 2007, 18:52 Uhr
Wenn man da #content in der style.css
position:relative;
undz-index:-10000;
verpasst, scheint es zu gehen.Moritz ¶
9. November 2007, 18:55 Uhr
Ja!!!
Vielen Dank.
Gruß
Moritz
David ¶
9. Dezember 2007, 13:28 Uhr
super beschrieben, ich hätte nicht gedacht dass man Drop-Down-Menüs so einfach machen kann...
Diese Seite ist generell total gut vom Design und Inhalt her... ein großes Vorbild ;-)
mfG david
Peter ¶
9. Dezember 2007, 13:39 Uhr
Danke, das liest man doch gern!
jakob ¶
26. Dezember 2007, 10:19 Uhr
super seite, macht es wirklich einfach ein dropdown zu machen. saubere arbeit. vielen dank
Daniel ¶
3. Januar 2008, 17:35 Uhr
Zitat gerri:
hey, ich abe auch das Problem, das es der IE immer weider sofort schließt, allerdings habe ich eigtl kein margin drin.. wenn, dann arebeite ich mit line-height.
Ich poste schnell mal mein CSS
#navi {
position: absolute;
top: 0px;
left: 0px;
width: 160px;
margin-top: 25px;
color: #FFFFFF;
font-weight: bold;
font-size: 0.8em;
z-index: 4;
}
#navi > li { /* Normalzustand eingeklappt */
overflow:hidden;
height: 25px;
padding-left: 10px;
border-bottom: 1px solid #FFFFFF;
line-height: 25px;
background-image: url(navi_pfeil.png);
background-repeat: no-repeat;
background-position: 141px 7.5px;
}
#navi > li:hover { /* Ausgeklappt */
overflow:visible;
height:auto;
background-image: url(navi_rot.png);
background-repeat: no-repeat;
background-position: 0px 0px;
}
#navi > li > ul > li {
margin-left: -10px;
}
#navi > li > ul > li:hover {
background-color: #7F7F78;
}
Daniel ¶
3. Januar 2008, 17:42 Uhr
achja und die elemente der unteranvigation
haben nochmal folgende eigenschaften:
padding-left: 25px;
line-height: 25px;
font-weight: normal;
font-size: 0.9em;
Niels ¶
7. Januar 2008, 09:06 Uhr
Hallo!
Ist n super geiles Menü!
Habe es gleich mal in eine Seite für n Freund von mir eingebaut! Leider verrutschen mir die Sub-Menüs im IE =(
Kann mir jemand helfen?
Hier die Seite:
http://www.shotlogistics.de/v1/home.html
Wäre dankbar für Hilfe!
Peter ¶
7. Januar 2008, 09:19 Uhr
Danke für's Lob. Um das Menü zu fixen, würde ich einfach einen IE-Stylesheet nehmen und dort den Submenüs so viel negativen
margin-left
verpassen bis es sitzt.Marco ¶
7. Januar 2008, 21:41 Uhr
Hallo!
Ich habe auch ein Java Script Menu. Es funktioniert wunderbar. Nur habe ich das Problem, wenn das Menu geöffnet ist und ich einen Link anklicke wird das Menu sofort wieder geschlossen. Was muss ich machen, damit das Menu auch auf der neuen Seite geöffnet bleibt?
Ich wäre sehr dankbar, wenn ihr mir helfen könnt. Komme da einfach nicht weiter:(
Gruss
Marco
Peter ¶
8. Januar 2008, 00:05 Uhr
Erstens ist das hier nicht unbedingt die richtigste Stelle für diese Frage. Hier geht es ja gerade um ein Menü, das nach Möglichkeit ohne Javascript auskommen soll.
Zweitens lässt sich mir diesem HTML ohne Kontext (Javscript und CSS) wenig anfangen.
Drittens: Der
href
-Wert eines Links ist niemals #anna* ¶
13. Januar 2008, 14:56 Uhr
hallo,
ich habe eine sehr bescheidene frage, da ich was html, css, php angeht neuling bin.
ich weiß es passt nicht wirklich hier rein...aber vielleicht kann mir jemand ja nen tipp geben wo ich im großen weiten web eine antwort finde?
also ich versuche verzweifelt ein drop down menü zu gestalten...welches vertikal angeordnet ist und sich aufklappt (und so bleibt) sobald ich einen menüpunkt angeklickt habe. beim nächsten klick auf
nen anderen menüpunkt sollte das eben aufgeklappte erst wieder zugehen.
also ich hoffe ich werde jetzt nicht gelüncht für meine anfänger fragen aber ich bin ja schon froh hier mal ne nachvollziehbar gestaltete seite zu css zu finden.
vielen lieben dank,
anna*
Peter ¶
13. Januar 2008, 16:47 Uhr
Wenn das so werden soll wie ich das verstehe, wird man da nicht ohne Javascript auskommen. Das wäre dann allerdings nicht besonders schwer. Man müsste nur die jeweiligen Oberpunkte der Navigation die Subnavigation zwischen
display:block;
unddisplay:none;
schalten lassen. Und vor jedem umschalten einer Subnavi auf Block müssten alle anderen Subnavis eingeklappt werden, damit immer nur eine offen ist.Einen Tutorial oder ein Beispiel habe ich nicht an der Hand, aber dieses Script von der Website meiner Schwester macht was ähnliches… vielleicht hilft dir das als Startpunkt.
Renate ¶
25. Januar 2008, 19:20 Uhr
Klasse Menü und Beschreibung!
Danke, danach habe ich gesucht.
Eine Anmerkung habe ich aber trotzdem:
Für die Stupiden unter uns (so am I) muss noch hinzugefügt werden, dass naturlich die csshover.htc kopiert und ins gleiche Verzeichnis wie die HTML-Seite gelegt werden muss.
Hab ganz schön geschwitzt, bis ich das kapiert habe...
Beste Grüße
Machst einen guten Job!
Daniel ¶
25. Januar 2008, 21:15 Uhr
Zitat Renate:
ahh xD
vielen dank, des habe ich auch net geblickt.
weil ich habe des in den selben Ordner, wie die CSS-dateien und dann ging es nicht mehr.
und jetzt kan ich die css-dateien aber ja wieder in nen Ordnern stecken und den Pfad zu htc anpassen.
Vielen Dank!
arathor ¶
13. Februar 2008, 12:33 Uhr
hey, bin nicht so bewandert in css, habs geschafft das ganze farblich auf meine bedürfnisse anzupassen, aber ich schaff nicht die ganze navigationsleiste zu zentrieren, hat mir jemand ein tipp?
cheers
Peter ¶
15. Februar 2008, 11:31 Uhr
Die Navigationsleiste (Also die Liste,
<ul>
oder was auch immer) muss in einem Element platziert werden, dastext-align:center;
hat und muss selbst links und rechtsauto
als Margin bekommen. Dann sollte alles zentriert sein.Sonja ¶
26. Februar 2008, 13:31 Uhr
Hallo zusammen,
erstmal Danke! für das Menü. Das ist echt nicht schlecht und in meinem Firefox funktioniert es astrein. Nun hab ichs mir mal in meinem 6er IE angeschaut und da zerreisst es das Menü.
Hab die Positionierung des Navicontainers auf absolut gesetzt. Nun hängt das Menü im IE ein wenig außerhalb dessen wo es rein soll uuund wenn ich über die Links mit einer Subnavi gehe verrutschen die anderen Hauptnavipunkte nach rechts.
Habe den Container vergrößert - nun stellen sie sich beim Hover wenigstens nicht mehr untereinander. Aber wie kann ich das springen verhindern? Und einstellen das es weder im FF noch im IE seine Position verlässt?
Peter ¶
26. Februar 2008, 13:38 Uhr
Könnte es sein, dass es sich dabei ganz einfach um die normalen Fehler des IE6 handelt? Bekanntermaßen stellt der ja allerlei recht eigenwillig dar. In dem Fall würde ich mal versuchen, dem Internet Explorer mit Conditional Comments seinen eigenen Stylesheet mit CSS zu verpassen.
sfelde ¶
4. März 2008, 14:26 Uhr
der Einsatz funktioniert auch ohne htc, man kann es noch vereinfachen.
http://typo3.intervation.de/snippets/menues/drop-down-menu.html
Gruss!
Peter ¶
4. März 2008, 14:45 Uhr
Sehe ich das richtig? Da wird einfach per Conditional Comments der
<a>
nicht geschlossen wenn der IE6 am Start ist? Und stattdessen wird denn wird da eine Tabelle reingepackt? Warum das denn!Das ja kriminell und unübersichtlich.
Marcel ¶
6. März 2008, 14:57 Uhr
Guten Tag,
ich hab folgendes Problem:
Wenn ich ein Bericht aufrufe und in der Kategorie Periode(Also alle Monate eines Jahres) einen Monat auswählen möchte, zeigt er mir Januar - November an und für den Dezember muss ich scrollen. Und das nervt schon ein wenig, nur wegen einem Monat runterscrollen zu müssen. Habe zuhause einen 17 Zoll TFT und hier auf der Arbeit einen 19 Zoll TFT. Auf der Arbeit funktioniert es auch einwandfrei ohne, dass ich scrollen muss.
Gibt es irgendein Befehl mit dem man die größe des Drop Down Menüs automatisch anpassen kann? Also egal welcher Browser und egal wie groß die Auflösung ist.
Hauptsache man muss nicht scrollen! :)
Mfg
Marcel
Peter ¶
6. März 2008, 15:02 Uhr
Ich glaube nicht dass man das irgendwie sauber lösen kann. Nicht ohne irgendwelche obskure Javascript-Hackerei.
Pascal Senn ¶
8. März 2008, 11:16 Uhr
Hallo
Super Navigation. Nun bin ich aber eher ein Neuling. Wollte jetzt mal Fragen wie ich es hinkriege das die Navigationspunkte nicht nebeneinander sondern untereinander sind. Habe da schon verschiedene Sachen probiert mit setzten etc. aber hat nicht geklappt.
Dann habe ich noch weitere Fragen. Hoffe das ist mit CSS möglich und jemand hat mir ein paar Tipss:
Das Menu sollte offen bleiben bis man auf das nächste klickt.
Das aktive Menu sollte fett gekennzeichnet sein, auch wenn es ein Unterpunkt ist (Einfach Aufgeklappt dann)
Ja das wäre es vorerstmal
MfG
Pascal
Peter ¶
8. März 2008, 11:24 Uhr
Zitat Pascal Senn:
Im Code der Beispielseite gibt es diese Zeile:
#navi li { width:128px; float:left; }
Wenn du hier das
float:left;
entfernst, müssten die Punkte untereinander stehen.Wenn ich das richtig verstehe, wird das ohne Javascript eher schwierig.
Wenn du mit
das gerade aufgeklappte meinst, müsste das hier klappen (nicht getestet):#navi li:hover a { font-weight:bold; }
Pascal Senn ¶
8. März 2008, 12:12 Uhr
Zitat Peter:
Im Code der Beispielseite gibt es diese Zeile:
#navi li { width:128px; float:left; }
Wenn du hier das
float:left;
entfernst, müssten die Punkte untereinander stehen.Das hat gut geklappt. Vielen Dank. Habe auch schon versucht was daran zu ändern, aber das einfach nur das entfernen reicht, habe ich nicht gemerkt...
Ok dann lasse ich das mal weg
Ich meine das so. Ich bin auf der Startseite. Möchte per Navigation zu Seite X. Wenn ich auf Seite X bin sollte in der Navigation Seite X "fett" sein, dass ich weiss das ich auf Seite X bin.
Peter ¶
8. März 2008, 13:03 Uhr
Zitat Pascal Senn:
Das wird mit CSS nicht gehen, da braucht man Javascript oder besser noch irgendwas Serverseitiges wie PHP.
Stefanie ¶
30. März 2008, 17:24 Uhr
Hallo Peter,
nach langem Suchen und Ausprobieren verschiedener Lösungen von CSS-Dropdown Menüs bin ich, wie alle anderen hier, begeistert von der Einfachheit deiner Lösung!
Doch wie kann ich es hinbekommen, dass zwischen den obersten Menüpunkten (Willkommen, Über Uns, etc.), deren Inhalt ja unterschiedlichen Raum einnimmt, ein gleicher Abstand erscheint?
Denn ich will bei meinen Schaltflächen die Schrift links laufen lassen, keine Hintergrundfarbe haben und beim Überfahren nur die Schriftfarbe ändern.
Peter ¶
30. März 2008, 18:36 Uhr
Wenn ich die Frage recht verstehe, musst du nur darauf achten, dass die ensprechenden Elemente (vermutlich
<a>
oder<li>
) Block-Elemente sind (display:block;
) – dann solltest du alle Abstände bequem festlegen können.Katharina ¶
2. April 2008, 15:51 Uhr
Hallo Peter,
ich finde deine Lösung auch ganz toll und leicht umzusetzen. Allerdings habe ich Probleme mit dem IE 6.0. Und zwar wenn das Drop-Down-Menü erscheint und man mit der Maus über die untersten Links fährt (auf Text-Höhe), schließt sich das Menü wieder. Leider benutzen noch zu viele User den alten IE, deshalb ist mir sehr wichtig, dass die Seite auch da so wunderbar funktioniert, wie in anderen Browsern.
Hier ist der Link zu der Seite: www.somadesign.de/groupimpact
Vielen Dank schon mal für deine Hilfe
Peter ¶
2. April 2008, 16:09 Uhr
Ohne zu testen spontan geraten: Hilft vielleicht etwas
z-index
für die Navi und/oder die Unterpunkte?A.Jendrysik ¶
15. April 2008, 15:51 Uhr
Schöner Beitrag für die Community!
Macht weiter so.
Gruß aus KS
SAMMELBÖSE ¶
20. April 2008, 09:06 Uhr
Ich habe die Navigation getesten, finde sie toll und würde sie selbst gerne verwenden.
Doch in Moment gibt es da ein Problem:
Problembrowser: MSIE (Hab es mit Version 6 getestet.)
Problemdatei: Da es nur im IE ist, wird es die 'csshover.htc' sein.
Problem: Untermenü wird nicht richtig angezeigt.
Genaue Problemschilderung:
Ich nehme jetzt das Menü 'Über uns' als Beispiel:
<li><a href="#">Über uns</a>
<ul>
<li><a href="#">Angebot</a></li>
<li><a href="#">Geschichte</a></li>
<li><a href="#">Jobs</a></li>
</ul>
</li>
Da wird Angebote problemlos angezeigt.
Geschichte wird nur mehr anzeigt, wenn man auf den Text fährt. Ansonsten schließt sich das Menü.
Und wenn man auf Jobs fährt (egal ob auf Text oder Background), wird das Menü geschlossen.
Da ich nur beschränkte JS-Kentnisse habe ('document.write("")', usw.), weis ich nicht, wie man das in Ordung bringen kann. Bitte um Hilfe.
lg sammelböse
Peter ¶
20. April 2008, 09:12 Uhr
Schon das probiert, was ich in Kommentar 41 geschrieben hatte? Also
z-index
für die Navi und/oder die Unterpunkte? Das hilft bei sowas oft …SAMMELBÖSE ¶
20. April 2008, 11:01 Uhr
Zitat Peter:
Nein, es geht nicht nur um das downgeloadetete, sondern ich habe auch die Beispielseite getestet und da war das auch so (Tut mir leid, habe ich vergessen zu posten). Also müsste man wenn dann das ganze auch in die Beispielseite einbauen.
lg sammelböse
Katharina ¶
20. April 2008, 14:37 Uhr
Mit z-index funktioniert bei mir nicht. Könntest du, Peter eine Lösung in die Beispieldatei einbauen. Vielleicht mache ich da was nicht richtig. Danke und Viele Grüße, Katharina
Martin ¶
19. Mai 2008, 08:49 Uhr
Hallo!
Leider hab auch ich den Fehler im IE6. Das Menü schließt sich immer wenn ich mit der Maus drüber fahre. Auch bei der Beispielseite. Da ich mich nicht so toll auskenne, find ich auch den Fehler nicht. Oder liegt es an einem Bug im IE?
Gruß
Martin
Jens ¶
21. Juni 2008, 18:17 Uhr
Hallo,
ich habe das auch ausprobiert, und habe mich gewundert, wie einfach das ist. Leider habe ich ein Problem mit der Darstellung im IE. Dort funktioniert das Menü nähmlich überhaupt nicht, d.h. es klappt einfach nicht auf. Ich habe schon alles mögliche ausprobiert, aber es funktioniert einfach nicht. Kann es sein, dass die Datei "csshover.htc" einen Fehler hat?
mfg
Jens
Peter ¶
21. Juni 2008, 18:51 Uhr
Dieser Artikel ist alt und ich komme leider kaum mehr hinter den ganzen Anfragen dazu her. Ich werde daher hier die Kommentare dicht machen – vielleicht update ich das Ding mal wegen des IE-Problems. Manchmal hilft es, dem Content
position:static;
zu geben, aber nicht immer.tools503 ¶
20. Januar 2012, 13:28 Uhr
Das Tutorial hat mir echt weitergeholfen habe nämlich bei google.de nichts brauchbares gefunden.
Danke ! :)
LG tools503