前端实战:如何让用户回到上次阅读位置
在阅读类、资讯类或博客网站中,记忆用户上次滚动到的位置并在下次访问时自动恢复,能显著提升用户体验。今天我们来探讨几种实现方案,从基础监听优化到 Intersection Observer API,再到 URL Hash 定位,帮你构建流畅且高效的方案。
总体思路
核心目标很明确:
- 在用户滚动时记录当前位置。
- 页面重新加载时恢复到记录的位置。
涉及的关键技术包括:
- scroll 事件监听
- localStorage 本地存储
- requestAnimationFrame 节流优化
- Intersection Observer API 观察元素进入视口
实现方案详解
1. 基础方法:监听滚动,记录 scrollTop
这往往是初学者的首选思路:实时记录 window.scrollY 并保存到 localStorage,加载时读取并 scrollTo 恢复。
但这种方法有个隐患:scroll 事件触发太频繁。高频滚动下每秒触发上百次很正常,简单的节流时间间隔可能无法应对快速滑动场景。这里推荐使用 requestAnimationFrame 进行节流,确保只在浏览器重绘前执行一次。
// 用于保存最新滚动位置
let lastKnownScrollY = 0;
// 用于控制 requestAnimationFrame
let ticking = false;
// 监听滚动事件
window.addEventListener('scroll', () => {
lastKnownScrollY = window.scrollY;
// 防止过度频繁存储,使用 requestAnimationFrame 节流
if (!ticking) {
window.requestAnimationFrame(() => {
localStorage.setItem('scrollPosition', lastKnownScrollY);
ticking = false;
});
ticking = true;
}
});
// 页面加载时,恢复之前保存的位置
window.addEventListener('DOMContentLoaded', () => {
const savedPosition = .();
(savedPosition !== ) {
.(, (savedPosition));
}
});


