Dr. Web Digital Experts-Logo
  • CSS
  • SEO
  • Tools
  • Webseiten erstellen
  • Webdesign
  • WordPress
  • × 🍔 vertilgen
  • ☰ Menu
Hier das Dr. Web Icon-Set herunterladen.

Responsive Navigation: CSS-only Dropdown-Menüs ohne JavaScript

Wohin mit der Navigation? Diese Frage muss bei eigentlich jedem Webprojekt beantwortet werden. Gerade bei umfangreichen Websites ist es nicht immer einfach, die richtige Antwort darauf zu finden. Besteht eine Webpräsenz aus vielen Seiten und Unterseiten, bietet sich häufig ein Dropdown-Menü an.
Lade Dir jetzt das Icon-Set kostenlos herunter

Übersicht

Dank CSS lassen sich Dropdown-Menüs ganz ohne Einsatz von JavaScript anlegen und mit Hilfe von Media Queries responsiv gestalten. Das macht die Menüs auch auf mobilen Geräten mit entsprechenden Anpassungen einsatzfähig.

Die „Teufelsalbatross“-Navigation

Nils Binder hat diese Form der klassischen Navigation erschaffen, in welcher ein Logo und eine Hauptnavigation verwendet werden, ohne dass es etwaige Media Queries braucht. Das Endresultat sieht dabei so aus:

Für die jeweils passenden Abstände zwischen Logo und Hauptnavigation sorgt dabei der „Teufelsalbatross“, den Nils per :first-child Pseudoelement einbindet. Hier eine Versinnbildlichung der Funktionsweise.

Die Navigation zentriert auf Mobil und für Desktop da wo sie hin soll.
Logo und Hauptnavigation sind auf Mobile zentriert, da die Hauptnavigation auf die nächste Zeile umgebrochen wird. Auf Desktop hingegen, im Beispiel (Link) ab 38rem aufwärts, verbleiben Logo und Hauptnavigation in derselben Zeile. Die Navigation ist eine Weiterentwicklung von Heydon Pickerings Flexbox Albatross.

Die neue „Fluide Navigation“ auf drweb.de

Die Besonderheit bei der Fluid Navigation ist, dass die Menüpunkte, die auf schmalen Bildschirmen nicht mehr drauf passen, hinter einem Dropdown verschwinden, während die Haupt-Menüpunkte immer noch dezidiert vorhanden sind.

Wer unsere neue Dr. Web-Navigation mag, dem haben wir das HTML und CSS dazu als Demo im CodePen oben bereitgestellt. Das Template kommt im Übrigen von Tristan White. Das HTML zu unserer Navigation auf Dr. Web sieht so aus:

<nav id="menu">
  <ul id="menu-closed">
    <li><a href="/newsletter/">Newsletter</a></li>
    <li><a href="/seo/">SEO</a></li>
    <li><a href="/tools/">Tools</a></li>
    <li><a href="/websites/">Webseiten erstellen</a></li>
    <li><a href="/webdesign/">Webdesign</a></li>
    <li><a href="/websites/wordpress/">WordPress</a></li>
    <li><a href="#menu-closed"></a></li>
    <li><a href="#menu">&#9776; Menu</a></li>
  </ul>
</nav>

