A medida que se desplaza hacia abajo en la página, el elemento de menú activo cambia. ¿Cómo se hace esto?
95
Se hace vinculando al evento de desplazamiento del contenedor (generalmente ventana).
Ejemplo rápido:
// 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");
});
Vea lo anterior en acción en jsFiddle, incluida la animación de desplazamiento.
menuItems = topMenu.find("a"),
amenuItems = topMenu.find("a").slice(0,4),
, reemplazando4
con [sus enlaces en la página - 1].Solo revisa mi código, francotirador y enlace de demostración:
demo en vivo
Mostrar fragmento de código
fuente
Solo para complementar la respuesta de @Marcus Ekwall. Al hacer esto, solo obtendrás enlaces de anclaje. Y no tendrá problemas si tiene una combinación de enlaces de anclaje y enlaces regulares.
Básicamente reemplacé
por
Para hacer coincidir todos los enlaces con el ancla en algún lugar, y cambió todo lo que era necesario para que funcione con este
Véalo en acción en jsfiddle
fuente
Si desea que la respuesta aceptada funcione en JQuery 3, cambie el código de esta manera:
También agregué un try-catch para evitar que javascript se bloquee si no hay ningún elemento junto a esa identificación. Siéntete libre de mejorarlo aún más;)
fuente