Итак, если вы посмотрите на функцию, вы увидите, что это выражение немедленного вызова функции (IIFE) , которое просто означает, что это функция, которая выполняется, как только она встречается.Когда функция запускается, она делает следующее:
var section = document.querySelectorAll(".section");
Находит все узлы, которые имеют класс section
.Это возвращает NodeList
.Это будет представлять <div id="home" class="section"></div>
и т. Д.
Array.prototype.forEach.call(section, function(e) {
sections[e.id] = e.offsetTop;
});
Это способ перебора списка, обладающего такими свойствами, как массив.Если бы это был массив, forEach был бы вызван к нему напрямую (согласно @RobG ниже).Это сохранит атрибут id
каждого section
в объекте sections
, который используется как поиск со значением верхнего смещения, т. Е. Как далеко от вершины находится каждый раздел, когда он отображается.
window.onscroll = function() {}
Обработчик событий, который будет срабатывать при каждой прокрутке.
var scrollPosition = document.documentElement.scrollTop || document.body.scrollTop;
Как далеко от вершины вы прокрутили до сих пор.
if (sections[i] <= scrollPosition) {
document.querySelector('.active').setAttribute('class', ' ');
document.querySelector('a[href*=' + i + ']').setAttribute('class', 'active');
}
Он проходит через все разделы и проверяетесли вы прокрутили по крайней мере столько же вниз документа, сколько этот раздел сверху.Если у вас есть, найдите текущий активный раздел и удалите его класс, он больше не активен.Затем найдите тег a
, который представляет ссылку меню, связанную с этим разделом, и установите его класс как активный.