当前位置:首页 > 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()

js实现鼠标滚动

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 实现横向滚动:

js实现鼠标滚动

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毫秒触发一次

滚动方向检测

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

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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…