window.scrollY 和 window.scrollTo() 是获取和设置页面滚动位置的标准方法:前者实时只读返回纵轴偏移量,后者通过坐标或配置对象精准控制滚动,支持 smooth 行为,推荐优先使用。

直接用 window.scrollY 和 window.scrollTo(),别绕弯
获取当前滚动位置:用 window.scrollY 和 window.scrollX
这两个属性是实时、只读的,返回文档相对于视口顶部/左侧的像素偏移量。不是“计算值”,是浏览器直接暴露的当前状态。
-
window.scrollY等价于window.pageYOffset,推荐用前者(语义更清晰) -
window.scrollX同理,水平方向极少用,但存在且可靠 - 对某个可滚动容器(如
div),用element.scrollTop/element.scrollLeft,注意它只反映该元素内部滚动,和文档无关 - 不要用
document.body.scrollTop或document.documentElement.scrollTop—— 浏览器兼容逻辑混乱,window.scrollY在所有现代浏览器中行为一致
设置滚动位置:优先用 window.scrollTo() 而非赋值 scrollTop
window.scrollTo() 是标准、可控、带选项的接口;直接改 document.body.scrollTop 不仅无效(在大多数模式下),还会触发意外重排。
- 基础用法:
window.scrollTo(0, 100)—— 横纵坐标,单位像素 - 推荐对象式调用:
window.scrollTo({ top: 100, left: 0, behavior: 'smooth' }) -
behavior: 'smooth'在 Chrome/Firefox/Edge 和 Safari 15.4+ 中可用;旧 Safari 或 WebView 需降级为'auto',否则静默失败 - 若目标是某个元素,别手动算
offsetTop:先el.scrollIntoView({ behavior: 'smooth', block: 'start' }),更鲁棒
常见坑:offsetTop 不等于实际滚动位置
很多人用 target.offsetTop 计算滚动目标,结果偏移错位。根本原因是 offsetTop 只计算到最近有定位(position: relative/absolute/fixed)的父元素的距离,不考虑 transform、margin、border、滚动容器嵌套等。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
立即学习“前端免费学习笔记(深入)”;
- 更稳的方式是:
target.getBoundingClientRect().top + window.scrollY - 如果页面有固定导航栏高 60px,要留出空间:减去 60,但必须在
getBoundingClientRect()之后加,不能直接从offsetTop减 - 使用
scrollIntoView()时,block: 'nearest'可避免强行拉到顶部,适合侧边栏或浮动菜单场景
记住位置并恢复:localStorage + scrollRestoration
想用户刷新后回到原位置?光存 window.scrollY 不够,得配合浏览器原生机制防止跳动。
- 在页面卸载前存:
localStorage.setItem('scrollY', window.scrollY) - 在
DOMContentLoaded后立刻恢复:window.scrollTo({ top: parseInt(localStorage.getItem('scrollY') || '0'), behavior: 'auto' }) - 关键一步:在
<head>加<script>history.scrollRestoration = 'manual';</script>,否则 Chrome 会自动恢复并覆盖你的逻辑 - 不要在
load事件里恢复 —— 太晚,页面已闪动;DOMContentLoaded是最早安全时机
最易被忽略的是 scrollRestoration = 'manual' 这一行。没它,你存了又读、读了又设,最后还是被浏览器抢走控制权。


















