Blog

Ein fancy Hover-Menü mit CSS gestalten

Navigationen bestehen oft aus Dropdown-Menüs, die meist mit JavaScript eingeblendet werden. Doch das geht auch nur mit CSS. In diesem Beispiel zeigen wir ein einfaches Menü mit vier Hauptpunkten, dessen Untermenüs per Hover erscheinen – ganz ohne JavaScript.

Thomas Bieli

Thomas Bieli

Lead Frontend Entwickler

CSS Trick: Hover-Menü

Eine Navigation ist fast auf jeder Seite vorhanden.

Auf gewissen Seiten besteht diese aus nur einer Ebene, auf anderen aus zwei oder sogar mehr. Dies setzt sich sehr oft aus einer Navigationsleiste mit Dropdown-Menüs zusammen, die sich z.B. mithilfe der Maus einblenden lassen.

Um dies zu ermöglichen, wird oft JavaScript benötigt. Wir stellen euch hier aber eine reine CSS-Lösung vor, die ohne JavaScript auskommt.

Let’s get started

Hier ein einfaches Menü, welches aus vier Hauptmenüpunkten besteht. «Nav 2» hat allerdings noch ein Submenu. Dieses soll mithilfe eines Hover-Effekts, wenn wir also mit der Maus über den Hauptmenüpunkt fahren, geöffnet werden.

Nav Beispiel

Das Problem:
Durch den Abstand zwischen dem Haupt- und dem Submenü entsteht das Problem, dass das Submenü geschlossen wird, sobald man mit der Maus zu einem Punkt im Submenü fahren möchte.

Nav Problem

Dieses Problem könnte man mithilfe eines kleinen JavaScript-Snippets lösen. Mithilfe des onmouseover-Events wird das Submenü eingeblendet und mit dem onmouseout-Event wieder ausgeblendet. Dabei kann ein kurzes Time-out eingebaut werden, sodass genügend Zeit bleibt, wenn der Cursor vom Hauptmenüpunkt auf das Submenü fährt. Andernfalls wird derselbe Fehler auftreten wie mit der aktuellen CSS Lösung. Das Submenü wird sich zu schnell schliessen.

In diesem Fall ist es schöner, mithilfe eines Pseudo-Elements die Lücke zwischen Hauptmenü und Untermenü zu füllen. Das Pseudo-Element wird hier rot dargestellt.

Nav lösung

Weiteres Problem:
Nun werden jedoch die Hauptmenüpunkte links und rechts neben dem «Nav 2» von dem Pseudo-Element leicht überdeckt. Es ist also nicht so einfach, diese anzuklicken.

Nav Problem nicht klickbar

Dieses Problem können wir jedoch lösen, indem wir das rote Pseudo-Element anpassen. Wir können sogar versuchen ein Dreieck mit zwei Pseudo-Elementen ein Dreieck zu formen, um die optimale Fläche abzudecken.

Nav Dreieck lösung

Mit dem Dreieck werden die Elemente links und rechts nicht mehr überdeckt und sind nun wieder leicht klickbar.

Nav Lösung demo

Zuletzt wird die Farbe der beiden Pseudo-Elemente von rot nach transparent umgeschrieben. Somit haben wir jetzt ein Hover-Menü, welches ohne JavaScript funktioniert.

Code zum nachmachen

HTML

html
<div class="menu">
<ul class="menu__list">
<li class="menu__item">
<span>Punkt 1</span>
</li>
<li class="menu__item">
<span>Punkt 2</span>
<div class="menu__submenu-wrapper">
<ul class="menu__submenu">
<li class="menu__submenu-item">Subpunkt 1</li>
<li class="menu__submenu-item">Subpunkt 2</li>
<li class="menu__submenu-item">Subpunkt 3</li>
<li class="menu__submenu-item">Subpunkt 4</li>
</ul>
<ul class="menu__submenu">
<li class="menu__submenu-item">Subpunkt 5</li>
<li class="menu__submenu-item">Subpunkt 6</li>
<li class="menu__submenu-item">Subpunkt 7</li>
<li class="menu__submenu-item">Subpunkt 8</li>
</ul>
</div>
</li>
<li class="menu__item">
<span>Punkt 3</span>
</li>
<li class="menu__item">
<span>Punkt 4</span>
</li>
</ul>
</div>


