Au fur et à mesure que vous faites défiler la page, l'élément de menu actif change. Comment cela se fait-il?
95
Cela se fait en se liant à l'événement scroll du conteneur (généralement window).
Exemple rapide:
// 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");
});
Voir ce qui précède en action sur jsFiddle, y compris l'animation de défilement.
menuItems = topMenu.find("a"),
pourmenuItems = topMenu.find("a").slice(0,4),
, en remplaçant4
par [vos liens sur la page - 1].Vérifiez simplement mon code et mon Sniper et mon lien de démonstration:
démo en direct
Afficher l'extrait de code
la source
Juste pour compléter la réponse de @Marcus Ekwall. Faire comme ça n'obtiendra que des liens d'ancrage. Et vous n'allez pas avoir de problèmes si vous avez un mélange de liens d'ancrage et de liens réguliers.
Fondamentalement, j'ai remplacé
par
Faire correspondre tous les liens avec l'ancre quelque part, et changer tout ce qui était nécessaire pour le faire fonctionner
Regardez-le en action sur jsfiddle
la source
Si vous voulez que la réponse acceptée fonctionne dans JQuery 3, changez le code comme ceci:
J'ai également ajouté un try-catch pour empêcher javascript de planter s'il n'y a pas d'élément par cet identifiant. N'hésitez pas à l'améliorer encore plus;)
la source