mousewheel 取消_浅谈Mousewheel 事件的用法

当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到Mousewheel事件。其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+)中,都提供了 “mousewheel” 事件。但杯具的是 Firefox 3.5+ 却不支持此事件,不过庆幸 Firefox 3.5+ 中提供了另外一个等同的事件:”DOMMouseScroll” (事件和事件属性的测试案例)。

OK,我们现在已经知道了不同浏览器之间实现的差别,兼容代码如下:

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” 属性。

但经测试, 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);

事件和事件属性的测试案例:http://www.planabc.net/demo/event/mousewheel.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值