Und das dazugehörige CSS sieht zur Zeit wie folgt aus:

 nav#menu {
   font-size: 14px;
   background-color: #fff;
   box-shadow: 0 5px 20px #efefef;
   margin: 0;
   padding: 0 1em;
   position: relative;
   height: 60px;
   overflow: hidden;
}
 nav#menu ul {
   margin: 0;
   padding: 0;
   list-style-type: none;
   max-height: 120px;
   position: relative;
}
 nav#menu ul li {
   display: inline-block;
}
 nav#menu ul li:last-child {
   position: absolute;
   right: 0;
   bottom: 45px;
   background-image: linear-gradient(to right, rgba(236, 240, 241, 0) 0, #fff 2em);
   padding-left: 3em;
}
 nav#menu ul li:nth-last-child(2) {
   display: none;
}
 nav#menu ul li a {
   display: inline-block;
   padding: 0 1em;
   color: #333;
   font-weight: 700;
   letter-spacing: 0.1em;
   text-decoration: none;
   text-transform: uppercase;
   white-space: nowrap;
   line-height: 60px;
}
 nav#menu ul li a:hover {
   background-color: rgba(51, 51, 51, 0.08);
}
 nav#menu:target {
   height: auto;
   padding: 0;
}
 nav#menu:target ul {
   max-height: none;
}
 nav#menu:target ul li {
   display: block;
}
 nav#menu:target ul li:not(:first-child) {
   margin-top: 2px;
}
 nav#menu:target ul li:last-child {
   display: none;
}
 nav#menu:target ul li:nth-last-child(2) {
   display: inline-block;
   position: absolute;
   top: 0;
   right: 0;
   margin: 0;
   border-left: 2px solid #dde4e6;
}
 nav#menu:target ul li a {
   display: block;
   padding: 0 2em;
   background-color: rgba(51, 51, 51, 0.05);
}
 nav#menu:target ul li a:hover {
   background-color: rgba(51, 51, 51, 0.08);
}

Das Template dürfen Sie gerne auch bei Ihren eigenen Kunden einsetzen, es ist kostenlos und ohne Kennzeichnung verwendbar.


Responsive Mega Menu – Navigation

Eine responsive Navigation mit eingebautem Suchfeld. Erstellt von Samir Alley.

Responsive Flexbox Dropdown Navigation

Eine Listen-basierte Navigation, gebaut mit Flexbox von Jeff Weese. Die Navigation enthält zwei Ebenen an Untermenüs.

Responsive Dropdown Navigation Bar

Eine Standard-Navigation mit Logo und Navigation auf einer Ebene. Kreiert von Tania Rascia.

Pure CSS DropDown Menu

Eine Navigation, die auf Mobile auf zwei Zeilen umbricht, statt hinter einem Dropdown zu verschwinden. Erschaffen von Andor Nagy.

Context Menü mit Feather icons

Håvard Brynjulfsen übersetzt eine Dribbble-Idee von Jakub Antalik mit ein wenig Hilfe der Open-Source-Symbolbibliothek Feather in HTML und CSS.

Animierte Responsive Navbar

Bildschirmfoto - Linie
Screenshot: Dr. Web

Diese Web-App-Navigation ist voll einsatzfähig für das nächste Projekt. Auch das Erklär-Video lohnt sich anzusehen. Hier der Link zu Github und hier der direkte Download-Link.

Links zu den Navigations-Beispielen:

  • Responsive Mega Menu
  • Flexbox Dropdown Navigation
  • Responsive Dropdown Navigation
  • Pure CSS Dropdown Menu
  • Fluid Navigation

Eine responsive Navigation selber bauen

Verschachtelte Liste als Basis

Die meisten Menüs werden als unsortierte Liste ausgezeichnet. Dank der Möglichkeit, Listen zu verschachteln, können auch Unterseiten problemlos und übersichtlich in die Navigation eingebunden werden.

<nav>
<ul>
  <li><a href="/">Start</a></li>
  <li><a href="#">Profil</a>
    <ul>
      <li><a href="/profil/team/">Team</a></li>
      <li>…</li>
    </ul>
  </li>
  <li>…</li>
</ul>
</nav>

Im Beispiel erstellen wir die Navigation mit „<ul>“- und „<li>“-Elementen – einschließlich verschachtelter Menüpunkte. Wer HTML5 einsetzt, platziert die Liste in der Regel innerhalb eines „<nav>“-Elementes, um sie auch semantisch als Navigation auszuzeichnen.

CSS für erste Menüebene

