所以我有一个页面,当你滚动到相应的部分时,活动菜单项被突出显示。如何将活动类添加到滚动我的事件的正确导航项中?
我的代码工作,但我不明白为什么,特别是这部分:
document.querySelector('nav a[href="' + anchorID + '"]').classList.add("active");
在window.onscroll for循环收集所有从菜单
锚(nav a
)然后我可以访问个人anchorIDs(的HREF)有:
var anchorID = anchorsArray[i].getAttribute("href");
我不明白,是.active
类如何被添加到基于视窗内当前部分正确anchorID - 在没有比较的部分ID和相应的锚HREF之间进行。例如。在href &部分ID:
<a href="#section-2" class="">Section 2</a>
<section id="section-2"></section>
..are上滚动从未进行比较。
DEMO:https://jsfiddle.net/zgpzrvns/
所有JS
(function() {
var anchorsArray = document.querySelectorAll("nav a");
var sections = document.querySelectorAll("section");
var sectionsArray = [];
// Collect all sections and push to sectionsArray
for (var i = 0; i < sections.length; i++) {
var section = sections[i];
sectionsArray.push(section);
}
window.onscroll = function() {
var scrollPosition = window.pageYOffset;
for (var i = 0; i < anchorsArray.length; i++) {
// Get hrefs from each anchor
var anchorID = anchorsArray[i].getAttribute("href");
var sectionHeight = sectionsArray[i].offsetHeight;
var sectionTop = sectionsArray[i].offsetTop;
if (
scrollPosition >= sectionTop &&
scrollPosition < sectionTop + sectionHeight
) {
/**
* I don't understand how querySelector finds & adds the active
* class to the correct anchor, when no comparison is made between the
* section ID (that is inside current section in viewport) and the
* anchors ID from anchorsArray
*/
document
.querySelector('nav a[href="' + anchorID + '"]')
.classList.add("active");
} else {
document
.querySelector('nav a[href="' + anchorID + '"]')
.classList.remove("active");
}
}
};
})();
总结:的active
类是如何加入到纠正锚ID,当内部的相应部分ID滚动时的视口(在滚动事件中从未检测到部分ID?)
我对此很困惑,我敢打赌这是我忽略的一些愚蠢的东西!
将不胜感激一些输入! :-)
谢谢。关于:“对于你检查的每一个,如果相同索引的部分在视口中。 “ - 这是我没有得到的。它如何知道在* same *索引处的视口中的部分是否与获取活动类的相应锚点相同?这听起来像是有比较,但不是ID之间? 我不知道为什么我不明白:S – Capax
@Capax编辑了我的答案,以获取更详细的解释 –
谢谢@Daniel Ziegler。现在我懂了!这是我完全忽略的部分:我从sectionHeight&sectionTop获得的索引变量来自循环的anchorsArray [i] - 我正在查看滚动事件外部的Array循环(认为sectionHeight [i]&sectionTop [i]从* that * collection获得了它们的索引变量,而不是锚循环中的那个! – Capax