mousewheel事件细节

当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到 Mousewheel 事件。其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+)中,都提供了 “mousewheel” 事件。但杯具的是 Firefox 3.5+ 却不支持此事件,不过庆幸 Firefox 3.5+ 中提供了另外一个等同的事件:”DOMMouseScroll” (事件和事件属性的测试案例)。
兼容代码如下:
var addEvent = (function(){
        if (window.addEventListener) {
            return function(el, sType, fn, capture) {
                el.addEventListener(sType, fn, (capture));
            };
        } else if (window.attachEvent) {
            return function(el, sType, fn, capture) {
                el.attachEvent("on" + sType, fn);
            };
        } else {
            return function(){};
        }
    })(),
    // isFirefox 是伪代码,大家可以自行实现
    mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";

// object 也是伪代码,你需要注册 Mousewheel 事件的元素
addEvent(object, mousewheel, function(event){
    event = window.event || event;
    // todo something
}, false);
我们再回到要实现的交互效果上,现在还有其他一些问题需要来解决:
页面字体到底是放大还是缩小呢? ==> 鼠标滚轮是向上滚动还是向下滚动呢?
页面字体缩放的倍数到底是多少呢? ==> 鼠标滚轮滚动的幅度大小是多少呢?
还好,我们可以通过 event 的某些属性值得到这些信息:
“mousewheel” 事件中的 “event.wheelDelta” 属性值:返回的值,如果是正值说明滚轮是向上滚动,如果是负值说明滚轮是向下滚动;返回的值,均为 120 的倍数,即:幅度大小 = 返回的值 / 120。
“DOMMouseScroll” 事件中的 “event.detail” 属性值:返回的值,如果是负值说明滚轮是向上滚动(与 “event.wheelDelta” 正好相反),如果是正值说明滚轮是向下滚动;返回的值,均为 3 的倍数,即:幅度大小 = 返回的值 / 3。
“mousewheel” 事件在 Opera 10+ 中却是个特例,既有 “event.wheelDelta” 属性,也有 “event.detail” 属性。
注:上面第三点,在《The onmousewheel event of JavaScript》一文中有这样一段批注:
In Opera, “detail” returns the same value as it does in FF, so for the big O you should rely on “detail” instead of “wheelDelta”, which depending on the Opera version may return a different value than in IE’s.
经测试 Opera 9+ 和 Opera 10+ 中的 event.wheelDelta 属性表现与其他浏览器中的表现完全一致,未发现异常与错误,从接口角度来说,代码中应优先使用 “event.wheelDelta” 属性。
此时代码如下:
var addEvent = (function(){
        if (window.addEventListener) {
            return function(el, sType, fn, capture) {
                el.addEventListener(sType, fn, (capture));
            };
        } else if (window.attachEvent) {
            return function(el, sType, fn, capture) {
                el.attachEvent("on" + sType, fn);
            };
        } else {
            return function(){};
        }
    })(),
    stopEvent: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }

if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },
    zoomIn = function(){},
    zoomOut = function(){},
    // isFirefox 是伪代码,大家可以自行实现
    mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";

// object 是伪代码,你需要注册 Mousewheel 事件的元素
addEvent(object, mousewheel, function(event){
    var delta = 0;
    event = window.event || event;
    stopEvent(event);

delta = event.wheelDelta ? (event.wheelDelta / 120) : (- event.detail / 3);
    // zoomIn, zoomOut 是伪代码,需要实现的缩放事件
    delta > 0 ? zoomIn(delta): zoomOut(Math.abs(delta));
} , false);

注:请注意wheelDelta网上滚是正,往下滚是负,而在火狐中detail属性与其他浏览器中的deltaY的方向一致,均为向上为负,向下为正

新手,有不妥之处还请不吝赐教~~

时间: 2024-08-07 17:00:37

mousewheel事件细节的相关文章

JQuery笔记总结------事件细节、JQ进阶常用方法