Im nächsten Schritt gestalten wir per CSS das Aussehen des Menüs. Die Menüpunkte der ersten Ebene sollen dabei nebeneinander angeordnet sein. Hierfür muss zunächst das Standardaussehen der Liste entfernt werden – also die Aufzählungspunkte und der dazugehörige Abstand.

nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

Als nächstes ordnen wir die einzelnen Menüpunkte nebeneinander an.

nav > ul > li {
  float: left;
}

Die Verwendung des „>“-Selektors verhindert, dass Eigenschaften auf „<li>“-Elemente vererbt werden, die tiefer verschachtelt sind. Für das Menü sollen schließlich nur die Menüpunkte der ersten Ebene nebeneinander dargestellt werden. Alle verschachtelten Menüpunkte sollen untereinander angeordnet sein. Da zunächst nur die erste Ebene der Navigation sichtbar sein soll, müssen alle anderen Ebenen ausgeblendet werden.

nav > ul > li > ul {
  display: none;
}

Das Aussehen der einzelnen Menüpunkte sollte man stets über das „<a>“-Element definieren. Dazu ist es sinnvoll, den Link als Blockelement auszuzeichnen, um Innenabstände (mit der „padding“-Eigenschaft) definieren zu können. Bei Inline-Elementen funktioniert das nicht. Die Links der zweiten und dritten Menüebene lassen sich natürlich anders gestalten als die der ersten.

nav > ul a {
  display: block;
  white-space: nowrap;
  padding: 10px;
  background: rgb(195, 35, 45);
}
nav ul > li > ul > li a {
  background: rgb(0, 0, 0);
  color: rgb(255, 255, 255);
}

Da wir hier im Beispiel keine festen Breiten für die Menüpunkte definiert haben, nehmen die einzelnen Elemente immer die Breite des Inhaltes an. Text bricht dabei jedoch immer um. Daher sollte man per „white-space“-Eigenschaft einen automatischen Zeilenumbruch verhindern.

css-navigation1
Einfaches Dropdown-Menü

Schriften und Farben anzupassen, gehört natürlich auch zur Menügestaltung dazu. Außerdem kann man gegebenenfalls Schatteneffekte und abgerundete Ecken einsetzen. Will man dem „<ul>“-Element selbst CSS-Eigenschaften zum Aussehen zuordnen, sollte man zusätzliche Eigenschaften vergeben.

nav > ul {
  float: left;
  overflow: hidden;
  padding: 0 10px 0 10px;
  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.25);
  background: rgb(195, 35, 45);
}
css-navigation2
Dropdown-Menü mit abgerundeten Ecken und Schlagschatten

Die „float“-Eigenschaft sorgt dafür, dass die Breite des „<ul>“-Elementes nicht 100 Prozent ist, sondern sich der Breite der nebeneinander angeordneten Kindelemente anpasst. Per „overflow“ sorgt man dafür, dass abgerundete Ecken nicht durch die Kindelemente, die keine angerundeten Ecken haben, überdeckt werden.

Zweite und dritte Menüebene gestalten

Um den Zugriff auf die zweite Menüebene zu ermöglichen, wird die Pseudoklasse „:hover“ verwendet, die auslöst, wenn man mit der Maus über ein Listenelement der ersten Ebene fährt.

nav > ul > li:hover > ul {
  display: block;
  position: absolute;
}
nav > ul > li > ul > li {
  position: relative;
}

Während mit der „display“-Eigenschaft die zweite Ebene eines Menüpunkte angezeigt wird, sorgt „position“ dafür, dass das verschachtelte „<ul>“-Element nicht die Breite des übergeordneteten „<li>“-Elementes beeinflusst. Die „<li>“-Elemente der zweiten Ebene werden wiederum relativ dargestellt.

Für die dritte Menüebene sorgt „display“ wieder dafür, dass die Liste erst angezeigt wird, wenn man im übergeordneten „<li>“-Element die „:hover“-Pseudoklasse auslöst. Außerdem haben wir per CSS die dritte Ebene so ausgezeichnet, dass sie neben der Liste der zweiten Ebene dargestellt ist.

