
Benutzerfreundliche Dropdown-Navigationen in Contao gestalten
Sie haben viele Namen: sie heißen Suckerfish-, Superfish-, Dropdown-Navigation oder einfach Aufklappmenü. Aber wie man sie auch nennt, sie alle haben eines gemeinsam: sie kombinieren Haupt- und Unternavigation, bei der das Untermenü entweder bei mouseover oder per click/tap angezeigt wird.
Immer wieder lese ich im Contao-Forum, wie Nutzer zu dieser oder jener Contao-Extension greifen, um eine Dropdown-Navigation zu realisieren, die sie auch mit ein paar Zeilen CSS hinbekämen. Versteht mich nicht falsch, ich habe nichts gegen diese Erweiterungen. Nur oftmals führen sie, gerade in Zeiten von Responsive Webdesign, zu ganz neuen Problemen, die ohne sie gar nicht entstanden wären.
Im vorletzten Teil unseres CSS-Kurses für Contao wollen wir uns daher die Navigation vornehmen, die Contao-Nutzern die größten Probleme bereitet. Wir zeigen euch, wie ihr sie nur mit CSS und ohne Contao-Extensions oder Javascript realisieren könnt.
Unsere Empfehlungen für Dropdown-Navigationen
Verwendet den Kind-Selektor
Mit dem Kind-Selektor, zum Beispiel ul > li
könnt ihr die direkten Kinder eines übergeordneten Elements ansprechen. Und dann der in Contao vorhandenen Klassen wie .level_1
könnt ihr die Listenelemente der Ebenen individuell über beispielsweise ul.level_1 > li
gestalten.
Horizontale und vertikale Navigationen kombinieren
Wenn eure Hauptnavigation horizontal ausgerichtet ist, sollte eure Subnavigation vertikal ausgerichtet sein. Bei zwei horizontalen Navigationen hat der Nutzer oft das Problem, dass er über Hauptmenüpunkte „hovert“, wenn er einen der äußeren Untermenüpunkte erreichen will, so wie bei PIWIK:

