По мере прокрутки страницы вниз активный пункт меню изменяется. Как это сделать?
95
Это делается путем привязки к событию прокрутки контейнера (обычно окна).
Быстрый пример:
// 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");
});
См. Приведенное выше действие в jsFiddle, включая анимацию прокрутки.
menuItems = topMenu.find("a"),
наmenuItems = topMenu.find("a").slice(0,4),
, заменив4
на [ваши ссылки на странице - 1].Просто проверьте мой код, снайперскую и демонстрационную ссылку:
демо жить
Показать фрагмент кода
источник
Просто чтобы дополнить ответ @Marcus Ekwall. Так вы получите только якорные ссылки. И у вас не возникнет проблем, если у вас будет сочетание якорных и обычных ссылок.
В основном я заменил
по
Чтобы сопоставить все ссылки с привязкой где-нибудь, и изменить все, что было необходимо, чтобы заставить его работать с этим
Посмотрите в действии на jsfiddle
источник
Если вы хотите, чтобы принятый ответ работал в JQuery 3, измените код следующим образом:
Я также добавил try-catch, чтобы предотвратить сбой javascript, если с этим идентификатором нет элемента. Не стесняйтесь улучшать его еще больше;)
источник