nav > ul > li > ul > li > ul {
  display: none;
}
nav > ul > li > ul > li:hover > ul {
  display: block;
}
nav > ul > li > ul > li:hover > ul {
  display: block;
  position: absolute;
  left: 100%;
  top: 0;
}
css-navigation3
Aufgeklapptes Dropdown-Menü

Die „left“-Eigenschaft sorgt dafür, dass die dritte Liste neben der zweiten Liste angeordnet erscheint – und zwar auf der Höhe des übergeordneten „<li>“-Elementes (per „top“-Eigenschaft).

Alternatives Layout für mobile Geräte

Auf Smartphones gibt es selten genug Platz, um Menüelemente nebeneinander anzuordnen. Daher sollte man alle Elemente untereinander darstellen. Allerdings muss man auch dort nicht auf eine Dropdown-Navigation verzichten. Mit einigen wenigen Anpassungen lässt sich das Menü so darstellen, dass alle Menüpunkte untereinander platziert sind. Dazu müssen wir lediglich alle absoluten Positionierungen sowie die Floats entfernen.

nav > ul, #nav > ul > li {
  float: none;
}
nav > ul > li > ul, nav > ul > li:hover > ul {
  position: relative;
}
nav > ul > li > ul > li:hover > ul {
  position: relative;
  left: 0;
}
nav > ul > li > ul > li > ul > li > a {
  font-style: italic;
}

Außerdem muss die „left“-Eigenschaft auf Null gesetzt werden. Um die Menüpunkte der dritten Ebene besser von denen der zweiten unterscheiden zu können, stellen wir diese im Beispiel kursiv dar.

css-navigation4
Menü für Smartphones mit untereinander angeordneteten Menüpunkten

Um noch mehr Platz zu schaffen, ist es nicht unüblich, auch die Menüpunkte der ersten Ebene erst per „:hover“-Pseudoklasse erscheinen zu lassen. Dazu sind einige weitere Veränderungen notwendig. Zunächst einmal blenden wir alle Menüpunkte der ersten Ebene aus und erst per „:hover“ auf das oberste „<ul>“-Element ein. Da dieses „<ul>“-Element keine sichtbaren „<li>“-Elemente hat, wird per Pseudoelement „::before“ ein zusätzliches „<li>“-Element erzeugt, welches immer sichtbar ist. Diesem Pseudoelement weisen wir einen Text oder ein Icon zu.

nav > ul > li {
  display: none;
}
nav > ul:hover li {
  display: block;
}
nav > ul::before {
  display: block;
  content: "Menü";
  padding: 10px;
}

Natürlich gibt es auf Smartphones, die per Gesten gesteuert werden, keinen Hovereffekt, wie er mit der Maus auf Desktopgeräten ausgelöst wird. Stattdessen wird der Hovereffekt per Fingertap ausgelöst. Problematisch ist hierbei, dass bei einem Tap auf einen Link dieser zeitgleich mit dem Hovereffekt aufgerufen wird. Daher sollte man Menüpunkte, die ein Untermenü aufrufen, selbst nie mit einem Link versehen. Sonst sind untergeordnete Menüpunkte per Tap nicht erreichbar.

css-navigation5
Platzsparendes Dropdown-Menü (zu- und aufgeklappt)

