淺談 Mousewheel 事件
更新時(shí)間:2010年09月14日 08:48:29 作者:
當(dāng)需要制作轉(zhuǎn)動(dòng)鼠標(biāo)滾輪放大頁(yè)面字體這樣的交互效果時(shí),會(huì)用到 Mousewheel 事件。
其實(shí)在大多數(shù)瀏覽器(IE6, IE7, IE8, Opera 10+, Safari 5+)中,都提供了 “mousewheel” 事件。但杯具的是 Firefox 3.5+ 卻不支持此事件,不過慶幸 Firefox 3.5+ 中提供了另外一個(gè)等同的事件:”DOMMouseScroll” (事件和事件屬性的測(cè)試案例)。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
OK,我們現(xiàn)在已經(jīng)知道了不同瀏覽器之間實(shí)現(xiàn)的差別,兼容代碼如下:
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 是偽代碼,大家可以自行實(shí)現(xiàn)
mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
// object 也是偽代碼,你需要注冊(cè) Mousewheel 事件的元素
addEvent(object, mousewheel, function(event){
event = window.event || event;
// todo something
}, false);
我們?cè)倩氐揭獙?shí)現(xiàn)的交互效果上,現(xiàn)在還有其他一些問題需要來解決:
1. 頁(yè)面字體到底是放大還是縮小呢? ==> 鼠標(biāo)滾輪是向上滾動(dòng)還是向下滾動(dòng)呢?
2. 頁(yè)面字體縮放的倍數(shù)到底是多少呢? ==> 鼠標(biāo)滾輪滾動(dòng)的幅度大小是多少呢?
還好,我們可以通過 event 的某些屬性值得到這些信息:
1. “mousewheel” 事件中的 “event.wheelDelta” 屬性值:返回的值,如果是正值說明滾輪是向上滾動(dòng),如果是負(fù)值說明滾輪是向下滾動(dòng);返回的值,均為 120 的倍數(shù),即:幅度大小 = 返回的值 / 120。
2. “DOMMouseScroll” 事件中的 “event.detail” 屬性值:返回的值,如果是負(fù)值說明滾輪是向上滾動(dòng)(與 “event.wheelDelta” 正好相反),如果是正值說明滾輪是向下滾動(dòng);返回的值,均為 3 的倍數(shù),即:幅度大小 = 返回的值 / 3。
3. “mousewheel” 事件在 Opera 10+ 中卻是個(gè)特例,既有 “event.wheelDelta” 屬性,也有 “event.detail” 屬性。
注:上面第三點(diǎn),在《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.
但經(jīng)測(cè)試, Opera 9+ 和 Opera 10+ 中的 event.wheelDelta 屬性與其他瀏覽器中的表現(xiàn)完全一致,未發(fā)現(xiàn)異常與錯(cuò)誤,從接口角度來說,代碼中應(yīng)優(yōu)先使用 “event.wheelDelta” 屬性。
此時(shí)代碼如下:
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 是偽代碼,大家可以自行實(shí)現(xiàn)
mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
// object 是偽代碼,你需要注冊(cè) 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 是偽代碼,需要實(shí)現(xiàn)的縮放事件
delta > 0 ? zoomIn(delta): zoomOut(Math.abs(delta));
} , false);
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
OK,我們現(xiàn)在已經(jīng)知道了不同瀏覽器之間實(shí)現(xiàn)的差別,兼容代碼如下:
復(fù)制代碼 代碼如下:
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 是偽代碼,大家可以自行實(shí)現(xiàn)
mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
// object 也是偽代碼,你需要注冊(cè) Mousewheel 事件的元素
addEvent(object, mousewheel, function(event){
event = window.event || event;
// todo something
}, false);
我們?cè)倩氐揭獙?shí)現(xiàn)的交互效果上,現(xiàn)在還有其他一些問題需要來解決:
1. 頁(yè)面字體到底是放大還是縮小呢? ==> 鼠標(biāo)滾輪是向上滾動(dòng)還是向下滾動(dòng)呢?
2. 頁(yè)面字體縮放的倍數(shù)到底是多少呢? ==> 鼠標(biāo)滾輪滾動(dòng)的幅度大小是多少呢?
還好,我們可以通過 event 的某些屬性值得到這些信息:
1. “mousewheel” 事件中的 “event.wheelDelta” 屬性值:返回的值,如果是正值說明滾輪是向上滾動(dòng),如果是負(fù)值說明滾輪是向下滾動(dòng);返回的值,均為 120 的倍數(shù),即:幅度大小 = 返回的值 / 120。
2. “DOMMouseScroll” 事件中的 “event.detail” 屬性值:返回的值,如果是負(fù)值說明滾輪是向上滾動(dòng)(與 “event.wheelDelta” 正好相反),如果是正值說明滾輪是向下滾動(dòng);返回的值,均為 3 的倍數(shù),即:幅度大小 = 返回的值 / 3。
3. “mousewheel” 事件在 Opera 10+ 中卻是個(gè)特例,既有 “event.wheelDelta” 屬性,也有 “event.detail” 屬性。
注:上面第三點(diǎn),在《The onmousewheel event of JavaScript》一文中有這樣一段批注:
復(fù)制代碼 代碼如下:
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.
但經(jīng)測(cè)試, Opera 9+ 和 Opera 10+ 中的 event.wheelDelta 屬性與其他瀏覽器中的表現(xiàn)完全一致,未發(fā)現(xiàn)異常與錯(cuò)誤,從接口角度來說,代碼中應(yīng)優(yōu)先使用 “event.wheelDelta” 屬性。
此時(shí)代碼如下:
復(fù)制代碼 代碼如下:
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 是偽代碼,大家可以自行實(shí)現(xiàn)
mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
// object 是偽代碼,你需要注冊(cè) 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 是偽代碼,需要實(shí)現(xiàn)的縮放事件
delta > 0 ? zoomIn(delta): zoomOut(Math.abs(delta));
} , false);
相關(guān)文章
Bootstrap滾動(dòng)監(jiān)聽(Scrollspy)插件詳解
滾動(dòng)監(jiān)聽插件是用來根據(jù)滾動(dòng)條所處在的位置自動(dòng)更新導(dǎo)航項(xiàng)目, 顯示導(dǎo)航項(xiàng)目高亮顯示。這篇文章主要介紹了Bootstrap滾動(dòng)監(jiān)聽(Scrollspy)插件的相關(guān)資料,需要的朋友可以參考下2016-04-04js實(shí)現(xiàn)上一頁(yè)下一頁(yè)的效果【附代碼】
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)上一頁(yè)下一頁(yè)的效果【附代碼】。小編覺得非常不錯(cuò)?,F(xiàn)在分享給大家。希望能給大家一個(gè)參考。2016-03-03詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行
這篇文章主要介紹了詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10jstree創(chuàng)建無限分級(jí)樹的方法【基于ajax動(dòng)態(tài)創(chuàng)建子節(jié)點(diǎn)】
這篇文章主要介紹了jstree創(chuàng)建無限分級(jí)樹的方法,結(jié)合實(shí)例形式分析了jstree基于ajax結(jié)合asp.net后臺(tái)動(dòng)態(tài)創(chuàng)建子節(jié)點(diǎn)實(shí)現(xiàn)無限分級(jí)樹效果的相關(guān)步驟與操作技巧,需要的朋友可以參考下2016-10-10寫出更好的JavaScript程序之undefined篇(中)
前一篇我介紹了幾種廣為使用的利用undefined這個(gè)概念值的辦法,這一篇我會(huì)介紹一些不太常見的辦法,其中還包括一個(gè)很巧妙的,我個(gè)人覺得很值得推廣的辦法。2009-11-11淺談通過JS攔截 pushState和replaceState事件
下面小編就為大家?guī)硪黄獪\談通過JS攔截 pushState和replaceState事件。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07