CSS

css
.menu {
margin: 20px auto;
text-align: center;
}
.menu__list {
list-style: none;
display: inline-flex;
background-color: #ECECEC;
padding: 0;
border-radius: 3px;
}
.menu__item {
position: relative;
padding: 5px 15px;
cursor: pointer;
}
.menu__item:hover .menu__submenu-wrapper {
display: flex;
}
.menu__submenu-wrapper {
display: none;
position: absolute;
left: 50%;
transform: translateX(-50%);
background-color: #ECECEC;
margin-top: 10px;
z-index: 5;
}
.menu__submenu {
list-style: none;
padding: 0;
}
.menu__submenu:after, .menu__submenu:before {
display: block;
content: " ";
position: absolute;
top: -20px;
background-color: transparent;
width: 55%;
height: 50px;
}
.menu__submenu:after {
left: 5px;
transform: rotate(-25deg);
}
.menu__submenu:before {
right: 5px;
transform: rotate(25deg);
}
.menu__submenu-item {
padding: 3px 5px;
white-space: nowrap;
}


Fazit

Manchmal unterschätzen wir die Lösungen von CSS und die Art, wie sich CSS in den letzten Jahren entwickelt hat. Oftmals ist dieselbe, komplexe Javascript-Lösung auch mit CSS möglich. Das einzige Problem, auf das Webdeveloper immer stossen ist jedoch der Hover auf Mobile-Geräten. Da es auf diesen Geräten keine Hover- sondern nur Tap-Effekte geben kann, muss man sich genau überlegen wie man die Lösung für Submenüs umsetzt.

Weitere Stories

Website check potential

Website-Check: So erkennst du das Potenzial deiner Website

Ein Website-Check beantwortet drei Fragen: Was ist messbar gut, was kostet dich Geld oder Sichtbarkeit und wie viel Potenzial steckt noch in der bestehenden Website? Wir zeigen, was ein Check heute prüfen muss, wann Optimieren nichts mehr bringt und wo automatisierte Analysen an Grenzen stossen.

KI Navigation Blog Beitrag

KI-Navigation und visuelles Editieren: Wie unser KI-Assistent die User Experience und Content-Pflege revolutioniert

KI verändert die Art und Weise, wie wir mit digitalen Plattformen interagieren. Bei der raffiniert media AG nutzen wir künstliche Intelligenz gezielt dort, wo sie echten Mehrwert schafft: zur Vereinfachung von Suchwegen für Besucher und zur Automatisierung im Redaktionsalltag.

Story Lynn Grütter

Pixelgenaue Web-Umsetzung nach Mass: Wie wir das Designkonzept von another-studio.ch realisiert haben

Für das Designstudio another-studio.ch haben wir als verlässlicher Entwicklungspartner die kompletten Relaunch- und Ausbauphasen der Website von Lynn Grütter umgesetzt – kreative Entwürfe ohne optische Kompromisse in einem modernen Storyblok CMS.

Story Foma Galvanik

Wie wir für Foma Galvanik durch ein pragmatisches Upgrade die Zukunft sichern

Veraltete Systeme und teure Wartungszyklen haben die Foma Galvanik ausgebremst. Durch den Wechsel auf einen modernen Tech-Stack mit Storyblok und Next.js haben wir ein effizientes Soft-Redesign realisiert, das die Performance steigert und gleichzeitig das Budget schont.

Shop Migration Sinnbild

Shop-Migration zu Headless

Von WooCommerce oder einem selbstgebauten Shop zu einer Headless-Architektur mit Payload und Next.js – mit Redirect-Konzept, damit deine Google-Rankings die Migration überleben. Inklusive der offenen Grenzen: Beta-Status der Commerce-Erweiterung, Versand/Steuern/Abos und Schweizer Zahlungsarten.

Payload Sinnbild

Payload CMS Agentur Schweiz

Payload CMS aus der Schweiz: wofür wir es einsetzen, wann wir davon abraten und warum es auch für KMU ohne eigenes Entwicklungsteam funktioniert. Inklusive der Faktoren, die den Aufwand eines Payload-Projekts wirklich treiben.