局部滚动容器刷新后 scrolltop 重置为 0,因浏览器仅记忆 document.documentelement.scrolltop;需用 sessionstorage 或 localstorage 手动存取并恢复,键名须带容器标识,挂载后通过 requestanimationframe 确保布局稳定再设置,同时确保容器满足可滚动条件及子元素布局正常。

局部滚动容器刷新或重渲染后 scrollTop 重置为 0,是因为浏览器只默认记住 document.documentElement.scrollTop,对子容器滚动偏移完全无感知。必须手动存取、主动恢复。
为什么 localStorage 或 sessionStorage 是首选存储方式
sessionStorage 生命周期与标签页绑定,页面刷新后仍存在,且不跨标签页干扰;localStorage 持久性更强,适合需跨会话保留的场景(如聊天窗口长期滚动位置)。两者都支持字符串键值对,读写开销极低。
- 键名必须带容器标识,例如
chat-scroll-top或sidebar-scroll-top,避免多个局部滚动区互相覆盖 - 不要用
location.hash或 URL 参数存位置——局部容器内元素可能被重建,ID 失效;且无法表达“滚动到中间某像素”这种非锚点位置 - 存的是
container.scrollTop值,不是container.scrollHeight或相对比例,确保还原精度
挂载后立即恢复,但得防布局抖动
容器 DOM 插入后立刻赋值 scrollTop,常因高度未计算完成而失效(尤其含图片、异步内容时)。必须等布局稳定再设值。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 用
requestAnimationFrame包一层是最轻量可靠的时机:它在下一次重绘前执行,此时容器尺寸已确定 - 若容器高度依赖动态加载的内容(如懒加载图片),应在所有资源就绪后再恢复,例如监听
img.onload或用IntersectionObserver确认可视区域内容已加载 - 别在
DOMContentLoaded就恢复——此时 CSS 可能未生效,容器高度仍是 0
滚动行为不生效?检查 scroll-behavior 和容器可滚动性
scroll-behavior: smooth 必须直接加在滚动容器上,且该容器必须满足可滚动前提:有明确 height 或 max-height、overflow-y: auto、内容实际高度超限。否则 scrollTop 设了也无效,更别说平滑动画。
- 设了
scroll-behavior: smooth但滚动还是瞬跳?先查getComputedStyle(container).overflowY是否为auto或scroll,再确认container.scrollHeight > container.clientHeight - 用
container.scrollTo({ top: savedPos, behavior: 'smooth' })替代直接赋值scrollTop,兼容性更好,且能触发平滑过渡 - 用户开启系统“减少运动”偏好时,
behavior: 'smooth'自动退化为'auto',这是预期行为,无需 hack 绕过
真正容易被忽略的是:容器内部子元素若用了 display: contents 或 visibility: hidden,会导致 scrollHeight 计算异常,进而让 scrollTop 始终为 0 —— 此时恢复逻辑再完整也没用,得先修复布局本身。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