Entweder setzt man einen seiteninternen Link (also „#“) oder verzichtet ganz auf die Auszeichnung eines „<a>“-Elementes und ersetzt dieses beispielsweise durch ein „<span>“-Element.

css-navigation6
Darstellung der Untermenüs im mobilen Dropdown-Menü

Die untergeordneten Menüs werden jeweils unterhalb des übergeordneten Menüpunktes dargestellt.

Menüpunkte mit Unterseiten kennzeichnen

Damit man direkt erkennt, welche Menüpunkte ein verschachteltes Untermenü haben, könnten wir diese mit etwas CSS kennzeichnen. Dazu fügen wir jedem „<a>“-Element das Pseudoelement „::after“ hinzu, um ein Plus-Zeichen zu ergänzen.

nav li > a:after {
  content: " +";
}

Anschließend entfernen wir das Plus-Zeichen per Pseudoklasse „:only-child“ von solchen „<a>“-Elementen wieder, welche das einzige Kindelement sind, also kein „<ul>“-Element als Kind besitzen.

nav li > a:only-child:after {
  content: "";
}
css-navigation7
Menü mit Plus-Zeichen bei Menüpunkten mit Untermenü

Fazit

Es gibt viele Wege, eine responsive Navigation auf eine Webseite zu bauen, und ich hoffe, du konnest deine Vorstellungen in einem der obigen Beispiele wiederfinden.

Hast Du noch mehr gute Beispiele, die Dir gefallen? Poste sie in den Kommentaren!

Dieser Beitrag wurde am 7. April 2015 veröffentlicht und am 27. Januar 2020 von Grund auf überarbeitet.

Denis Potschien

Denis Potschien

Denis Potschien ist seit 2005 freiberuflich als Kommunikationsdesigner tätig, seit Anfang 2010 im Kreativkonsulat in Iserlohn, einem Büro für Gestaltung und Kommunikation. Dort betreut er kleine und mittelständische Unternehmen ebenso wie kommunale Körperschaften und Organisationen aus Südwestfalen und dem Ruhrgebiet. Als Webdesigner und -entwickler gehören HTML5 und CSS3 zu seinen Kernthemen, weshalb er dazu 2013 ein Buch geschrieben hat. „Pure HTML5 und CSS3“ richtet sich an alle, die Vorkenntnisse haben, sich aber bisher mit HTML5 und CSS3 nicht oder nur am Rande beschäftigt haben.

7 Antworten

  1. Avatar Manfred Egger sagt:
    8. April 2015 um 8:55 Uhr

    Netter Beitrag, allerdings wäre – grade in Hinblick auf responsive Best practices – ein “Mobile first”-Ansatz angebracht.
    Man könnte ein paar Zeilen Code sparen, wenn statt dem “display:none” für das ul der zweiten Menüebene und dem ganzen Code aus dem Bereich “Zweite und dritte Menüebene gestalten” einfach nur folgendes verwendet wird:

    nav > ul ul {
      display: none;
      position: absolute;
    }
    nav > ul li:hover > ul {
      display: block;
    }
    nav > ul ul ul {
      left: 100%;
      top: 0;
    }

    Das sollte genauso funktionieren. Wie es sich dann mit der Performance verhält, hab’ ich nicht getestet, allerdings sollte das nicht sonderlich ins Gewicht fallen 😉

    Antworten
  2. Avatar Dieter Petereit sagt:
    10. November 2015 um 10:07 Uhr

    Danke für die nützliche Ergänzung, Markus.

    Antworten
  3. Avatar Mike sagt:
    14. Dezember 2015 um 15:17 Uhr

    Super Menu !!! Aber sobald sich das Menü in einem Container befindet der nicht der komplette Höhe des Menüs (also im ausgeklappten Zustand) entspricht, dann klappen sich die Untermenu Punkte wieder ein beim Drüberfahren. Ebenso wenn unter dem Menü sich direkt ein JS Anwendung befindet.
    VG Mike

    Antworten
  4. Avatar Mike sagt:
    14. Dezember 2015 um 17:15 Uhr

    Des weiteren ist es schwierig das komplette Menü rechts zu positionieren.
    VG Mike

    Antworten
  5. Avatar helene sagt:
    28. Oktober 2018 um 1:57 Uhr

    Bei mir funktioniert das nicht, fehlt was? Es gibt mir kein Button nur die ganze Codierung ist sichtbar.

    Antworten
  6. Avatar Clipart - Designer sagt:
    12. November 2019 um 15:36 Uhr

    Eine “hübsche” Version von Menü mit einem modernen Look & Feel wäre noch chicker! ))

    Aber trozdem Danke für den Artikel!

    Antworten
  7. Avatar Siegbert sagt:
    23. Januar 2021 um 14:42 Uhr

    Seit den späten 90ern frage ich mich nun schon, warum überall immer diese doppelte Verschachtelung in Ungeordnete Listen und deren Listenelemente und konnte mich bisher auch nicht dazu durchringen. Gut, vor Erscheinen des “nav” Tags hätte man es ja noch mit Zugänglichkeit für Screen-Reader und mit SEO Relevanz begründen können, aber jetzt mit HTML5? Mit dem nav Tag als umfassenden Container der “a” Tags (Links), sollte der Zugänglichkeit und der Semantic doch eigentlich Genüge getan sein. Und auch der dümmste Suchmaschinenrobot wird wohl längst den Sinn des nav Tags, nämlich einen Bereich semantisch als Linkliste auszuweisen, verinnerlicht haben und nicht dran vorbeischliddern. Der container und darin alle Link Tags des Menüs in simpler Form von *** und gut ist, odda?? Waren die Listen und deren Listenelemente nicht auch ursprünglich nur als Aufzählungszeichen und zur visuellen Ordnung im eigentlichen Textbereich angedacht?

    Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Passende Beiträge

