【发布时间】:2021-08-28 00:31:27
【问题描述】:
我对 JavaScript 很陌生,如果我的任何描述不够清晰,敬请见谅。
我已经建立了一个带有 java 脚本生成菜单的小型网站,我只是想添加功能以在滚动到菜单时突出显示菜单中的某个部分(并使“活动”)。我将以下内容放在一起,不会在控制台中引发任何错误,所以我不确定我错过了什么:
const sectionHead = document.querySelectorAll('h2');
const sections = document.querySelectorAll('section');
const nav = document.querySelector('nav');
// build the nav
function navMenu(){
for(let section of sectionHead){
let listItem = document.createElement("li");
listItem.innerHTML = section.textContent;
nav.appendChild(listItem);
listItem.classList.add('menu__link');
listItem.addEventListener("click", ()=>{
section.scrollIntoView({behavior: "smooth"});
});
};
}
navMenu();
const nav_items = document.querySelectorAll('.menu__link')
window.addEventListener("scroll", () => {
let current = "";
sections.forEach((section) => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
if (pageYOffset >= sectionTop - sectionHeight / 3) {
current = section.getAttribute("id");
}
});
//set section as active
nav_items.forEach((li) => {
li.classList.remove("your-active-class");
section.classList.remove("your-active-class");
if (section.classList.contains(current)) {
section.classList.add("your-active-class");
//console.log (li.classList);
}
});
});
“your-active-class”类有一些自定义 CSS 设置,因此它只会改变菜单中的可见性。
非常感谢任何帮助
【问题讨论】:
-
最有效的方法(在我看来)是 Intersection Observer。 developer.mozilla.org/en-US/docs/Web/API/…
-
嗨乔尔,我已经查看了文档,但我不确定我是否完全理解如何实现它 - 你能提供一个我如何转换现有代码的示例进入交叉路口观察者?
标签: javascript html function dom-events sections