
本文旨在解决JavaScript侧边栏中点击锚点无法平滑滚动到指定区域,以及滚动时导航链接高亮失效的问题。核心在于将全局滚动事件监听器正确地绑定到`window`对象,而非未定义的变量,同时确保jQuery库已正确引入,从而实现预期的平滑滚动和导航状态更新效果。
在构建具有侧边导航栏的网页时,我们常常需要实现点击导航链接时页面平滑滚动到对应内容区域,并实时更新导航链接的激活状态。然而,在实际开发中,开发者可能会遇到滚动功能失效的问题,尤其是在事件监听器的绑定上出现偏差。本教程将深入探讨这类问题的根源并提供一套可靠的解决方案。
原始代码中,平滑滚动、导航高亮和侧边栏粘性定位的逻辑都依赖于滚动事件。然而,e.addEventListener('scroll', ...) 的写法是错误的。e 通常在事件处理函数内部作为事件对象被传递,但在全局作用域中直接使用 e 作为 addEventListener 的目标对象是未定义的。全局的滚动事件应该被绑定到 window 对象上。
要解决上述问题,只需将所有对 e.addEventListener('scroll', ...) 的调用替换为 window.addEventListener('scroll', ...)。window 对象代表了浏览器窗口,是监听全局滚动事件的正确目标。
立即学习“Java免费学习笔记(深入)”;
以下是修正后的JavaScript代码示例:
// 确保jQuery库已引入
// <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
$(document).ready(function () {
// 1. 点击导航链接平滑滚动到指定区域
$('a[href*=\#]').on('click', function (e) {
// e.preventDefault(); // 可以取消默认的哈希跳转行为,实现纯粹的平滑滚动
// 如果需要页面URL哈希随滚动更新,则不取消默认行为,或者手动更新
var target = $(this).attr("href"); // 获取目标元素的ID
if ($(target).length) { // 检查目标元素是否存在
$('html, body').animate({
scrollTop: $(target).offset().top // 计算目标元素的顶部偏移量
}, 600); // 滚动动画时长为600毫秒
}
});
// 2. 滚动时更新导航链接的激活状态
window.addEventListener('scroll', () => {
var scrollDistance = $(window).scrollTop(); // 获取当前滚动距离
// 遍历所有内容区段,根据滚动位置激活对应的导航链接
$('.page-section').each(function (i) {
// 当内容区段的顶部位置小于等于当前滚动距离时,激活其对应的导航链接
if ($(this).position().top <= scrollDistance + 100) { // +100 是为了提前激活,可根据需要调整
$('.navigation a.active').removeClass('active'); // 移除当前激活的链接
$('.navigation a').eq(i).addClass('active'); // 激活当前区段对应的链接
}
});
});
// 3. 侧边导航栏的粘性定位(Sticky Navigation)
var fixmeTop = $('.navigation').offset().top; // 获取导航栏的初始顶部位置
window.addEventListener('scroll', () => {
var currentScroll = $(window).scrollTop(); // 获取当前滚动距离
if (currentScroll >= fixmeTop) {
// 当滚动距离超过导航栏初始位置时,将其定位为fixed
$('.navigation').css({
position: 'fixed',
top: '80px', // 调整为合适的值,例如距离顶部80px
float: 'left' // 保持浮动
});
} else {
// 否则恢复为absolute定位
$('.navigation').css({
position: 'absolute',
top: '50px', // 恢复到初始位置或合适的值
float: 'left'
});
}
});
});为了使上述JavaScript代码正常工作,需要一个匹配的HTML结构。以下是包含侧边栏导航和内容区段的完整HTML示例:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>侧边栏滚动导航教程</title>
<!-- 引入jQuery库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
/* 示例CSS样式,用于演示效果 */
body { margin: 0; font-family: sans-serif; }
.side-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
z-index: 1000;
display: block; /* 示例中设置为block,实际应用中可能通过JS控制显示隐藏 */
}
.faq_sidebar {
width: 300px; /* 侧边栏宽度 */
height: 100%;
background-color: #fff;
position: absolute;
left: 0;
top: 0;
overflow-y: auto; /* 侧边栏内部可滚动 */
padding-top: 20px;
}
.faq-section1 { padding: 20px; border-bottom: 1px solid #eee; }
.faq_close { text-align: right; }
.navigation {
padding: 20px;
width: 260px; /* 导航栏宽度 */
background-color: #f8f8f8;
border-right: 1px solid #eee;
box-sizing: border-box;
z-index: 10; /* 确保粘性导航在内容之上 */
/* 初始定位,会被JS覆盖 */
position: absolute;
top: 50px;
float: left;
}
.navigation__link {
display: block;
padding: 10px 15px;
text-decoration: none;
color: #333;
border-left: 3px solid transparent;
margin-bottom: 5px;
}
.navigation__link:hover { background-color: #e0e0e0; }
.navigation__link.active {
background-color: #e6f7ff;
color: #1890ff;
border-left-color: #1890ff;
font-weight: bold;
}
.tab-content {
margin-left: 300px; /* 为侧边栏留出空间 */
padding: 20px;
}
.page-section {
min-height: 600px; /* 确保每个区段有足够的滚动高度 */
padding: 40px 0;
border-bottom: 1px solid #eee;
}
.page-section:last-child { border-bottom: none; }
h1 { margin-top: 0; }
</style>
</head>
<body>
<div class="side-overlay" id="side-overlay">
<div class="faq_sidebar" id="faqs">
<div class="container-fluid faq-section1">
<div class="row">
<div class="col-md-11">
<h5 class="subscription-subhead">FAQ’s</h5>
<h2 class="subscription-title js-scroll fade-in-bottom">
You have questions, we have answers
</h2>
</div>
<div class="col-md-1 faq_close">
<a href="javascript:void(0)" id="closefaqx" class="closebtn_faq" onclick="closeFaq()">
<img src="./images/cross X.png" alt="" class="closebar">
</a>
</div>
</div>
</div>
<div class="faq_section2">
<nav class="navigation" id="mainNav">
<a class="navigation__link" href="#1">What is Lorem Ipsum?</a>
<a class="navigation__link" href="#2">Why do we use it?</a>
<a class="navigation__link" href="#3">Where does it come from?</a>
<a class="navigation__link" href="#4">Where can I get some?</a>
<a class="navigation__link" href="#5">What is Lorem Ipsum?</a>
</nav>
<div class="tab-content">
<div class="nestednav">
<div class="page-section hero" id="1">
<h1>Section 1: What is Lorem Ipsum?</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
</div>
<div class="page-section" id="2">
<h1>Section 2: Why do we use it?</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
</div>
<div class="page-section" id="3">
<h1>Section 3: Where does it come from?</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
</div>
<div class="page-section" id="4">
<h1>Section 4: Where can I get some?</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
</div>
<div class="page-section" id="5">
<h1>Section 5: What is Lorem Ipsum?</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliqué id soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem, incidunt eos provident dolore illum veniam molestias beatae eveniet molestiae aliquid soluta cum iste nam, necessitatibus repellat totam, pariatur est tenetur?</p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>通过正确理解和使用 window.addEventListener,我们可以有效解决JavaScript侧边栏中平滑滚动和导航高亮失效的问题,从而提供更流畅、更直观的用户体验。
以上就是解决JavaScript侧边栏平滑滚动与导航高亮失效问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号