三、JavaScript核心逻辑
接下来实现滚动监听和导航控制的核心功能:
// 获取DOM元素
const navbar = document.getElementById('navbar');
const navLinks = document.querySelectorAll('.nav-links a');
const sections = document.querySelectorAll('.section');
// 滚动相关变量
let lastScrollTop = 0;
const scrollThreshold = 100; // 滚动阈值,避免轻微滚动触发
// 监听滚动事件
window.addEventListener('scroll', function() {
const currentScroll = window.pageYOffset || document.documentElement.scrollTop;
// 控制导航栏显示/隐藏
if (currentScroll > lastScrollTop && currentScroll > scrollThreshold) {
// 向下滚动且超过阈值,隐藏导航栏
navbar.classList.add('hidden');
} else {
// 向上滚动或在顶部,显示导航栏
navbar.classList.remove('hidden');
}
lastScrollTop = currentScroll <= 0 ? 0 : currentScroll; // 防止移动端回弹
// 激活当前区域的导航链接
activateNavLink();
});
// 激活对应导航链接的函数
function activateNavLink() {
let currentSection = '';
// 遍历所有区域,找到当前视口中的区域
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
// 判断区域是否在视口中
if (pageYOffset >= (sectionTop - 200)) {
currentSection = section.getAttribute('id');
}
});
// 更新导航链接状态
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href').substring(1) === currentSection) {
link.classList.add('active');
}
});
}
// 平滑滚动到指定区域
navLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const targetId = this.getAttribute('href');
const targetSection = document.querySelector(targetId);
if (targetSection) {
window.scrollTo({
top: targetSection.offsetTop - 70, // 减去导航栏高度
behavior: 'smooth'
});
}
});
});四、代码解析
1. 导航栏显示/隐藏逻辑
- 通过监听window的scroll事件,实时获取页面滚动位置
- 比较当前滚动位置和上一次滚动位置,判断滚动方向
- 向下滚动时添加hidden类,向上滚动时移除hidden类
- 使用CSS的transform属性实现平滑过渡效果
2. 导航链接激活机制
- 遍历所有内容区域,计算每个区域的位置和尺寸
- 通过比较滚动位置和区域位置,确定当前处于哪个区域
- 为对应区域的导航链接添加active类,改变其样式
3. 平滑滚动效果
- 为导航链接添加点击事件监听器
- 阻止默认的锚点跳转行为
- 使用window.scrollTo方法实现平滑滚动到目标区域
- 计算目标位置时需要减去导航栏的高度,避免内容被遮挡
五、优化建议
- 添加防抖处理,减少滚动事件的触发频率,提高性能
- 考虑移动端的触摸滚动体验
- 可以添加更多动画效果,如导航栏背景透明度变化
- 确保在不同浏览器和设备上的兼容性
六、总结
通过本文的实现方案,我们创建了一个响应式的导航系统,能够根据用户的滚动行为智能地显示/隐藏导航栏并高亮当前区域对应的链接。这种交互模式不仅提升了用户体验,还使页面看起来更加专业和现代化。你可以根据实际需求进一步定制样式和功能。