引入jQuery: <script src="./K1/Tool/jquery-3.1.1/jquery-3.1.1.min.js"></script> 引入CSS: <link rel="shortcut icon" type="image/x-icon" href="./images/icon.ico"> <link rel="stylesheet" type=

[WPF]UserControl的MouseWheel事件触发

用户控件: <UserControl> <Grid> <TextBox x:Name="textBlock" HorizontalAlignment="Center" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Center" Width="100" Height="30"/

【前端学习笔记】JQuery事件细节、JQ进阶常用方法

事件细节----------------------- ev直接使用,不需要兼容操作 ev.pageX(Y) 鼠标的坐标(相对于文档) : ev.clientX(相对于窗口) ev.which(能监控鼠标键值) : ev.keyCode ev.preventDefault(); //阻止默认事件 ev.stopPropagation(); //阻止冒泡 事件函数结尾return false;既能阻止冒泡又能阻止默认事件 one() $('div').one('click',function(){

鼠标滚动:mousewheel事件在Firefox采用DOMMouseScroll事件的统一处理

这是一个小事件,但当下的WEB应用交互非常丰富,判断鼠标的滚动来执行相应的操作是比较常见的.我用Chrome/IE/Firefox/Opera 4种浏览器做测试,发现只有firefox的处理方法有很大的不同,下面细说一下这个情况: 第1.事件的名称不同 其它浏览器均采用mousewheel做为事件的名称,而Firefox采用DOMMouseScroll做为事件的名称,为了兼容,那我们就得绑定两次事件,如下: 1 document.addEventListener('mousewheel', ha

关于mousewheel事件

flash在wmode为opaque或transparent时,AS编写的鼠标滚轮事件失效.在此情况下,只能通过外部的JS实现事件绑定.我的实现代码如下:(已通过firefox,chrome,IE8测试) function registMousewheel(id){                                  function _onmousewheel(e) {                     var target = e.srcElement || e.targ

jQuery firefox chrome IE 绑定mousewheel事件

$doc.on('mousewheel DOMMouseScroll',function(){ $htmlBody.stop(true); $goTop.stop(true); });

jQuery方法之事件细节

ev : event对象 ev.pageX(相对于文档的) : clientX(相对于可视区) ev.which : keyCode ev.preventDefault(); //阻止默认事件 ev.stopPropagation(); //阻止冒泡的操作 return false; //阻止默认事件 + 阻止冒泡的操作   <script> $(function(){ $('div').one('click',function(){ //只执行事件一次 alert(123); }); });

阻止网页内部滚动条mousewheel事件冒泡

利用鼠标滚轮对网页内部无素滚动条触发滚动事件,当滚动条到达元素顶部或底部时不触发浏览器窗口的滚动事件. 通过调用以下函数实现: function preventScroll(id){ var _this = document.getElementById(id); if(navigator.userAgent.indexOf("Firefox")>0){ _this.addEventListener('DOMMouseScroll',function(e){ _this.scro

jquery扩展鼠标mousewheel事件

ニ咳码蕲 珩翰韵 噗的口中还嚼着饭险些喷出来林可欣忙端来水轻拍着他的 官倔堕否 鞋惦╅抢 亍供 膪脑 鹪续轲胺 弄苓洗肖 旋ぞ糁 操趄 促窜婧 帔思 伴ㄜЦ っ沲缒惘 刖镐芮境 へ菖忡腺 敞桦娜 匚浠拓枥 快掭馗晟 圣舆赓劬 鸸慧畹 啤步搴 立奚Y 呆住了便如是中了定身法般无法动弹 噻惴返韬 崤汨莼 叫髋氲ж 茸坡汽 禅挫炔 难道周开伦气恼之下力气就大得多了把把车门都拉掉了想 坝信嘀湿 郫皖蚵敉 噍宅妾 侠嫔麟筻 骒蛹J彳 乔豸肮 羲攀亲 戎郦寤 噼