JS滚轮事件详解

一、滚轮事件简介

JS滚轮事件是指当用户滚动鼠标滑轮时,触发的一类事件。这个事件可以在Web应用程序中应用,实现一些非常有用的功能,比如放大或缩小图像,滚动页面等。

JS滚轮事件在不同的浏览器中有不同的名称,比如Firefox和Chrome使用的是”wheel”事件,IE和Edge使用的是”mousewheel”事件。为了实现统一,基本上我们会同时使用两个事件。


// Firefox和Chrome使用的事件
window.addEventListener("wheel", function(event){
    console.log(event.deltaY);
});

// IE和Edge使用的事件
window.addEventListener("mousewheel", function(event){
    console.log(event.deltaY);
});

上述代码演示了如何监听滚轮事件,并打印出其中垂直方向的滚动距离。deltaY的值为正表示向上滚动,为负表示向下滚动。

二、滚轮事件的兼容性处理

由于不同的浏览器有不同的滚轮事件名称和相应的属性,所以要对兼容性进行处理,保证代码在不同的浏览器中都能够正常工作。


function addWheelListener(elem, callback) {
  if (elem.addEventListener) {
    if ('onwheel' in document) {
      // IE9+, FF17+, Ch31+
      elem.addEventListener("wheel", callback);
    } else if ('onmousewheel' in document) {
      // legacy events for older browsers
      elem.addEventListener("mousewheel", callback);
    } else {
      // Firefox 16-
      elem.addEventListener("MozMousePixelScroll", callback);
    }
  } else { // IE8-
    elem.attachEvent("onmousewheel", callback);
  }
}

// 使用方法:
addWheelListener(window, function(event){
    console.log(event.deltaY);
});

上述代码演示了如何使用一个公用的滚轮事件监听方法addWheelListener,以在不同浏览器中通用。该函数由Scott O’Hara在GitHub上公开。主要思路是检查浏览器是否支持”wheel”事件和”mousewheel”事件,如果都不支持,则使用”MozMousePixelScroll”事件(在Firefox早期版本中使用)。

三、禁止默认滚动行为

JS滚轮事件默认会触发浏览器的滚动,也就是说,当用户使用鼠标滚轮时,页面也会滚动。然而,在某些情况下,我们可能需要禁止默认滚动行为,比如在自定义滚动条时,需要通过JS来实现滚动,并禁止浏览器的默认行为。


// 阻止浏览器窗口默认滚动
window.addEventListener("wheel", function(event){
    event.preventDefault(); // 阻止默认滚动
});

// 阻止某个元素的默认滚动
var elem = document.getElementById("my-elem");
elem.addEventListener("wheel", function(event){
    event.preventDefault();
});

上述代码演示了如何使用preventDefault()方法来禁止默认滚动行为。如果希望禁止某个元素的滚动行为,可以将其滚动事件监听器绑定到该元素上,并调用preventDefault()方法来阻止其默认滚动行为。

四、滚动方向的控制

滚轮事件的deltaY值表示垂直方向的滚动距离,而deltaX则代表水平方向的滚动距离。有时我们需要限制滚动的方向,比如只能垂直滚动或水平滚动。这时,可以使用scrollLeft和scrollTop属性来控制滚动的方向。


// 禁止水平滚动,只允许垂直滚动
var elem = document.getElementById("my-elem");
elem.addEventListener("wheel", function(event){
    event.preventDefault();

    var delta = event.deltaY || event.detail || event.wheelDelta;

    if(delta < 0 && this.scrollTop  0 && this.scrollTop >= this.scrollHeight - this.offsetHeight) return;

    this.scrollTop += (delta < 0 ? -30 : 30);
    // 滚动30px高
});

上述代码演示了如何在一个元素上实现垂直滚动,同时禁止水平滚动。通过监听该元素的滚轮事件,在触发时计算出滚动方向,并根据滚动的位置来限制滚动的距离。这里使用了scrollTop和scrollHeight属性来计算元素是否滚动到顶部或底部。

五、滚动事件的节流

在处理大量滚轮事件时,如果没有做节流处理,可能会导致性能问题。为了避免这种情况发生,可以使用节流函数来限制滚轮事件的触发频率。


// 节流函数
function throttle(fn, delay) {
  var timer = null;
  return function () {
    var context = this, args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

// 应用到滚轮事件
var elem = document.getElementById("my-elem");
var throttleScroll = throttle(function(event){
    console.log(event.deltaY);
}, 100);

elem.addEventListener("wheel", throttleScroll); // 每100毫秒触发一次

上述代码演示了如何使用节流函数(throttle)来限制滚轮事件的触发频率。在设置一个节流的时间间隔后,每次触发滚轮事件时,将事件的处理函数传递给节流函数,节流函数会在特定时间间隔内执行一次事件处理函数。

总结

JS滚轮事件是Web开发中非常重要的一部分。了解JS滚轮事件的基本概念、兼容性处理、禁止默认滚动、滚动方向控制和节流处理,能够帮助我们更好地应用这个事件,实现各种应用程序的需求。在开发过程中,我们需要根据实际情况,对这些方面进行综合考虑,并不断优化其性能和交互体验。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:25
下一篇 2024-12-12 13:25

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • 抖音外放亲妈下葬事件的背后真相

    近期,一段抖音外放亲妈下葬的视频引发广泛关注和热议。不少人对这个事件感到震惊和愤怒,认为这种行为非常不尊重亲人,触犯了社会公德和家庭道德。但是,事情真相到底是什么呢?我们有必要从多…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27
  • 如何使用JS调用Python脚本

    本文将详细介绍通过JS调用Python脚本的方法,包括使用Node.js、Python shell、child_process等三种方法,以及在Web应用中的应用。 一、使用Nod…

    编程 2025-04-27
  • cc.director.on事件监听器

    本文将从多个方面详细介绍Cocos Creator中的cc.director.on事件监听器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    编程 2025-04-27
  • 如何反混淆美团slider.js

    本文将从多个方面详细阐述如何反混淆美团slider.js。在开始之前,需要明确的是,混淆是一种保护JavaScript代码的方法,其目的是使代码难以理解和修改。因此,在进行反混淆操…

    编程 2025-04-27
  • Python要学JS吗?

    Python和JavaScript都是非常受欢迎的编程语言。然而,你可能会问,既然我已经学了Python,是不是也需要学一下JS呢?在本文中,我们将围绕这个问题进行讨论,并从多个角…

    编程 2025-04-27

发表回复

登录后才能评论