2015/12/03
マウスとタッチのイベントはHammer.jsが便利
最近ではPC、スマホの両方に対応したレスポンシブのサイトがほとんど当たり前のようになってきています。
サイトを作るときに、スマホのアプリのような操作性を求められることも増えて消えいます。
そういったとき、JavaScriptで大変になってくるのがマウスとタッチのイベントによる操作です。
私の場合、今まではjQueryによってイベントを取得し、
PCとタッチデバイスでイベントを振り分けて・・・といった方法を使っていましたが、
HTMLの要素が入り組んでいる場合、振り分けが煩雑になり、操作しきれなくなる場合がありました。
さらに、IEでは10,11で、タッチに対応していますが、
他のブラウザで標準化されているtoucheventではなく、pointerという独自のイベントを扱う必要があり、
その振り分けも別で必要になります。
こういった問題を全て解決してくれるのが、今回ご紹介するHammer.jsです。
Hammer.jsでは、デバイスやブラウザを選ばず、
タッチのイベントとしてひとまとめにして、イベントを扱うことができるようになります。
↓こちらはHammer.jsを使ったデモです
※2015.12.04追記:
IE、Edge、Androidだとタップの感度があまり良くないようです・・・
使い方
- Hammer.jsをダウンロード、設置し、読み込む
- Hammer.jsの初期設定
- Hammer.jsの各イベントの操作
1. Hammer.jsをダウンロード、設置し、読み込む
↑こちらの公式サイトの「Hammer.min.js」というところをクリックしてダウンロードします。
ダウンロードしたら、HTMLで以下のように読み込みます。
1 | <script src="js/hammer.min.js"></script> |
2. Hammer.jsの初期設定
読み込めたら、JavaScriptを記述します。
まずはクリック&タッチの対象となる要素をID指定し、Hammer.jsのオブジェクトを読み込みます。
今回はより使いやすくするため、jQueryも合わせて使っていますが、jQueryを読み込まなくても使うことはできます。
1 2 3 4 5 6 7 8 9 10 | $(function() { //Hammer.jsオブジェクトの読み込み var $exampleElm = document.getElementById("example"), $hammerObj = new Hammer($exampleElm), $jqExampleElm = $($exampleElm); $hammerObj.get("pan").set({ enable: true }); $hammerObj.get("pinch").set({ enable: true }); $hammerObj.get("tap").set({ enable: true }); $hammerObj.get("swipe").set({ enable: true }); }); |
3. Hammer.jsの各イベントの操作
パン(ドラッグ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //pan event $hammerObj.on("pan",function(event) { if(event.isFinal) { //end panTime = false; $jqTgPanPinchArea.data("down", false); //パンが終わったときの操作 } else { if(!panTime) { //start $jqExampleElm.data("down", true); //パンを始めたときの動作 } else { //move if ($jqExampleElm.data("down") == true) { //パンしている途中の動作 } } } }); |
ピンチ(タッチデバイスのみ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var panTime = false, pinchTime = false, $pinchTimer = {}; //pinch event $hammerObj.on("pinch",function(event) { event.preventDefault ? event.preventDefault() : (event.returnValue = false); if(!pinchTime) { //start pinchTime = event.timeStamp; //ピンチを始めたときの動作 } else { //move if($pinchTimer) clearTimeout($pinchTimer); //ピンチをしている途中の動作 $pinchTimer = setTimeout(function() { //end pinchTime = false; //ピンチが終わったときの動作 }, 100); } }); |
タップ(クリック)
1 2 3 | $hammerObj.on("tap", function(event) { //タップしたときの動作 }); |
スワイプ(タッチデバイスのみ)
1 2 3 4 5 6 7 | //swipe $hammerObj.on("swipeleft", function(event) { //左へスワイプした時の動作 }); $hammerObj.on("swiperight", function(event) { //右へスワイプした時の動作 }); |
細かなイベントの情報は、DEMOを参考にしていただければと思います。
是非ご利用下さい。
公式のDocument
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE