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),, reemplazando4con [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