Conforme você rola a página para baixo, o item de menu ativo muda. Como isso é feito?
95
É feito vinculando-se ao evento scroll do contêiner (geralmente janela).
Exemplo 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");
});
Veja acima em ação em jsFiddle incluindo animação de rolagem.
menuItems = topMenu.find("a"),
paramenuItems = topMenu.find("a").slice(0,4),
, substituindo4
por [seus links na página - 1].Basta verificar meu Código e Sniper e o link de demonstração:
demonstração ao vivo
Exibir trecho de código
fonte
Apenas para complementar a resposta de @Marcus Ekwall. Fazer assim obterá apenas links de âncora. E você não terá problemas se tiver uma mistura de links de âncora e links regulares.
Basicamente eu substituí
de
Para combinar todos os links com âncora em algum lugar, e mudar tudo o que era necessário para fazer funcionar com este
Veja em ação no jsfiddle
fonte
Se você deseja que a resposta aceita funcione no JQuery 3, altere o código assim:
Também adicionei um try-catch para evitar que o javascript falhe se não houver nenhum elemento por esse id. Sinta-se à vontade para melhorá-lo ainda mais;)
fonte