JS滾輪事件(mousewheel/DOMMouseScroll)了解
一、學無止境、溫故知新
//zxx: 本段與技術無關,一些很個人的吐槽,可以跳過
已經沒有了小學生時代過目不忘的記憶力了,很多自己折騰的東西、接觸的東西,短短1年之後就全然不記得了。比方說,完全記不得獲取元素與頁面距離的方法(getBoundingClientRect),或者是不記得現代瀏覽器下觸發DOM自訂事件的方法(dispatchEvent). 顯然,適當的溫習,翻閱以前的東西,或者自己空餘時間處理相關的東西還是有必要的。其實,細想,東西記不住是自己自身原因,在折騰的時候就沒有想方設法牢記(而不是透過反覆使用記住)。比方說getBoundingClientRect就是「得到客戶端矩形邊界」的意思,或是用邪惡記法來記住「割(g)逼(b)艹(c)軟(r)」。 dispatchEvent方法使用“3步驟”,“創建(createEvent)-初始(init*Event)-分派(dispatchEvent)”。
學習的腳步不能停止。一站到底的那些「變態」們也有不知道的東西,顯然,我們這些草輩,尤其年輕的自己,不知道的更多。誰年輕的時候沒有過或多或少 的迷茫,問自己“路在何方”,問自己“該做哪個方向”,無論你選擇的是什麼,學習的腳步是不能停止的。堅持堅持著,路自然就會清晰,你就會知道接下來該怎麼走了。只怕畏首畏尾,得過且過,年輕就是資本,義無反顧前行吧。
我憑著興趣走上現在的道路,完全是興趣學習(我喜歡這些,我要學),不是職業學習(做前端需要什麼,我就去學什麼)。工作的這些年,技術、產品的自 我沉浸不知不覺限制了自己的眼界,好在意識到問題的存在其實已經解決了問題的一半。這裡之所以會說這些是想提醒自己,萬萬不可矯枉過正,技術、產品的學習 還是主要的,只是要多多抬頭看看辦公室之外的世界(不是刷微博獲得的淺認識)。
昨天機緣巧合遇到“滾輪事件”,以前折騰“自定義滾動條”時候使用過滑鼠滾輪事件,不過這是基於MooTools已經兼容好的mousewheel事件實現的,如果要說出其中的實作機制,瀏覽器相容差異等,就傻眼了。學無止境,因此,查閱之,實踐之,整理之。
二、相容差異大全
滾輪事件的兼容性差異有些不拘一格,不是以往的IE8-派和其他派,而是FireFox派和其他派。
包括IE6在內的瀏覽器是使用onmousewheel,而FireFox瀏覽器一個人使用DOMMouseScroll. 經自己測試,即使現在FireFox 19下,也是不識onmousewheel。
一個最簡單的使用差異(body捲軸由內部一定高div撐開):
document.body.onmousewheel = function(event) {
event = event || window.event;
console.dir(event);
};
document.body.addEventListener("DOMMouseScroll", function(event ) {
console.dir(event);
});
以上輸出差異請見下方(IE7, IE10, Chrome, 以及FireFox,滑鼠向下捲動, win7)(可點選此頁面單獨查看表格內容):
三、相容的滾輪事件方法
知己知彼百戰百勝,知道了差異就知道如何處理這些差異。畢竟不是寫JS函式庫,我們這裡只處理滾動方向這塊的差異。
整合我們通常事件新增方法,於是有(下程式碼代號為addEvent.js):
/** * 简易的事件添加方法 */ define(function(require, exports, module) { exports.addEvent = (function(window, undefined) { var _eventCompat = function(event) { var type = event.type; if (type == 'DOMMouseScroll' || type == 'mousewheel') { event.delta = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; } //alert(event.delta); if (event.srcElement && !event.target) { event.target = event.srcElement; } if (!event.preventDefault && event.returnValue !== undefined) { event.preventDefault = function() { event.returnValue = false; }; } /* ......其他一些兼容性处理 */ return event; }; if (window.addEventListener) { return function(el, type, fn, capture) { if (type === "mousewheel" && document.mozHidden !== undefined) { type = "DOMMouseScroll"; } el.addEventListener(type, function(event) { fn.call(this, _eventCompat(event)); }, capture || false); } } else if (window.attachEvent) { return function(el, type, fn, capture) { el.attachEvent("on" + type, function(event) { event = event || window.event; fn.call(el, _eventCompat(event)); }); } } return function() {}; })(window); });
於是,我們就可以很從容使用mousewheel事件了。例如:
addEvent(dom, "mousewheel", function(event) { if (event.delta < 0) { alert("鼠标向上滚了!"); } });
相關程式碼實作如下,下面這個展示的就是平滑移動的核心程式碼們(代號為slide.js):
/** * 简易的列表左右滑动切换效果 * 鼠标事件是关键,因此,一些数值写死在方法中,纯测试用 */ define(function(require, exports, module) { var Event = require("/study/201304/addEvent.js"); var _move = function(ele, to, from) { // 动画实现 // ... }; return { index: 0, visible: 4, init: function(box) { // box指滚动的列表容器 var self = this , length = box.getElementsByTagName("li").length; Event.addEvent(box.parentNode, "mousewheel", function(event) { if (event.delta > 0 && self.index > 0) { // 往上滚 self.index--; } else if (event.delta < 0 && self.index < length - self.visible) { // 往下 self.index++; } else { return; } _move(box, -1 * self.index * 140); event.preventDefault(); }); } }; });
原理很簡單,滾輪改變,索引改變,也就是清單的最終位置改變,動畫到目標位置即可。
然後,demo頁面使用seajs簡單呼叫就可以了!
var $ = function(id) { return document.getElementById(id); }; seajs.use("/study/201304/slide.js", function(slide) { slide.init($("slideBox")); });
就結束了,一些具體細節,例如關於HTML部分,或是動畫的實作等,可以去demo等查看程式碼展示。
不過從效果來看,IE6以及IE7瀏覽器下的滾動並沒有hold頁面的滾動條,多番其他嘗試也是如此,希望可以有相關經驗的同行指點下,優化IE7/IE7瀏覽器下的體驗效果。
原本還想再增加一個自訂捲軸的demo的,一看時間,我勒個去,已經1:11:11了,好不吉利的數字啊,看了下程式設計師運勢萬年曆,今天不適宜寫demo。於是,結語睡覺。
推薦教學:《JS基礎教學》
以上是了解JS滾輪事件(mousewheel/DOMMouseScroll)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版