首页 > 文章列表 > JS自定义滚动:滚轮翻倍滚动距离实现教程

JS自定义滚动:滚轮翻倍滚动距离实现教程

439 2025-03-15

如何用JavaScript实现自定义页面滚动,让每次滚轮滚动距离翻倍?

JavaScript自定义页面滚动:滚轮滚动距离翻倍

许多前端开发者希望能够自定义页面滚动行为,以增强用户体验或实现特殊效果。本文将讲解如何利用JavaScript修改默认的鼠标滚轮滚动行为,使每次滚动的距离翻倍。

目标是通过JavaScript代码控制页面滚动,让鼠标滚轮每次滚动时,页面滚动的像素距离从默认值(例如200px)变为400px。这需要拦截浏览器的默认滚动事件,并用自定义滚动函数替代。

关键在于使用JavaScript的wheel事件和requestAnimationFrame方法。wheel事件捕捉鼠标滚轮滚动行为,requestAnimationFrame则创建平滑的滚动动画,避免滚动过程中的跳跃感。

实现步骤:首先,获取当前和目标滚动位置。当前位置用window.pageYOffset获取。目标位置根据滚轮滚动方向和自定义滚动距离计算得出。我们将滚轮每次滚动的距离乘以2(例如,从e.deltaY * 200变为e.deltaY * 400),实现每次滚动400px的效果。

然后,用requestAnimationFrame逐步滚动到目标位置。此方法根据浏览器刷新率优化滚动动画,确保流畅。代码中,我们计算每一帧的滚动距离,并用window.scrollTo(0, scrollY)更新页面滚动位置。

最后,为了避免浏览器默认滚动行为干扰自定义滚动,在wheel事件处理函数中调用e.preventDefault()阻止默认事件。

以下代码片段演示如何实现:

function smoothScroll(targetPosition) {
  const startPosition = window.pageYOffset;
  const distance = targetPosition - startPosition;
  const duration = 1000; // 滚动时间
  let start = null;

  function step(timestamp) {
    if (!start) start = timestamp;
    const progress = timestamp - start;
    const scrollY = progress / duration * distance + startPosition;
    window.scrollTo(0, scrollY);
    if (progress < duration) {
      requestAnimationFrame(step);
    }
  }

  requestAnimationFrame(step);
}

window.addEventListener('wheel', function(e) {
  e.preventDefault();
  let targetPosition = window.pageYOffset + e.deltaY * 400;
  smoothScroll(targetPosition);
});

这段代码通过smoothScroll函数实现平滑滚动,并监听wheel事件触发滚动。 修改默认滚动行为可能影响用户体验,请谨慎使用。

来源:1741659523