都在一个 HTML 页面中,通过 JavaScript(这里是 jQuery)来动态切换不同的“部分”(通常称为 Section 或 Block),而不是在多个页面之间跳转,这种技术可以提供非常流畅、快速的用户体验。

下面我将从核心概念、实现步骤、代码示例、增强功能四个方面进行详细说明。
核心概念
一个典型的单页网站结构如下:
- 一个 HTML 文件:
index.html - 一个 CSS 文件:
style.css(用于样式和动画) - 一个 JavaScript 文件:
script.js(包含 jQuery 代码)
工作流程:
- 导航菜单: 当用户点击导航菜单中的链接(如 "首页"、"关于我们"、"服务")时,页面不会跳转。
- 阻止默认行为: jQuery 捕获点击事件,并阻止
<a>标签的默认跳转行为(preventDefault())。 - 获取目标: 从被点击的链接中获取目标部分的 ID(点击 "关于我们",链接可能是
#about)。 - 动画滚动: 使用 jQuery 的
animate()或scrollTop()方法,平滑地将页面滚动到目标部分。 - 更新活动状态: 更新导航菜单的样式,高亮显示当前所在的部分。
实现步骤
HTML 结构
创建一个包含导航菜单和各个内容部分的 HTML 文件,每个内容部分都需要一个唯一的 id,导航链接的 href 属性要对应这些 id。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">我的单页网站</title>
<!-- 引入 CSS 文件 -->
<link rel="stylesheet" href="style.css">
<!-- 引入 jQuery 库 (建议使用 CDN) -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<!-- 导航栏 -->
<header class="main-header">
<nav class="main-nav">
<ul>
<li><a href="#home" class="nav-link active">首页</a></li>
<li><a href="#about" class="nav-link">关于我们</a></li>
<li><a href="#services" class="nav-link">服务</a></li>
<li><a href="#contact" class="nav-link">联系我们</a></li>
</ul>
</nav>
</header>
<main>
<!-- 首页部分 -->
<section id="home" class="content-section">
<h1>欢迎来到首页</h1>
<p>这是网站的主要内容区域。</p>
</section>
<!-- 关于我们部分 -->
<section id="about" class="content-section">
<h2>关于我们</h2>
<p>我们是一家充满活力的公司...</p>
</section>
<!-- 服务部分 -->
<section id="services" class="content-section">
<h2>我们的服务</h2>
<p>提供高质量的服务...</p>
</section>
<!-- 联系我们部分 -->
<section id="contact" class="content-section">
<h2>联系我们</h2>
<p>地址: ...</p>
<p>电话: ...</p>
</section>
</main>
<!-- 引入 JavaScript 文件 -->
<script src="script.js"></script>
</body>
</html>
CSS 样式
为了有良好的视觉效果和滚动体验,我们需要一些 CSS 样式,重点是设置每个部分的高度,并创建导航活动状态的样式。
/* style.css */
/* 全局样式 */
html {
scroll-behavior: smooth; /* 现代浏览器原生平滑滚动,作为备用 */
}
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
/* 导航栏样式 */
.main-header {
position: fixed; /* 固定在顶部 */
width: 100%;
top: 0;
background-color: #333;
z-index: 1000; /* 确保导航栏在最上层 */
}
.main-nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
}
.main-nav li {
margin: 0 20px;
}
.main-nav a {
display: block;
color: white;
text-decoration: none;
padding: 20px 15px;
transition: background-color 0.3s;
}
.main-nav a:hover {
background-color: #555;
}
/* 活动链接的样式 */
.main-nav a.active {
background-color: #007BFF;
}
部分样式 */
.content-section {
min-height: 100vh; /* 每个部分至少占满一屏高度 */
padding: 80px 20px; /* 顶部留出导航栏空间 */
display: flex;
justify-content: center;
align-items: center;
text-align: center;
border-bottom: 1px solid #eee;
}
#home { background-color: #f4f4f4; }
#about { background-color: #e7f3fe; }
#services { background-color: #fff2cc; }
#contact { background-color: #f9f2f4; }
jQuery 逻辑
这是实现单页网站交互的核心,我们将编写 jQuery 代码来处理点击事件、平滑滚动和活动状态更新。
// script.js
$(document).ready(function() {
// 1. 为所有导航链接添加点击事件监听器
$('.nav-link').on('click', function(event) {
// 阻止默认的链接跳转行为
event.preventDefault();
// 2. 获取被点击链接的 href 属性值 ( "#about")
var target = $(this).attr('href');
// 3. 获取目标部分相对于文档顶部的偏移量
// .offset().top 会获取元素的位置
var targetOffset = $(target).offset().top;
// 4. 使用 animate() 方法平滑滚动到目标位置
// 'html, body' 是需要滚动的元素
// 800 是动画持续时间(毫秒)
// 'swing' 是缓动效果
// function() {} 是动画完成后的回调函数
$('html, body').animate({
scrollTop: targetOffset
}, 800, 'swing');
// (可选) 5. 更新活动导航链接
// 移除所有链接的 'active' 类
$('.nav-link').removeClass('active');
// 给当前点击的链接添加 'active' 类
$(this).addClass('active');
});
});
增强功能与高级技巧
上面的基础代码已经可以工作了,但我们可以通过一些技巧让它更专业。
基于滚动位置自动更新导航状态
当用户手动滚动页面时,我们也希望导航栏能高亮显示当前所在的部分。