Das große Dr. Web Icon-Set mit über 970 individuell anpassbaren Icons im SVG Format.
Illustrator

Das große Dr. Web Icon-Set: 970 Icons, im SVG-Format, kostenlos

Für Photoshop, Illustrator, Sketch & Co. Vollständig anpassbar. Größe, Breite, Form und Farbe können komplett an die Maßgaben deines Projekts angepasst werden. Alle Symbole sind Open Source unter MIT-Lizenz, können also in privaten und kommerziellen Projekten verwenden werden, ohne dass es einer Attribution bedarf.

Weiterlesen »
Der Schreibtisch eines Webdesigners, mit Laptop, iMac, einem Design-Buch und einem Smartphone-Papier-Mockup.
Webdesign

Mit den Mitteln der Moderne: Warum Sie Webdesigner und SEO-Experten engagieren sollten

Sie möchten mit Ihrem Unternehmen, Ihren Dienstleistungen oder Ihrem Hobby mehr Reichweite erfahren? Die Bindung zu den Kunden soll nicht nur aufgebaut oder ausgebaut, sondern dauerhaft gefestigt werden? Dann bietet sich das Erstellen einer eigenen Webseite an.

Weiterlesen »
Ein Mann hält eine Glühbirne in der Hand.
Farben

Das richtige Licht fürs Webdesign 

Fast jeder (Hobby-)Webdesigner kennt diese Situation: Man hat sich in die Gestaltung oder Konzeption eines Projekts vertieft oder möchte ein bestimmtes Webprojekt oder Teilvorhaben an einem Tag noch fertigstellen. Doch plötzlich ist es später Nachmittag oder Abend – Zeit, das Licht einzuschalten!

Weiterlesen »
Lade Dir jetzt das Icon-Set kostenlos herunter

  • Agentur
  • CSS
  • Datenschutzhinweise
  • Impressum
  • SEO
  • Webdesign
  • Websites
  • WordPress
  • Nach oben ↑
Menü
  • Agentur
  • CSS
  • Datenschutzhinweise
  • Impressum
  • SEO
  • Webdesign
  • Websites
  • WordPress
  • Nach oben ↑
Wir verwenden Cookies, um Besucherzahlen zu messen. Mehr dazu in unserer Datenschutzerklärung. Einverstanden? EinstellungenIch stimme zu
Cookie-Einstellungen

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Notwendige
immer aktiv

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Nicht notwendige

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.