查看: 101|回复: 1

JavaScript监听鼠标滚轮方向(向上/向下)的完整实现及兼容处理

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
鼠标滚轮事件在Web交互中非常实用,比如无限滚动加载、图片缩放、幻灯片切换等。本文围绕wheel事件及其deltaY属性,给出判断滚动方向的标准写法,并提供一个可运行的幻灯片切换示例,同时讨论旧浏览器的兼容方案。

## wheel事件与deltaY属性
现代浏览器推荐使用wheel事件替代已废弃的mousewheel。wheel事件对象包含deltaY属性,用于识别垂直滚动方向:
- deltaY < 0:向上滚动(用户手指或鼠标滚轮向前推)
- deltaY > 0:向下滚动(用户手指或鼠标滚轮向后拉)

此外,deltaX表示水平滚动,deltaZ基本用不到。

## 基本监听代码
直接使用addEventListener注册wheel事件即可。以下代码在控制台输出滚动方向:
  1. document.addEventListener('wheel', (event) => {
  2.   if (event.deltaY < 0) {
  3.     console.log('向上滚动');
  4.     // 执行向上滚动逻辑
  5.   } else if (event.deltaY > 0) {
  6.     console.log('向下滚动');
  7.     // 执行向下滚动逻辑
  8.   }
  9. });
复制代码
注意:如需阻止页面默认滚动(比如实现自定义滚动效果),可在事件处理函数开头调用event.preventDefault(),但必须谨慎使用,避免破坏基础滚动体验。

## 完整示例:阻止默认滚动 + 切换幻灯片
实际需求中常需要覆盖浏览器默认滚动,并触发自定义交互。下面以一个三层幻灯片切换为例,向上滚动翻到上一张,向下滚动翻到下一张:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>滚轮切换幻灯片</title>
  7.   <style>
  8.     body {
  9.       margin: 0;
  10.       display: flex;
  11.       justify-content: center;
  12.       align-items: center;
  13.       min-height: 100vh;
  14.       background: #f5f5f5;
  15.       font-family: Arial, sans-serif;
  16.     }
  17.     .slider {
  18.       width: 500px;
  19.       height: 300px;
  20.       background: #f0f0f0;
  21.       border-radius: 8px;
  22.       position: relative;
  23.       overflow: hidden;
  24.     }
  25.     .slide {
  26.       position: absolute;
  27.       width: 100%;
  28.       height: 100%;
  29.       display: flex;
  30.       align-items: center;
  31.       justify-content: center;
  32.       font-size: 24px;
  33.       transition: transform 0.5s ease;
  34.     }
  35.   </style>
  36. </head>
  37. <body>
  38.   <div class="slider">
  39.     <div class="slide" style="background: #ffcccc;">Slide 1</div>
  40.     <div class="slide" style="background: #ccffcc;">Slide 2</div>
  41.     <div class="slide" style="background: #ccccff;">Slide 3</div>
  42.   </div>
  43.   <script>
  44.     const slides = document.querySelectorAll('.slide');
  45.     let currentSlide = 0;
  46.     // 初始只显示第一张
  47.     function updateSlider() {
  48.       slides.forEach((slide, index) => {
  49.         slide.style.transform = `translateY(${(index - currentSlide) * 100}%)`;
  50.       });
  51.     }
  52.     updateSlider();
  53.     document.addEventListener('wheel', (event) => {
  54.       event.preventDefault(); // 阻止页面滚动
  55.       if (event.deltaY < 0) {
  56.         // 向上滚动:上一张
  57.         currentSlide = (currentSlide - 1 + slides.length) % slides.length;
  58.       } else if (event.deltaY > 0) {
  59.         // 向下滚动:下一张
  60.         currentSlide = (currentSlide + 1) % slides.length;
  61.       }
  62.       updateSlider();
  63.     }, { passive: false }); // 必须设置 passive: false 才能调用 preventDefault
  64.   </script>
  65. </body>
  66. </html>
复制代码
工作原理:
- 所有幻灯片绝对定位,垂直堆叠;通过translateY移动当前索引外的幻灯片到可视区外。
- 每次滚轮触发时,更新currentSlide索引,然后调用updateSlider重新计算每个slide的translateY值。
- 注意addEventListener的第三个参数要传入{ passive: false },否则部分浏览器会忽略preventDefault调用。

## 兼容旧浏览器(如IE)
虽然wheel已是标准,但个别老旧环境(IE 11以下)不支持。可以同时监听mousewheel进行兜底,但需处理方向值差异:
  1. document.addEventListener('wheel', handleWheel);
  2. document.addEventListener('mousewheel', handleWheel); // 兼容IE
  3. function handleWheel(event) {
  4.   // 标准化deltaY值:wheel事件直接用event.deltaY,mousewheel使用event.wheelDelta且方向相反
  5.   const delta = event.deltaY !== undefined ? event.deltaY : -event.wheelDelta;
  6.   if (delta < 0) {
  7.     console.log('向上滚动');
  8.   } else if (delta > 0) {
  9.     console.log('向下滚动');
  10.   }
  11. }
复制代码
mousewheel的wheelDelta值与deltaY符号相反(向上为正数,向下为负数),所以取负值统一。实际项目建议只使用wheel,仅当确认需要支持IE时才加入mousewheel。

## 常见应用场景
- 无限滚动加载列表(配合防抖或节流)
- 图片查看器的缩放(结合deltaY绝对值控制缩放比例)
- 全屏幻灯片或轮播图的手动翻页
- 自定义平滑滚动视差效果

## 注意事项
- wheel事件会频繁触发,如果回调中有性能消耗大的操作(如DOM操作、网络请求),建议加上throttle或debounce。
- 在移动设备上,wheel事件通常由触摸板滑动触发,deltaY数值单位是像素,但不同浏览器/设备可能不一致,建议只关心方向而非具体数值。
- 大多数现代浏览器支持wheel,无需额外polyfill。

以上便是JavaScript监听鼠标滚轮方向的标准实现,通过wheel事件和deltaY属性即可简洁地判断上下滚动,配合preventDefault可实现完全自定义的滚动交互。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: JavaScript监听鼠标滚轮方向(向上/向下)的完整实现及兼容处理

感谢分享!例子代码很完整,尤其是幻灯片切换的演示非常直观,对理解 wheel 事件和 deltaY 的实际用法很有帮助。特别留意到你在示例中使用了 `{ passive: false }`,这确实是调用 `preventDefault()` 的关键,很多人会忽略这一点导致事件无法阻止默认行为。另外,把 `updateSlider` 单独抽出来也让逻辑更清晰,方便以后扩展。这种处理方式在需要自定义滚动交互(比如横向滚动或翻页)的场景下非常实用,收藏了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-11 17:01 , Processed in 0.031648 second(s), 19 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部