Vor ein paar Wochen habe ich einen Screencast erstellt, in dem gezeigt wurde, wie ein Navigationsmenü mit drei Ebenen erstellt wird. In einer Antwort-E-Mail forderte einer unserer Leser ein Tutorial zum Erstellen eines Menüs im Stil einer Lava-Lampe auf. Glücklicherweise ist dies eine recht einfache Aufgabe, insbesondere wenn Sie eine JavaScript-Bibliothek verwenden. Wir werden heute einen von Grund auf bauen.
Bevor wir diese ordentliche Funktionalität erstellen können, benötigen wir eine Basis, von der aus wir arbeiten können. Erstellen Sie in Ihrem bevorzugten Code-Editor eine ungeordnete Liste für Ihre Navigation, und importieren Sie sowohl jQuery als auch die jQuery-Benutzeroberfläche über Google.
SpasticNav Plugin
- Zuhause
- Über
- Blog
- Mehr über mein Portfolio
- Kontakt
Beachten Sie, wie wir der Startseite eine ID von "ausgewählt" gegeben haben. Dies ist bei den meisten Websites ziemlich normal. Sie können die aktuelle Seite als Ziel verwenden und das jeweilige Listenelement entsprechend formatieren.
Als Nächstes müssen wir entscheiden, wie die Lava-Lampen-Funktionalität am besten implementiert wird. Um die Wiederverwendbarkeit zu ermöglichen, packen wir dieses kleine Skript in ein Plugin und nennen es wie folgt:
$ ('# nav'). spasticNav ();
Da wir uns entschieden haben, ein Plugin zu erstellen, erstellen wir eine neue Datei für dieses Skript und verweisen Sie in unserem Markup darauf. Wir nennen es jquery.spasticNav.js.
Um die Anzahl der globalen Variablen, die wir erstellen müssen, zu reduzieren und um die Möglichkeit zu vermeiden, dass das $ -Symbol mit anderen JavaScript-Bibliotheken kollidiert, packen wir unser Plugin in eine selbstausführende anonyme Funktion.
(Funktion ($) ) (jQuery);
Nun wird jQuery an unser Plugin übergeben und über das $ -Symbol dargestellt.
Als Nächstes empfiehlt es sich im Allgemeinen, den Benutzern des Plugins so viel Flexibilität wie möglich zu geben. Daher geben wir ihnen die Möglichkeit, ein Objekt-Literal zu übergeben, wenn sie das Plugin aufrufen, um eine Handvoll Einstellungen zu überschreiben. So wie ich es sehe, sollten sie in der Lage sein:
Nun benennen wir unser Plugin und machen es einer Funktion gleich. $ .fn ist einfach ein Alias für jquery.prototype.
$ .fn.spasticNav = Funktion (Optionen) ;
Da wir wissen, dass wir diese Überschreibungen zulassen, müssen wir sicherstellen, dass wir einen "options" -Parameter akzeptieren.
Nun, da wir unser Plugin benannt haben, müssen Sie die Konfigurationsoptionen erstellen.
Optionen = $ .extend (Überlappung: 20, Geschwindigkeit: 500, Zurücksetzen: 1500, Farbe: '# 0b2b61', Erleichterung: 'easeOutExpo', Optionen);
Oben nehmen wir die Variable options, legen einige Standardeigenschaften und -werte fest und erweitern sie dann mit dem, was der Benutzer beim Aufruf des Plugins übergibt. Auf diese Weise setzen die Optionen, die sie übergeben, unsere Standardeinstellungen außer Kraft. Wenn ich zum Beispiel dieses Plugin anrufe, übergebe ich:
$ ('# nav'). spasticNav (Geschwindigkeit: 2000, Erleichterung: 'easeOutElastic');
Diese beiden Eigenschaften überschreiben die Standardeinstellungen, während die übrigen Optionen gleich bleiben.
Jetzt können wir jedes Element durchlaufen, das an dieses Plugin übergeben wurde, und die Lava-Lampen-Funktionalität implementieren. Denken Sie daran, dass wir nicht davon ausgehen können, dass der Benutzer diesem Plugin ein einzelnes Element übergibt. Wenn sie wollten, könnten sie auf eine Klasse verweisen, die sich auf mehrere Elemente bezieht, die diese Funktionalität erhalten sollen. Als solches rufen wir this.each auf, um jedes Element in der umschlossenen Gruppe zu durchlaufen.
return this.each (function () );
In dieser Funktion erstellen wir einige Variablen. Nicht alle haben sofort Werte, aber da die JavaScript-Engine alle Variablennamen sowieso (hinter den Kulissen) an die Spitze der Funktion anhebt, empfiehlt es sich, sie ganz oben zu deklarieren und sie später zu initialisieren.
var nav = $ (this), currentPageItem = $ ('# selected', nav), blob, reset;
Nun, da wir unsere Variablen deklariert / initialisiert haben, erstellen wir sozusagen den eigentlichen Blob.
$ ('') .css (width: currentPageItem.outerWidth (), height: currentPageItem.outerHeight () + options.overlap, links: currentPageItem.position (). left, oben: currentPageItem.position (). top - options.overlap / 2, backgroundColor: options.color). AppendTo (this);
Der Grund, warum wir die CSS-Methode aufrufen, anstatt nur eine Klasse hinzuzufügen, liegt darin, dass diese Werte je nach Listenelement der aktuellen Seite variieren. Daher müssen wir JavaScript verwenden, um deren Werte abzurufen.
Zum Schluss fügen wir dieses neue Listenelement an diese, oder #nav.
Als Nächstes müssen wir einen Verweis auf #blob speichern. Auf diese Weise müssen wir das DOM nicht jedes Mal durchsuchen, wenn wir darauf zugreifen möchten. Wir haben das erklärt Klecks Variable am oberen Rand der Funktion. Lassen Sie uns es jetzt initialisieren.
blob = $ ('# blob', nav);
Wir müssen nun "zuhören", wenn der Benutzer über einem der Listenelemente (mit Ausnahme des Blobs natürlich) in unserem Navigationsmenü liegt. Wenn dies der Fall ist, setzen wir die Eigenschaften width und left des Blobs auf die des aktuell angehaltenen Listenelements.
$ ('li: not (#blob)', nav) .hover (function () // mit der Maus über clearTimeout (reset); blob.animate (left: $ (this) .position (). left, width: width: $ (this) .width (), duration: options.speed, easing: options.easing, queue: false);, function () // mouse out reset = setTimeout (function () blob.animate.) (width: currentPageItem.outerWidth (), left: currentPageItem.position (). left, options.speed), options.reset););
Um das Skript oben zusammenzufassen ...
Und das ist alles was dazu gehört! Dies ist ein sehr einfaches Plugin. Der nächste Schritt besteht darin, unser Navigationsmenü zu gestalten.
Ohne Styling sollte unser Menü so aussehen:
Lassen Sie uns zunächst die "nav" ul. Öffnen Sie Ihre style.css-Datei und fügen Sie Folgendes hinzu:
#nav position: relativ; Hintergrund: # 292929; Schwimmer: links;
Als Nächstes werden wir jedes Listenelement formatieren.
#nav li float: left; Listenstil: keine; Rand rechts: 1px fest # 4a4a4a; Rand links: 1px durchgehend schwarz;
Dies verschiebt einfach jedes Listenelement nach links und fügt jeder Seite einen Rahmen hinzu.
Als Nächstes müssen wir die Ankertags in unserem Navigationsmenü formatieren.
#nav li a color: # e3e3e3; Position: relativ; z-Index: 2; Schwimmer: links; Schriftgröße: 30px; Schriftfamilie: helvetica, arial, serifenlos; Textdekoration: keine; Polsterung: 30px 45px;
Wir setzen eine Farbe, schweben sie nach links, setzen einige Schriftwerte und eine gute Menge an Füllungen. Beachten Sie die Z-Index-Eigenschaft. Dies ist eine Notwendigkeit und wird in Kürze erklärt. Denken Sie jedoch daran, dass wir, um den Z-Index anzupassen, einen Positionierungskontext setzen müssen, was wir getan haben.
Da wir kein komplett zurückgesetztes Stylesheet implementieren, stellen wir sicher, dass wir die Standardmargen und Füllungen für ul und li auf Null setzen, um potenzielle Kopfschmerzen zu vermeiden.
ul, li margin: 0; Polsterung: 0;
Der letzte Schritt besteht darin, den Klecks selbst zu gestalten!
#blob border-right: 1px solid # 0059ec; Rahmen links: 1px fest # 0059ec; Position: absolut; oben: 0; z-Index: 1; Hintergrund: # 0b2b61; Hintergrund: -moz-linearer Gradient (oben, # 0b2b61, # 1153c0); Hintergrund: -webkit-gradient (linear, links oben, links unten, von (# 0b2b61) bis (# 1153c0)); -moz-border-radius: 4px; -webkit-border-radius: 4px; -moz-box-shadow: 2px 3px 10px # 011331; -webkit-box-shadow: 2px 3px 10px # 011331;
Wir haben wieder einige schöne Farben für unsere Ränder festgelegt und einige Hintergrundfarben hinzugefügt (einschließlich CSS3-Verläufe / -Ränder / -Schatten für Firefox und Safari / Chrome). Wieder sehen wir diese Z-Index-Eigenschaft. Andernfalls zeigt der Blob den gesamten Text im Navigationsmenü an. Um dem entgegenzuwirken, müssen wir sicher sein, dass die Z-Index-Eigenschaft niedriger ist als die des Listenelements. Wir müssen auch die Position auf absolut setzen, um die oberen und linken Werte mit unserem Plugin anzupassen.
Das ist alles dazu! Mit minimalem Aufwand haben wir ein wirklich ordentlich aussehendes Navigationsmenü erstellt. Lassen Sie mich wissen, wenn Sie Fragen haben! Danke fürs Lesen und Zuschauen.