网站首页 > 技术文章 正文
需要注意这些点:
- 位置记录: 监听滚动事件,记录滚动位置
- 存储介质: 使用浏览器存储方案持久化数据
- 位置恢复: 页面加载时读取存储数据并定位
方案1:滚动监听 + localStorage
// 记录滚动位置
window.addEventListener('scroll', throttle(function() {
const scrollY = window.scrollY || document.documentElement.scrollTop;
localStorage.setItem('lastScrollPosition', scrollY);
}, 100)); // 节流函数降低性能消耗
// 恢复位置
window.addEventListener('DOMContentLoaded', () => {
const savedPosition = localStorage.getItem('lastScrollPosition');
if (savedPosition) {
window.scrollTo(0, parseInt(savedPosition));
}
});
// 节流函数实现
function throttle(fn, delay) {
let lastCall = 0;
returnfunction(...args) {
const now = Date.now();
if (now - lastCall < delay) return;
lastCall = now;
return fn.apply(this, args);
};
}
方案2:锚点标记 +URL参数
// 记录锚点元素ID
document.querySelectorAll('.section').forEach(el => {
el.addEventListener('click', () => {
const activeId = el.id;
history.replaceState(null, '', `#${activeId}`);
});
});
// 恢复滚动
window.addEventListener('load', () => {
const hash = window.location.hash.slice(1);
if (hash) {
const target = document.getElementById(hash);
target?.scrollIntoView({ behavior: 'smooth' });
}
});
方案3:Intersection Observer API
// 记录最近可见的元素
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const elementId = entry.target.id;
localStorage.setItem('lastVisibleElement', elementId);
}
});
}, { threshold: 0.5 });
// 观察所有章节元素
document.querySelectorAll('.chapter').forEach(el => observer.observe(el));
// 恢复时滚动到最近可见元素
const lastElementId = localStorage.getItem('lastVisibleElement');
if (lastElementId) {
document.getElementById(lastElementId)?.scrollIntoView();
}
方案4:滚动位置预测(适用于动态加载内容)
let lastKnownPos = 0;
let ticking = false;
window.addEventListener('scroll', () => {
lastKnownPos = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(() => {
// 预测用户滚动方向
const viewportHeight = window.innerHeight;
const predictPosition = lastKnownPos + (viewportHeight * 0.3);
localStorage.setItem('predictPos', predictPosition);
ticking = false;
});
ticking = true;
}
});
// 恢复时使用预测位置
const savedPos = localStorage.getItem('predictPos');
if (savedPos) {
window.scrollTo(0, savedPos);
}
- 上一篇: 全球最火的前端 UI 组件库,接入 AI!
- 下一篇: Vue 事件系统_vue常用事件
猜你喜欢
- 2025-09-23 全球最火的前端 UI 组件库,接入 AI!
- 2025-09-23 使用 Trae IDE 一键将 Figma 转为前端代码
- 2025-09-23 还在死磕 README.md?你的前端项目更需要这个新玩意!
- 2025-09-23 不得不说,Ant-Deisgn 是真的懂前端用户!
- 2025-09-23 前端文件下载的N种姿势:从简单到高级
- 2025-09-23 为什么前端开发者都不用 try-catch 了?
- 2024-12-17 WASM,传统前端的拯救者? 誉言aigc50前端全能版中文版软件免费版
- 2024-12-17 mswjs 让前端 mock 不只是在本地 前端mock数据使用简单demo
- 2024-12-17 盘点程序员之间的那些鄙视链 程序员中的鄙视链
- 2024-12-17 6 万颗星,图片和视频秒变代码,让前端程序员下岗的开源项目
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)