在 JavaScript 中实现“返回顶部”功能非常常见,有多种方法,从简单的原生 JS 到使用流行的库,下面我将为你详细介绍几种最常用和推荐的方法。

核心思路
无论使用哪种方法,返回顶部的核心逻辑都是一样的:
- 监听事件:监听用户滚动、点击按钮等事件。
- 获取滚动位置:获取当前页面滚动的垂直距离(
window.scrollY或document.documentElement.scrollTop)。 - 平滑滚动:使用
window.scrollTo()或window.scrollTo()配合behavior: 'smooth',将页面平滑地滚动到顶部(坐标为{ top: 0, left: 0 })。
使用原生 JavaScript (最推荐)
这是最基础也是最灵活的方法,不需要任何外部依赖。
基础版本:点击即返回顶部
这个版本最简单,点击按钮后立即跳转到顶部,没有动画效果。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">返回顶部示例</title>
<style>
/* 为了演示,让页面有足够的高度 */
body {
height: 3000px;
margin: 0;
}
/* 返回顶部按钮样式 */
#backToTop {
position: fixed; /* 固定在视口 */
bottom: 20px;
right: 20px;
width: 50px;
height: 50px;
background-color: #007bff;
color: white;
border: none;
border-radius: 50%;
cursor: pointer;
display: none; /* 默认隐藏 */
font-size: 18px;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
#backToTop:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<h1>向下滚动页面...</h1>
<!-- 返回顶部按钮 -->
<button id="backToTop">↑</button>
<script>
// 1. 获取按钮元素
const backToTopButton = document.getElementById('backToTop');
// 2. 监听滚动事件
window.addEventListener('scroll', () => {
// 3. 判断滚动位置,显示或隐藏按钮
if (window.scrollY > 100) { // 当滚动超过100px时显示
backToTopButton.style.display = "block";
} else {
backToTopButton.style.display = "none";
}
});
// 4. 监听按钮点击事件
backToTopButton.addEventListener('click', () => {
// 5. 使用 scrollTo 方法返回顶部
// { top: 0, left: 0 } 表示滚动到页面左上角
// behavior: 'smooth' 实现平滑滚动效果
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth'
});
});
</script>
</body>
</html>
优化版本:在页面加载时就隐藏按钮
在上面的代码中,如果页面初始位置就在顶部,按钮会一闪而消失,我们可以通过 CSS 来优化初始状态。

修改 CSS:
将 display: none; 改为 visibility: hidden;,并配合 opacity: 0;。
#backToTop {
/* ... 其他样式 ... */
visibility: hidden; /* 初始状态设为隐藏 */
opacity: 0;
transition: opacity 0.3s, visibility 0.3s; /* 添加过渡效果 */
}
#backToTop.show {
visibility: visible; /* 显示类 */
opacity: 1;
}
修改 JavaScript:
在 scroll 事件监听器中,我们不再直接操作 style.display,而是添加/移除一个 show 类。
// ... 获取按钮元素 ...
window.addEventListener('scroll', () => {
if (window.scrollY > 100) {
backToTopButton.classList.add('show'); // 添加 show 类
} else {
backToTopButton.classList.remove('show'); // 移除 show 类
}
});
// ... 点击事件监听器 ...
这样按钮的出现和消失会有一个平滑的淡入淡出效果,体验更好。
使用 CSS target 伪类 (纯CSS,无需JS)
这是一种非常巧妙且无侵入的方法,但功能相对有限(主要是点击链接跳转)。

HTML:
<a href="#top">返回顶部</a> <!-- 页面顶部需要一个 id 为 "top" 的元素 --> <h1 id="top">这是页面顶部</h1> <!-- ... 页面其他内容 ... -->
CSS:
html {
scroll-behavior: smooth; /* 让整个页面的滚动都平滑 */
}
/* 当 URL 的片段标识符是 #top 时,这个样式生效 */
#top:target {
/* 你可以在这里添加一些视觉反馈,比如改变背景色 */
background-color: #ffffcc;
padding-top: 20px; /* 给顶部一点空间,避免标题被固定导航栏遮挡 */
}
优点:
- 完全不需要 JavaScript。
- 语义化好,
<a>标签就是用来做链接的。
缺点:
- 功能单一,只能实现点击链接跳转,无法根据滚动位置自动显示/隐藏按钮。
- URL 会改变,用户刷新页面后会停留在顶部。
使用第三方库 (如 jQuery)
如果你的项目已经在使用 jQuery,那么用它来实现会非常简洁。
HTML:
<button id="backToTop-jquery">↑</button>
JavaScript:
$(document).ready(function() {
// 1. 监听滚动事件
$(window).scroll(function() {
// 2. 显示/隐藏按钮
if ($(this).scrollTop() > 100) {
$('#backToTop-jquery').fadeIn();
} else {
$('#backToTop-jquery').fadeOut();
}
});
// 3. 监听点击事件
$('#backToTop-jquery').click(function() {
// 4. 使用 jQuery 的 animate 方法平滑滚动
$('html, body').animate({scrollTop : 0}, 800); // 800ms 的动画时长
});
});
优点:
- 代码非常简洁,链式操作优雅。
fadeIn/fadeOut和animate方法提供了丰富的动画效果。
缺点:
- 引入了 jQuery 库,对于这么一个小功能来说可能有点“杀鸡用牛刀”,会增加页面体积。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 原生 JS | 性能最好,无依赖,灵活,功能可控 | 需要自己编写更多代码 | 绝大多数现代 Web 项目,是首选方案 |
CSS target |
纯 CSS,轻量,语义化 | 功能有限,URL 会改变 | 简单的静态页面,不需要复杂交互 |
| jQuery | 代码简洁,动画丰富 | 引入外部库,增加体积 | 项目中已大量使用 jQuery 的场景 |
最终建议:
对于新的项目,强烈推荐使用【方法一:原生 JavaScript】,它提供了最佳的性能和灵活性,并且是前端开发者必须掌握的基础技能,你可以根据项目需求,在基础版本上进行扩展,比如添加缓动效果(easing function)等。
