现代浏览器中的鼠标滚轮事件

IT技术 javascript mousewheel
2021-01-30 23:51:14

我想为鼠标滚轮事件使用干净漂亮的 JavaScript,只支持最新版本的常见浏览器,没有过时版本的遗留代码,没有任何 JS 框架。

这里很好地解释鼠标滚轮事件如何为当前最新版本的浏览器简化它?

我无法访问所有浏览器来测试它,所以caniuse.com对我有很大帮助。唉,那里没有提到鼠标滚轮。

根据德里克的评论,我写了这个解决方案。它对所有浏览器都有效吗?

someObject.addEventListener("onwheel" in document ? "wheel" : "mousewheel", function(e) {
  e.wheel = e.deltaY ? -e.deltaY : e.wheelDelta/40;
  // custom code
});
3个回答

干净简单:

window.addEventListener("wheel", event => console.info(event.deltaY));

浏览器可能会返回不同的 delta 值(例如,Chrome 返回+120(向上滚动)或-120(向下滚动)。标准化它的一个好技巧是提取其符号,有效地将其转换为+1/ -1

window.addEventListener("wheel", event => {
    const delta = Math.sign(event.deltaY);
    console.info(delta);
});

参考:MDN

我仍然无法在这里重现它。也许不同的操作系统?我正在 Ubuntu 18.04 上尝试。另外,您是否同时运行任何额外的代码?无论如何,MDN提到传递第三个参数{ passive: true }可以addEventListener()解决问题,以防您不需要event.preventDefault(). 如果你这样做了,看起来你无能为力(查看评论中抱怨的人)。
2021-03-18 23:51:14
我更愿意保留wheelDelta 的绝对值来检测滚动速度。是否有任何公式可以在浏览器之间标准化?
2021-04-01 23:51:14
有趣的。我正在使用 Chrome 68,但没有看到此警报。@DerkJanSpeelman 您确定要测试与上述完全相同的代码吗?我只是尝试了两个版本(有和没有 delta 符号提取),但无法重现您所看到的内容。
2021-04-01 23:51:14
这确实会在控制台中发出警报:[Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive. See chromestatus.com/feature/5745543795965952
2021-04-10 23:51:14
不幸的是,如果您想使用绝对值,则没有公式。您必须依赖某种表格,其中包含每个浏览器/操作系统组合的经验值。对于普通鼠标,wheelDelta无论您滚动多快它始终是固定的,因此可以按照我上面的建议进行操作。但是,例如,如果您想在触控板上捕捉灵敏度(我猜这就是您要找的东西),那么您就拥有自己的设备。我们只是希望这个值在未来能够跨浏览器标准化。
2021-04-12 23:51:14

这是一篇描述这一点的文章,并给出了一个例子:

http://www.sitepoint.com/html5-javascript-mouse-wheel/

相关代码,减去给出的调整图像大小的具体示例:

var myitem = document.getElementById("myItem");
if (myitem.addEventListener)
{
    // IE9, Chrome, Safari, Opera
    myitem.addEventListener("mousewheel", MouseWheelHandler, false);
    // Firefox
    myitem.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
}
// IE 6/7/8
else
{
    myitem.attachEvent("onmousewheel", MouseWheelHandler);
}

function MouseWheelHandler(e)
{
    // cross-browser wheel delta
    var e = window.event || e; // old IE support
    var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));

    return false;
}
优秀的答案。需要更多的关注。关于这个问题很多不完整的答案,
2021-03-24 23:51:14
这似乎是一个已弃用的事件,已从许多浏览器中删除。现在要使用的事件是“WheelEvent”(developer.mozilla.org/en-US/docs/Web/API/WheelEvent
2021-04-01 23:51:14
这对于旧浏览器支持很有用,特别是 IE 根本不支持 Math.sign,但支持 Math.max 和 Math.min。caniuse.com/?search=Math.sign
2021-04-11 23:51:14

这也适用于 Firefox、Chrome 和 Edge:

window.addEventListener("wheel", function(e) {
    var dir = Math.sign(e.deltaY);
    console.log(dir);
});