前端实战:如何让用户回到上次阅读的位置?
在阅读类、资讯类、博客类网站中,记忆用户上次阅读到的位置,并在下次访问时自动滚动回那个位置,可以大大提升用户体验。
本文将详细讲解前端如何实现用户回到上次阅读的位置,包括基础 scroll 方法优化、Intersection Observer API + 探针追踪、锚点 URL Hash 定位跳转等策略。

一、总体思路
1、核心目标
- 在用户滚动时记录当前位置。
- 在页面重新加载时恢复到记录的位置。
2、涉及到的技术
可根据需求选择以下技术实现:
- scroll 事件监听
- localStorage 本地存储
- requestAnimationFrame 节流优化
- Intersection Observer API 观察元素进入视口
- Vue3 响应式组件(如需框架版本)
二、实现方案详解
1、基础方法:监听滚动,记录 scrollTop(不推荐)
在用户滚动时,实时记录 window.scrollY(页面滚动的垂直距离),保存到 localStorage 中。页面加载时,从 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;
}
});
.(, {
savedPosition = .();
(savedPosition !== ) {
.(, (savedPosition));
}
});


