Wenn Sie die Seite nach unten scrollen, ändert sich der aktive Menüpunkt. Wie wird das gemacht?
95
Dies erfolgt durch Binden an das Bildlaufereignis des Containers (normalerweise Fenster).
Kurzes Beispiel:
// Cache selectors
var topMenu = $("#top-menu"),
topMenuHeight = topMenu.outerHeight()+15,
// All list items
menuItems = topMenu.find("a"),
// Anchors corresponding to menu items
scrollItems = menuItems.map(function(){
var item = $($(this).attr("href"));
if (item.length) { return item; }
});
// Bind to scroll
$(window).scroll(function(){
// Get container scroll position
var fromTop = $(this).scrollTop()+topMenuHeight;
// Get id of current scroll item
var cur = scrollItems.map(function(){
if ($(this).offset().top < fromTop)
return this;
});
// Get the id of the current element
cur = cur[cur.length-1];
var id = cur && cur.length ? cur[0].id : "";
// Set/remove active class
menuItems
.parent().removeClass("active")
.end().filter("[href='#"+id+"']").parent().addClass("active");
});
Sehen Sie das Obige in Aktion bei jsFiddle, einschließlich Bildlaufanimation .
menuItems = topMenu.find("a"),
zumenuItems = topMenu.find("a").slice(0,4),
und ersetzen Sie sie4
durch [Ihre On-Page-Links - 1].Überprüfen Sie einfach meinen Code und Sniper und Demo-Link:
Demo live
Code-Snippet anzeigen
quelle
Nur um die Antwort von @Marcus Ekwall zu ergänzen. Wenn Sie dies tun, erhalten Sie nur Ankerverbindungen. Und Sie werden keine Probleme haben, wenn Sie eine Mischung aus Ankerverbindungen und regulären haben.
Grundsätzlich habe ich ersetzt
durch
Alle Links irgendwo mit dem Anker abgleichen und alles ändern, was nötig war, damit es damit funktioniert
Sehen Sie es in Aktion auf jsfiddle
quelle
Wenn die akzeptierte Antwort in JQuery 3 funktionieren soll, ändern Sie den Code folgendermaßen:
Ich habe auch einen Try-Catch hinzugefügt, um zu verhindern, dass Javascript abstürzt, wenn diese ID kein Element enthält. Fühlen Sie sich frei, es noch weiter zu verbessern;)
quelle