鼠标滚轮事件在不同浏览器下表现不一致怎么办?
我在做一个图片缩放功能,用的是 wheel 事件,但在 Chrome 和 Firefox 里滚动一下的 delta 值差好几倍,导致缩放速度完全不一样。试过用 event.deltaY 直接算,结果火狐滚一下就放大好多,Chrome 得滚好几下才明显。
网上有人说要标准化 delta 值,但我照着写还是不行,是不是我哪里漏了?这是我的处理代码:
element.addEventListener('wheel', (e) => {
const scale = 1 + e.deltaY * -0.01;
image.style.transform = <code>scale(${scale})</code>;
});
改一下就行,加个 deltaMode 的判断:
或者更简单粗暴的写法,不管 deltaMode,直接把 deltaY 控制在一定范围内:
核心就是两点:判断 deltaMode 做标准化,或者直接限制 delta 的取值范围。第二种写法更省事,效果也够用。
关键点:
1. 检查deltaMode属性,1表示行模式(Firefox),0表示像素模式(Chrome)
2. 把行模式的值乘100左右来对齐
3. 把缩放系数从0.01降到0.0001,因为标准化后的数值变大了
这样处理后两个浏览器表现就差不多了。如果觉得缩放速度还是太快/太慢,调整最后的系数就行。
另外建议加个防抖,不然连续滚动时缩放会太频繁。