Я новичок в jQuery и JS в целом, поэтому, пожалуйста, будьте добрыми :)
У меня есть липкая панель навигации наверху моей страницы, которая ссылается на различные разделы контента (расположение страниц) внизу. Эффект, который я хотел бы достичь, - это то, что соответствующий раздел автоматически выделяется, когда пользователь начинает его читать (даже если они прокручиваются до него вручную, а не по ссылке).
Вот пример того, о чем я говорю (* обратите внимание на панель навигации, как изменяются divs при прокрутке страницы, с которой она связана): http://www.domo.com/.
Я использую jQuery липкий плагин прямо сейчас, чтобы заставить меню придерживаться вершины, но не могу понять, как сделать зависание.
Хороший учебник здесь, используя jQuery Waypoints.
В основном проблема возникает в двух частях:
1. Где на странице находятся мои разделы?
Чтобы выделить элемент навигации для каждого раздела, вам сначала нужно знать, где находится каждый раздел.
Я предлагаю использовать класс, например .section
для определения ваших разделов и атрибута name
для разработки, который есть, поэтому ваша разметка будет выглядеть примерно так:
<html>
<head>...etc.</head>
<body>
<ul>
<li class="nav" id="nav_one">1</li>
<li class="nav" id="nav_two">2</li>
</ul>
<div class="section" name="one"> Section one</div>
<div class="section" name="two"> Section two</div>
</body>
</html>
JavaScript, чтобы найти, где находится каждый из разделов:
//define a sections object
var sections = {}
//find all sections on the page, then for each:
$('.section').each(function(){
//add a property to the object with a key corresponding to the name
//and a value corresponding to the offset from the top of the page.
sections[$(this).attr('name')] = $(this).offset().top;
});
2. Где на странице находится пользователь?
Вторая часть головоломки состоит в том, чтобы найти, какие секции находятся в поле зрения. Это изменяется по мере scroll()
пользователя, так как вы можете ожидать, вам нужно использовать обработчик события jQuery scroll()
:
//the function passed as an argument will be called every time the user scrolls.
$(document).scroll(function(){
//get the new position
var newPos = $(this).scrollTop();
//configurable variable to decide how close a new section needs to be to the
//top of the page before it considered the active one.
var OFFSET = 100;
//look at all the sections you have, and work out which one should be
//considered active.
for(name in sections){
if(sections[name] > newPos && sections[name] < newPos + OFFSET){
//the section with name = name is within OFFSET of the top
//remove "active" styling from the previously active nav elements
$('.nav').removeClass('active');
//make the nav element with an id of nav_sectionname active.
$('#nav_' + name).addClass('active');
}
}
});
.nav
не нужен. Оберните меню в nav
и выберите элементы меню соответственно.