// 在 script.js 中添加以下代码
// 监听窗口的滚动事件
$(window).scroll(function() {
// 获取当前滚动条的位置
var scrollPosition = $(this).scrollTop();
// 遍历每个内容部分
$('.content-section').each(function() {
// 获取当前部分的顶部和底部位置
var target = $(this);
var targetOffset = target.offset().top;
var targetHeight = target.outerHeight();
// 判断滚动位置是否在当前部分内
if (scrollPosition >= targetOffset - 100 && scrollPosition < targetOffset + targetHeight - 100) {
// 获取当前部分的 ID
var sectionId = target.attr('id');
// 移除所有导航链接的 'active' 类
$('.nav-link').removeClass('active');
// 给对应 ID 的导航链接添加 'active' 类
$('.nav-link[href="#' + sectionId + '"]').addClass('active');
}
});
});
注意: targetOffset - 100 中的 100 是一个偏移量,可以根据需要调整,让高亮效果提前或延后发生。
添加“回到顶部”按钮
当用户滚动到页面底部时,显示一个“回到顶部”的按钮。
HTML:
在 <body> 的末尾添加:
<div id="back-to-top" class="back-to-top">↑</div>
CSS:
在 style.css 中添加:
.back-to-top {
position: fixed;
bottom: 20px;
right: 20px;
width: 50px;
height: 50px;
background-color: #007BFF;
color: white;
text-align: center;
line-height: 50px;
border-radius: 50%;
cursor: pointer;
display: none; /* 默认隐藏 */
z-index: 1001;
}
.back-to-top:hover {
background-color: #0056b3;
}
jQuery:
在 script.js 中添加:
// 在 $(document).ready(function() { ... }) 内部添加
// 初始化 "回到顶部" 按钮
$('#back-to-top').hide();
// 监听滚动事件
$(window).scroll(function() {
// ... (这里放上面技巧一的自动更新导航状态的代码) ...
// 如果滚动超过 100px,显示按钮,否则隐藏
if ($(this).scrollTop() > 100) {
$('#back-to-top').fadeIn();
} else {
$('#back-to-top').fadeOut();
}
});
// 点击 "回到顶部" 按钮的事件
$('#back-to-top').click(function() {
$('html, body').animate({ scrollTop: 0 }, 800);
return false; // 阻止默认行为
});
使用 jQuery 创建单页网站的关键点在于:
- HTML 结构清晰: 导航链接的
href必须与内容部分的id一一对应。 - CSS 定位: 使用
position: fixed固定导航栏,并为内容部分设置合适的高度(如min-height: 100vh)。 - jQuery 核心:
event.preventDefault(): 阻止链接跳转。$(target).offset().top: 获取目标位置。$('html, body').animate(): 实现平滑滚动。$(window).scroll(): 监听滚动事件,实现动态效果。
- 用户体验: 通过添加活动状态、过渡动画和“回到顶部”等功能,提升整体体验。
虽然现在原生 JavaScript 也能很方便地实现这些功能(Element.scrollIntoView({ behavior: 'smooth' })),但 jQuery 的写法依然简洁、兼容性好,并且对于初学者来说更容易理解其背后的逻辑。
