hammer的初始化及移動端各種滑動


前言:本人對hammer了解不是很多,早做項目時遇到了手機端的一些滑動事件,特此分析下hammer的某些屬性。

hammer.js是一款開源的移動端腳本框架,他可以完美的實現在移端開發的大多數事件,如:點擊、滑動、拖動、多點觸控等事件。Hammer.js不需要依賴任何其他的js框架,並且整個框架非常小,v2.0.4版本只有3.96kb。

1、hammer.js引用

可直接引入文件,也可以引入CDN地址。在這里,為了方便,我引入了JQuery框架。

hammer的在線CDN地址為:<script src="http://eightmedia.github.com/hammer.js/hammer.js"></script>

2.hammer的事件綁定

hammer的事件綁定方法是新建一個Hammer對象,並傳入要操作的DOM,必須使用原始DOM,即使用這兩種方法獲取DOM。

    var hammerObj=new Hammer(document.getElementById('main'));
    var hammerObj=new Hammer($('#main').get(0));

3、hammer支持的事件

pan事件

主要支持在當前dom區域內的一個手指放下並移動事件,即屏幕滑動事件,其中包括左滑動、右滑動、上滑動、下滑動,該事件還可以對以下事件進行監聽或處理:

panstart:拖動開始、panmove:拖動過程、panend:拖動結束、pancancel:拖動取消、panleft:向左拖動、panright:向右拖動、panup:向上拖動、pandown:向下拖動

panstart事件

會在event對象中輸出滑動開始的坐標

panmove事件

一次滑動會觸發多次panmove事件,會在direction中輸出方向,當direction等於16時,為向下滑動,當direction等於8時,為向上滑動,當direction等於4時,為向右滑動,當direction等於2時,為向左滑動。

panend事件

滑動結束,一次滑動只會執行一次,同樣在direction中輸出方向,當direction等於16時,為向下滑動,當direction等於8時,為向上滑動,當direction等於4時,為向右滑動,當direction等於2時,為向左滑動。

pancancel事件

滑動取消,不知道何時觸發。

panleft事件

向左滑動,一次滑動多次觸發,其中垂直上下滑動不會觸發,滑動時向左有一定偏移量的時候會觸發。

panright事件

向右滑動,一次滑動多次觸發,其中垂直上下滑動不會觸發,滑動時向右有一定偏移量的時候會觸發。

panup事件

向上滑動,一次滑動多次觸發,其中水平左右滑動不會觸發,滑動時向上有一定偏移量的時候會觸發。

pandown事件

向下滑動,一次滑動多次觸發,其中水平左右滑動不會觸發,滑動時向下有一定偏移量的時候會觸發。

pinch事件

主要支持在當前dom區域內的多個手指(默認兩個手指,多個手指需要單獨設置)的相對移動和相向移動,該事件還可以對以下事件進行處理或者監聽:

pinchstart:多點觸控開始、pinchmove:多點觸控過程、pinchend:多點觸控結束、pinchcancel:多點觸控取消、pinchin:多點觸控時兩手指距離越來越近(縮小)、pinchout:多點觸控時兩手指距離越來越遠(放大),其觸發事件如pan事件。

    var hammertime = new Hammer(document.getElementById("body"));
    hammertime.add(new Hammer.Pinch());
    hammertime.on("pinchin", function (e) {
        swit();
    });

Press事件(長按)

 

主要支持在當前的dom區域內觸屏版本的點擊事件,這個事件相當於PC端的Click事件,該不能包含任何的移動,最小按壓時間為500毫秒,常用於我們在手機上用的“復制、粘貼”等功能,該事件分別對以下事件進行監聽並處理:

pressup:按壓事件離開時觸發

該事件不存在pressdown事件,具體是否支持按壓開始未知。

rotate事件

主要支持在當前的dom區域內,當兩個手指或更多手指成圓型旋轉時觸發(就像兩個手指擰螺絲一樣)。該事件分別對以下事件進行監聽並處理:

rotatestart:旋轉開始、rotatemove:旋轉過程、rotateend:旋轉結束、rotatecancel:旋轉取消  

swipe事件

主要支持在當前的dom區域內,一個手指快速的在觸屏上滑動。即我們平時用到最多的滑動事件。

swipeleft:向左滑動、swiperight:向右滑動、swipeup:向上滑動、swipedown:向下滑動

該事件只有在垂直上下滑動或水平左右滑動時觸發,即滑動時如果傾斜太大角度則不會觸發,觸發條件比較苛刻。

tap事件

主要支持在當前的dom區域內,一個手指輕拍或點擊時觸發該事件(類似PC端的click)。該事件最大點擊時間為250毫秒,如果超過250毫秒則按Press事件進行處理。

注意

默認情況下pinch和rotate事件是被禁止的,可以通過以下代碼開啟它。

hammertime.get('pinch').set({ enable: true });
hammertime.get('rotate').set({ enable: true });

一般情況下,瀏覽器是禁止屏幕上滑下滑事件的,因為瀏覽器默認的是上下滑動滾動頁面,若要允許識別器識別垂直方位或全部方位的 pan 和 swipe,可以這么寫:

hammertime.get('pan').set({ direction: Hammer.DIRECTION_ALL });
hammertime.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL });

 

另建議加上如下meta標簽,防止doubletap 或 pinch 縮放了viewport:

<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">

 

 

4、hammer滑動事件執行多次處理方法

在滑動事件執行后,我們一般會執行一個函數或者對dom進行操作,hammer事件多次執行,有時候會使函數多次執行或多次dom操作,由於我現在做的項目滑動之后執行的操作是需要一段時間的,所以采用設置一個全局變量作為函數執行開關的方法進行阻止,hammer應該提供了自己的方法,但我還不知道,望知道的小伙伴可以告訴我。

 1 <script type="text/javascript">
 2     var hammerObj=new Hammer(document.getElementById('main'));
 3     var _clock=true;
 4     function foo(){
 5         alert("OK");
 6         _clock=true;
 7     }
 8     hammerObj.on('panmove',function(event){
 9         if(_clock){
10             _clock=false;
11             foo();
12         }
13     });
14 </script>

 

但是這種方法只有在滑動后執行函數或操作存在一定時間才可以,比如alert()換成console.log()就會多次輸出,沒有辦法解決這個問題。

其實pan事件我們完全不需要使用panmove來實現,可以采用panend,同樣可以輸出不同方向然后進行判斷,但pinchin(捏合)事件同樣會多次執行,所以新的方法還需要尋找。。。

 

 

 

 

  

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM