
本文介绍如何通过 window.scrollBy() 实现固定位置导航按钮(如“上一页/下一页”)的平滑滚动效果,使其行为与鼠标滚轮或方向键一致,兼容 scroll-snap 布局,并支持动态视口高度适配。
本文介绍如何通过 `window.scrollby()` 实现固定位置导航按钮(如“上一页/下一页”)的平滑滚动效果,使其行为与鼠标滚轮或方向键一致,兼容 scroll-snap 布局,并支持动态视口高度适配。
在现代网页中,尤其是采用垂直分屏(fullpage-style)设计时,常需为触摸设备或无障碍场景提供“向上/向下”导航按钮。这些按钮需精准模拟原生滚动行为——即每次点击滚动一个视口高度(100vh),并自然触发 CSS scroll-snap-type: y mandatory 的吸附效果。直接使用 scrollTo() 会强制跳转到绝对坐标,破坏滚动惯性与 snap 行为;而伪造 KeyboardEvent(如 ArrowUp)则无效,因为浏览器对方向键的滚动逻辑属于原生 UI 层行为,无法通过事件派发触发。
正确解法是使用 window.scrollBy() —— 它以相对方式滚动文档视图,完全复刻用户滚动体验:
<!-- HTML 结构(关键:为按钮添加 id 并确保 body 可滚动) --> <button id="upButton" style="position: fixed; bottom: 5rem; right: 2rem; padding: 0.75rem 1.5rem;">↑ Up</button> <button id="downButton" style="position: fixed; bottom: 5rem; left: 2rem; padding: 0.75rem 1.5rem;">↓ Down</button>
// JavaScript:绑定点击事件,按视口高度滚动
const upButton = document.getElementById('upButton');
const downButton = document.getElementById('downButton');
upButton.addEventListener('click', () => {
window.scrollBy({ top: -window.innerHeight, behavior: 'smooth' });
});
downButton.addEventListener('click', () => {
window.scrollBy({ top: window.innerHeight, behavior: 'smooth' });
});
✅ 优势说明:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- scrollBy() 是相对滚动,不依赖 DOM 元素定位,完美适配固定按钮场景;
- window.innerHeight 动态获取当前视口高度,响应式友好(自动适配缩放、横竖屏切换);
- 添加 { behavior: 'smooth' } 参数启用原生平滑滚动动画,视觉体验与滚轮/方向键一致;
- 与 scroll-snap-type: y mandatory 天然协同:滚动停止后自动吸附到最近的 scroll-snap-align: start 区域。
⚠️ 注意事项:
- 确保 或根滚动容器未设置 overflow: hidden;
- 若页面存在 transform 或 position: fixed 的父容器干扰滚动流,需将 scrollBy() 作用于具体可滚动元素(如 document.querySelector('.scroller').scrollBy(...));
- 在 Safari 中,scrollBy 的 behavior: 'smooth' 需要开启 scroll-behavior: smooth 样式(推荐在 html 或 body 上统一设置);
- 如需更精细控制(如避免滚动超出首尾区域),可结合 window.scrollY 与 document.documentElement.scrollHeight 做边界判断。
通过此方案,您无需监听键盘事件、不依赖第三方库,即可让按钮滚动与原生交互无缝融合,兼顾可访问性、性能与跨浏览器一致性。