Hover-Navigation über MAX-HEIGHT
Wenn ihr eine einfache Dropdown-Navigation, die sich bei :hover
aufklappt realisieren wollt, braucht ihr weder Javascript, noch eine extra Contao-Erweiterung. Es reicht, wenn ihr diese Anweisungen verwendet:
.nav--main .level_2 { position: absolute; left: auto; max-height: 0; z-index: 1001; } .nav--main .submenu:hover .level_2 { max-height: 100%; }
Über CSS3 und beispielsweise opacity
könnt ihr die Navigation dann langsam ein- oder ausblenden.
Tipps zur Verbesserung der Bedienbarkeit
Mein erstes Dropdown-Menü hat mich immer ein bisschen an meine Anfänge mit Windows 98 und speziell an das Startmenü erinnert. Über 3 oder mehr Ebenen musste man peinlichst genau darauf achten, dass man mit dem Cursor nicht den Menübereich verlässt. Sonst hat es sich direkt wieder zugeklappt und man musste von vorne beginnen.
Auf der Suche nach einer Lösung für das versehentliche Verlassen der Unternavigation, so gesehen ein Hover-Out, fand ich zwei interessante Ansätze:
1. Über PADDING versehentliches Hover-Out verhindern
Der Trick ist eigentlich ganz einfach. Dadurch, dass die Navigation meist als Block erkennbar ist, weiß der Nutzer ziemlich genau, in welchem Bereich er sich mit dem Cursor bewegen darf, damit die Navigation nicht zuklappt. Was aber, wenn der Bereich eigentlich ein bisschen größer ist?
Wenn wir es schaffen, die Gestaltung des Untermenüs auf die Listenelemente zu verlagern, können wir der ungeordneten Liste ein „unsichtbares“ padding
geben. Der Nutzer hat dann noch ein paar Pixel mehr, bevor er die HOVER-Zone verlässt und sich das Menü zuklappt. Wieviele Pixel das genau sind, hängt letztendlich auch von der Größe der Navigation ab. 10 Pixel rundherum sind aber ein guter Richtwert.
See the Pen dropdown-navigation mit visibility by Dennis Erdmann (@erdmannfreunde) on CodePen.
2. Über verzögertes Zuklappen Hover-Out verhindern
Weiter oben erwähnte ich ja, dass sich über CSS3-Transitions Navigationen animieren lassen. Aber transition
lässt sich nicht nur für ein paar nette Animationen nutzen, über transition-delay
können wir auch die Bedienbarkeit einer Navigation verbessern.
Mit folgenden Anweisungen geben wir dem Nutzer noch ein bisschen Zeit, mit dem Cursor in den Bereich zurückzukehren und das Ausblenden zu verhindern, sollte er die Navigation versehentlich verlassen:
.nav--main .level_2 {
position: absolute;
left: auto;
z-index: 1001;
opacity: 0;
max-height: 0;
overflow: hidden;
transition: opacity 0.2s 1s, max-height 0s 1.2s;
}
.nav--main .submenu:hover .level_2 {
opacity: 1;
max-height: 100%;
transition-delay: 0s;
}
See the Pen dropdown-navigation mit max-height und transition-delay by Dennis Erdmann (@erdmannfreunde) on CodePen.
Schon ganz gut. Nun störte mich lediglich, dass das verzögerte Ausblenden auch beim Wechsel zwischen Hauptmenüpunkten zu sehen war. Aber mit einem kleinen Trick, kann man die Transition abbrechen. Es muss nur mindestens 1 Pixel Abstand zwischen den Hauptmenüpunkten sein und ihr könnt die Animation hiermit abbrechen:
.nav--main:hover .level_2 { transition: none; }
Einziger Haken an dieser Navigation: Sie funktioniert nur in modernen Browsern (IE ab Version 10), die auch CSS3-Transitions unterstützen.
See the Pen dropdown-navigation mit max-height und transition-delay by Dennis Erdmann (@erdmannfreunde) on CodePen.
Unser Fazit:
In der heutigen Zeit solltet ihr euch gut überlegen, wann die Verwendung einer Dropdown-Navigation sinnvoll ist. Inhalte, die ihr früher auf 3-4 Unterseiten verteilt hättet, könnt ihr heute auch bedenkenlos auf einer Seite platzieren, denn der Nutzer hat sich daran gewöhnt mehr zu scrollen.
Wenn ihr euch doch dazu entschließt, eine Dropdown-Navigation zu verwenden, achtet dennoch darauf die Navigation so einfach wie möglich zu halten. Das heißt im besten Fall, nur eine zweite Ebene zu nutzen. Mit zusätzlichem Padding oder einem verzögerten Zuklappen der Navigation könnt ihr dann noch die Bedienung einer Dropdown-Navigation deutlich verbessern.
Kommentare
Kommentar von Philipp |
Wie immer lesenswert. Danke für den Tipp mit dem max-height für das Ein- und Ausblenden von Untermenüs. Kannte ich noch nicht.
Witzig: Freese Holz aus Bordesholm, habe ich gleich erkannt, da im Nachbardorf. Erst dann auch gelesen, dass es so ist.
Antwort von Dennis Erdmann
Moin Philipp,
ja Freese Holz war Kunde der ersten Stunde. Der Relaunch hat die Besucherzahlen vervielfacht. Mittlerweile werden sie aber von einer Agentur aus HH betreut. Freut mich, wenn du etwas aus dem Artikel mitnehmen konntest :-)
Kommentar von Rocco |
Eine sehr tolle Variante, vor allem weil sie ohne JS auskommt. Leider funktioniert es bei mir nicht wenn der Layout-Builder aktiviert ist. Nur über den Umweg, dem "max-height" in .nav--main .submenu:hover .level_2 eine Pixel-Angabe zu geben. Aber dies ist sicher nicht der Sinn dahinter ... Naja, evtl. bekomme ich es durch rumfrickeln doch noch auf die Reihe. Ansonsten super Seite mit tollen Tipps zu Contao!
LG
Antwort von Dennis Erdmann
Das ist interessant. Habe es mal mit den CSS-Anweisungen aus dem Layout-Builder ausprobiert und da geht es noch. Du könntest mal probieren, ob vielleicht auch die Stelle, an der du die Navigation verwendest (Kopfzeile vs. Hauptspalte) eine Rolle spielt.
Ansonsten gerne mal einen Link per Mail schicken, dann kann ich mal einen Blick drauf werfen.
Kommentar von Torsten |
Hallo Dennis,
vielen Dank für diesen Artikel. Mit diesen Infos konnte ich die Navigation der Seite, die du mir redesigned hast, um ein Dropdown erweitern.
Gruß!
Torsten
Kommentar von Hinreiner |
Erst mal, super Artikel.
Ich habe ein kleines Problem.
Wenn ich das Dropdownmenu mit "position:absolute;" einstelle, ist es der richtigen Position, aber es wird nur ein Menüpunkt angezeigt. Start & Stop in Conato = 0. Bei "position:relative" erscheinen zwar alle Menüpunkte, aber die Position passt nicht mehr.
Würde mich über eine Idee freuen.
Danke und weiter so.
Antwort von Dennis Erdmann
Moin Hinreiner,
schau mal ob deine Navigation vom übergeordneten Container abgeschnitten wird. Wenn deine Navigation beispielsweise im Header ist, sollte
#header,
#header .inside
und die Navigation keinoverflow: hidden
haben.Ansonsten kann ich mir das auch anschauen, wenn du eine online eine Demo hast. Sende mir dafür einfach eine Nachricht per Mail.
Kommentar von Chris |
Hallo, ich stolpere gerade über die ID NAV, in Contao seht immer ID .level_1 und class=level_1, wie ändert man gerade dort die class auf nav--nav ?
Viele Grüße
Chris
Antwort von Dennis Erdmann
Moin Chris,
du kannst dem Frontend-Modul Navigation eine eigene ID und Klasse geben. Dafür gibt es in Contao 2 eigene Felder in den Experten-Einstellungen.
Viele Grüße,
Dennis
Kommentar von Andreas |
"der Kind-Selektor funktioniert nur bei Elementkombinationen" - Dies kann so nicht stimmen. '.level_1 > li' spricht die gleichen Elemente an wie 'ul.level_1 > li'. Zweiterer ist nur ein wenig stärker.
Antwort von Dennis Erdmann
Moin Andreas,
danke für den Hinweis. Ich kann das heute auch nicht mehr nachvollziehen, aber ich meine es gab da mal einen Schwäche in einer älteren IE-Version. Ich habe den Hinweis entfernt.
Kommentar von Wanst |
Hallo Dennis, können wir mal etwas näher auf die Navigation per Tastatur eingehen? Du hast das im ersten Absatz unter 2. kurz angerissen, aber das nicht weiter ausgeführt. Relevanz hat das für mich wegen der Barrierefreiheit, die ja immer wichtiger wird.
In dem Beispiel hier und auch in deinen Themes scheint das genauso gut oder schlecht zu funktionieren wie bei mir auch: Wenn ich mich mit der Tab-Taste durchklicke, schaffe ich es zwar gerade noch mit '.level_1 a:focus + .level_2', dass sich das Menü öffnet, aber sobald ich weiter "tabbe", schließt es sich wieder, weil 'a' den Fokus wieder verliert (aber nur 'a' bekommt den Fokus, ich kann die Öffnung der Untermenüs nicht den 'li's überlassen, dann passiert gar nix).
Ich schiebe das auf die Aufteilung der HTML-Navigations-Elemente in Contao, da
'ul.level_1 > li > ul.level_2'
als sibling neben
'ul.level_1 > li > a'
liegt und nicht darin (also etwa so:
'ul.level_1 > li > a > ul.level_2'
).
Bevor ich jetzt aber das Navigationstemplate beackere, fällt dir noch eine CSS-Lösung dafür ein?
Antwort von Dennis Erdmann
Sorry für die späte Antwort. Ich kann den Fehler nachvollziehen, finde aber leider keine Lösung.
Kommentar von Marion |
Hallo Dennis,
vielen Dank für den hilfreichen Artikel, gerade auch die Sache mit den Kind-Selektoren.
Mittlerweile bin ich der Ansicht, dass ein Klick-Menü in Sachen Barrierefreiheit doch besser sein könnte, weil viele motorisch eingeschränkte Menschen eine Hover-Navigation nicht so gut bedienen können, auch Ältere z. B..
Hast Du einen Tip, wie man eine bestehende Hover- in eine Klick-Navigation ändern kann? Gibt es da ein Script/eine Erweiterung in Contao?
Grüße
Marion
Antwort von Dennis Erdmann
Moin Marion,
ich kenne keine Erweiterung, die „nur“ das macht. Aber es wäre mit ein paar Zeilen Javascript zu lösen. Ich habe diese Lösung (in einer noch etwas aufwändigeren Version) bei diesem Projekt umgesetzt:
Gemeindediakonie Lübeck
Wenn du an einer Individuallösung interessiert bist, dann melde dich gerne: Kontakt
Kommentar von Marion |
Hallo Dennis,
eine sehr schöne und klare Seite! Ebenso die Navi. Danke für Dein Angebot, ich suche erstmal im Forum nach der Ergänzung.