Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Web Design
  2. Navigation Design
Webdesign

Anleitung zur Erstellung einer Unterlinie mit CSS und JavaScript, die durch hovern zwischen Menüpunkte wechselt

by
Difficulty:IntermediateLength:ShortLanguages:

German (Deutsch) translation by Hannes Dermutz (you can also view the original English article)

Im heutigen Tutorial verwenden wir etwas CSS und JavaScript um daraus einen stylischen Hover-Effekt im Menü zu erstellen. Es entsteht kein kompliziertes Endresultat und bietet zusätzlich eine sehr gute Möglichkeit unsere Front-End Fähigkeiten zu verbessern.

Ohne weiterer Einleitung, sehen wir uns an was wir bauen werden:

Das HTML

Wir starten mit sehr einfachen markup; einem nav Element welches ein Menü und ein leeres span Element beinhaltet.

Das CSS

Mit dem betriebsbereiten Markup, spezifizieren wir als nächstes einfache Styles für die zugehörigen Elemente.

Beachte bitte, dass das span Element (.target) absolut positioniert ist. Wie wir in Kürze sehen werden, werden wir JavaScript verwenden um die exakte position festzulegen. Zusätzlich soll es hinter den Menü Links aufscheinen, dazu geben wir dem Element einen negativen Z-Index.

Das JavaScript

In diesem Punkt konzentrieren wir uns auf das benötigte JavaScript. Zum Anfang peilen wir die gewünschten Elemente an. Wir definieren zusätzlich noch ein Array von verschiedenen Farben, das wir später verwenden werden.

Events

Als nächstes hören wir auf einen click und mouseenter Events der Menü Links.

Wenn das click Event eintrifft, verhindern wir das neu Laden der Seite. Natürlich funktioniert dies in unserem Fall weil alle Links ein leeres href Attribut besitzen. Jedoch in einem realen Projekt würden die Menü Links verschiedene Seiten öffnen.

Am wichtigsten ist, dass sobald das mouseenter Event eintritt, die mouseenterFunc Callback Funktion ausgeführt wird.

mouseenterFunc

Der Hauptteil der mouseenterFunc Funktion sieht folgendermaßen aus:

Innerhalb der Funktion machen wir folgendes:

  1. Hinzufügen der active Klasse zum direkten Elternteil (li) des Ziellinks.
  2. Senken der opacity von allen Menü Links, abgesehen von dem "aktiven" Link.
  3. Um die Größe des verbundenen Links und deren Position  des jeweiligen Ansichtsfensters zu erhalten, verwenden wir die getBoundingClientRect Funktion.
  4. Erhalten einer zufälligen Farbe vom vorhin erwähnten Array und weitergeben als Wert zur border-color Eigenschaft des span Elements. Vergiss nicht, der Anfangseigenschaftswert ist auf transparent gesetzt.
  5. Zuordnen der Werte, die von der getBoundingClientRect Methode extrahiert wurden, zu den dazugehörigen Eigenschaften des span Elements. In anderen Worten, der span Tag erbt die Größe und Position des Links über dem gehovert wird.
  6. Zurücksetzen der Standardtransformation bezogen auf das span Element. Dieses Verhalten ist nur beim ersten Hover über eines Links wichtig.  In diesem Fall, die Transformation des Elements geht von transform: translateX(-60px) zu transform: none. Dies gibt uns einen stylischen Slide-In Effekt.

Wenn Aktiv

Es ist wichtig zu wissen, dass der oben angeführte Code jedes Mal ausgeführt wird, wenn wir über einen Link hovern. Es wird auch ausgeführt, wenn wir über einen "aktiven" Link hovern. Um dieses Verhalten zu verhindern,  verpacken wir den obigen Code innerhalb einer if Anweisung.

Bisher sieht unsere Demo folgendermaßen aus:

Beinahe, aber nicht Ganz

Alles sieht so aus als würde es korrekt funktionieren, stimmts? Nun ja, dies ist nicht korrekt, denn wenn wir durch unsere Seite scrollen oder das Ansichtsfenster verändern und dann versuchen einen Link auszuwählen, entsteht ein Durcheinander.

Spiel mit der kompletten Seiten Demo herum um zu sehen was ich meine.

Um dies zu lösen, müssen wir herausfinden wie weit wir vom Anfang der Seite heruntergescrollt haben und diesen Wert zu unseren aktuellen top Wert des Zielelements hinzufügen. Gleichfalls sollten wir kalkulieren, wie weit das Dokument horizontal gescrollt wurde (nur zur Sicherheit). Der resultierende Wert wird zum momentanen left Wert des Zielelements hinzugefügt.

Hier sind auch zwei Zeilen Code die wir aktualisieren müssen:

Bitte behalte im Gewissen, dass all der oben angeführte Code direkt ausgeführt wird, nachdem der Browser das DOM verarbeitet  und das relevante Skript gefunden hat. Wiederum, für deine eigenen Implementierungen und Designs kannst du mit diesem Code ausführen wenn die Seite geladen wird, oder so ähnlich. In manchen Szenarien kann es passieren, dass du den Code innerhalb eines Event Handlers (z.B. load Event Handler) einbetten musst.

Ansichtsfenster

Zuletzt müssen wir garantieren können, dass der Effekt immer noch funktioniert, wenn wir das Browser Fenster verändern. Um dies zu vollenden, müssen wir auf ein resize Event hören und einen resizeFunc Event Handler registrieren.

Hier ist das Gerüst dieses Handlers:

Innerhalb der obigen Funktion, machen wir folgendes:

  1. Checken falls ein Menü Listen Item mit der Klasse active existiert. Wenn sich dort ein Element befindet, heißt das, dass wir schon über einen Link gehovert haben.
  2. Erhalten der neuen left und top Eigenschaften des "aktiven" Items mit dessen verbundenen Fenster Eigenschaften und diese zum span Element zuordnen. Beachte, dass wir die Werte nur dann für die Eigenschaften die während des resize Events geändert wurden bekommen. Dies heißt, dass wir keine Neuberechnung der Breite und Höhe des Menü Links benötigen.

Browser Unterstützung

Die Demo funktioniert in allen neuen Browsers. Wenn du irgendwelche Probleme begegnen solltest, lass es mich in den Kommentaren wissen. Wie du auch möglicherweise schon bemerkt hast, verwenden wir Babel um unseren ES6 Code auf ES5 zu kompilieren.

Zusammenfassung

In dieser schnellen Anleitung haben wir uns durch den Prozess der Erstellung eines einfachen und jetzt interessanten Menü Hover Effects durchgearbeitet.

Ich hoffe euch hat das Erstellte gefallen und gab euch eine Inspiration zur weiteren Entwicklung von noch stärkeren Menü-Effekten wie das hier aufscheinende (während des Schreibens) auf der Stripe Seite.

Habt ihr schon etwas ähnliches kreiert? Wenn ja, teilt uns die Herausforderungen mit die ihr bewältigen musstet.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.