gpt4 book ai didi

javascript - Vanilla JS 在滚动重构时更改链接的事件状态

转载 作者:行者123 更新时间:2023-11-30 14:25:23 24 4
gpt4 key购买 nike

我正试图从我即将进行的项目中放弃 jQuery。我找到了一种使用纯 Vanilla JS 在滚动条上创建粘性导航的方法,并希望导航中的链接在到达相应部分时更改其事件状态。

下面是我提出的可行解决方案,但我确信可以改进代码以编程方式工作,而无需为每个元素选择和创建条件。

我也使用了很多不同的选择器,我很确定一定有办法改进它,也许使用 querySelectorAll 并添加一个 eventListenerforEach 循环中,但我也无法让它工作。感谢您的帮助!

// select links
const allLinks = document.querySelectorAll('header nav ul li');
const linkTop = document.querySelector('#linkTop');
const linkAbout = document.querySelector('#linkAbout');
const linkServices = document.querySelector('#linkServices');
const linkClients = document.querySelector('#linkClients');
const linkContact = document.querySelector('#linkContact');
// select sections
const sectionTop = document.querySelector('#top');
const sectionAbout = document.querySelector('#about');
const sectionServices = document.querySelector('#services');
const sectionClients = document.querySelector('#clients');
const sectionContact = document.querySelector('#contact');

function changeLinkState() {
// home
if (window.scrollY >= sectionTop.offsetTop) {
allLinks.forEach(link => {
link.classList.remove('active');
});
linkTop.classList.add('active');
}
// about
if (window.scrollY >= sectionAbout.offsetTop) {
allLinks.forEach(link => {
link.classList.remove('active');
});
linkAbout.classList.add('active');
}
// services
if (window.scrollY >= sectionServices.offsetTop) {
allLinks.forEach(link => {
link.classList.remove('active');
});
linkServices.classList.add('active');
}
clients
if (window.scrollY >= sectionClients.offsetTop) {
allLinks.forEach(link => {
link.classList.remove('active');
});
linkClients.classList.add('active');
}
contact
if (window.scrollY >= sectionContact.offsetTop) {
allLinks.forEach(link => {
link.classList.remove('active');
});
linkContact.classList.add('active');
}
}

window.addEventListener('scroll', changeLinkState);
<nav>
<ul>
<li id="linkTop">
<a href="#top">Home</a>
</li>
<li id="linkAbout">
<a href="#about">About Us</a>
</li>
<li id="linkServices">
<a href="#services">Services</a>
</li>
<li id="linkClients">
<a href="#clients">Clients</a>
</li>
<li id="linkContact">
<a href="#contact">Contact</a>
</li>
</ul>
</nav>

非常感谢!

最佳答案

您可以使用 document.querySelectorAll() 获取所有部分和链接。在滚动时从最后到第一迭代部分列表,直到找到匹配的部分。然后从所有链接中删除 .active 类,并将其添加到事件 index 处的链接。

注意:您应该使用 throttling以防止在一秒钟内多次调用 changeLinkState。另一种选择是使用 Intersection Observer API .

const links = document.querySelectorAll('.links');
const sections = document.querySelectorAll('section');

function changeLinkState() {
let index = sections.length;

while(--index && window.scrollY + 50 < sections[index].offsetTop) {}

links.forEach((link) => link.classList.remove('active'));
links[index].classList.add('active');
}

changeLinkState();
window.addEventListener('scroll', changeLinkState);
nav {
position: fixed;
top: 0;
right: 0;
width: 10em;
}

section {
height: 100vh;
margin: 1em 0;
background: gold;
}

.active {
background: silver;
}
<nav>
<ul>
<li id="linkTop" class="links">
<a href="#top">Home</a>
</li>
<li id="linkAbout" class="links">
<a href="#about">About Us</a>
</li>
<li id="linkServices" class="links">
<a href="#services">Services</a>
</li>
<li id="linkClients" class="links">
<a href="#clients">Clients</a>
</li>
<li id="linkContact" class="links">
<a href="#contact">Contact</a>
</li>
</ul>
</nav>

<section>
Home
</section>

<section>
About Us
</section>

<section>
Services
</section>

<section>
Clients
</section>

<section>
Contact
</section>

关于javascript - Vanilla JS 在滚动重构时更改链接的事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52025615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com