当前位置:首页 > JavaScript

js实现鼠标滚动

2026-02-03 00:04:53JavaScript

监听鼠标滚动事件

使用 addEventListener 监听 wheel 事件,可以获取鼠标滚轮的滚动方向和速度。以下是一个基本示例:

window.addEventListener('wheel', function(event) {
  console.log('Delta Y:', event.deltaY); // 垂直滚动量
  console.log('Delta X:', event.deltaX); // 水平滚动量
});

deltaY 为正表示向下滚动,为负表示向上滚动。deltaX 类似,用于水平滚动。

自定义滚动行为

如果需要阻止默认滚动行为(如实现自定义滚动效果),可以调用 event.preventDefault()

window.addEventListener('wheel', function(event) {
  event.preventDefault();
  // 自定义滚动逻辑
  const scrollSpeed = event.deltaY * 0.1; // 调整滚动速度
  window.scrollBy(0, scrollSpeed);
});

平滑滚动动画

通过 requestAnimationFrame 实现平滑滚动动画:

let isScrolling = false;
window.addEventListener('wheel', function(event) {
  event.preventDefault();
  if (isScrolling) return;

  isScrolling = true;
  const targetScrollY = window.scrollY + event.deltaY;
  smoothScroll(targetScrollY);
});

function smoothScroll(targetY) {
  const currentY = window.scrollY;
  const distance = targetY - currentY;
  const duration = 500; // 动画持续时间(毫秒)
  let startTime = null;

  function step(timestamp) {
    if (!startTime) startTime = timestamp;
    const progress = timestamp - startTime;
    const progressRatio = Math.min(progress / duration, 1);
    const easing = progressRatio < 0.5 
      ? 2 * progressRatio * progressRatio 
      : 1 - Math.pow(-2 * progressRatio + 2, 2) / 2; // 缓动函数

    window.scrollTo(0, currentY + distance * easing);

    if (progress < duration) {
      requestAnimationFrame(step);
    } else {
      isScrolling = false;
    }
  }
  requestAnimationFrame(step);
}

横向滚动控制

监听 deltaX 实现横向滚动:

const scrollContainer = document.getElementById('horizontal-scroll');
scrollContainer.addEventListener('wheel', function(event) {
  event.preventDefault();
  scrollContainer.scrollLeft += event.deltaY; // 用 deltaY 控制横向滚动
});

兼容性处理

对于旧版浏览器(如 IE),可以使用 mousewheel 事件替代 wheel,并通过 wheelDelta 获取滚动量:

window.addEventListener('mousewheel', function(event) {
  const delta = event.wheelDelta;
  console.log('Wheel Delta:', delta); // 正值向上,负值向下
});

滚动节流优化

避免滚动事件频繁触发导致性能问题,使用节流函数(throttle)优化:

function throttle(func, limit) {
  let lastFunc;
  let lastRan;
  return function() {
    const context = this;
    const args = arguments;
    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  };
}

window.addEventListener('wheel', throttle(function(event) {
  console.log('Throttled scroll:', event.deltaY);
}, 100)); // 每100毫秒触发一次

滚动方向检测

通过比较前后滚动事件的位置判断方向:

js实现鼠标滚动

let lastScrollY = window.scrollY;
window.addEventListener('scroll', function() {
  const currentScrollY = window.scrollY;
  const direction = currentScrollY > lastScrollY ? 'down' : 'up';
  lastScrollY = currentScrollY;
  console.log('Scroll direction:', direction);
});

标签: 鼠标js
分享给朋友:

相关文章

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…