hammer.js
https://hammerjs.github.io/
上記を使用し、動かせる要素の大きさをピンチイン、アウトで変えられるようにしたいと思っています。ネットでいただいたコードをもとに勉強していますので、
1.コードに対する私の理解が正しいか判定をお願いします。
ただしhammerのパンはもっさりしているので、パンに関してはjquery.pep.jsを使いたいです。非常にぬるぬるで気に入っています。これを複合した時にうまく動かない状態(後述)があるので、
2.解決策があれば教えてください。
html
1<div id="panPinch"> 2 <img class="pep" id="panPinchElm" src="img/1.jpg" style="height:100px; z-index:2;"> 3 </div>
理解が正しいか判定してほしいコードは以下。
javascript
1var $tgPanPinchArea = document.getElementById(area_id), 2 $jqTgPanPinchArea = $($tgPanPinchArea), 3 $tgPanPinchElm = document.getElementById(elem_id), 4 $jqTgPanPinchElm = $($tgPanPinchElm), 5 $hammerObj = new Hammer($tgPanPinchElm), 6 $hammerObj2 = new Hammer($tgPanPinchArea), 7 pinchTime = false, 8 $pinchTimer = {}; 9 $hammerObj.get("pinch").set({ enable: true }); 10 $jqTgPanPinchElm.css("transform", "scale(1)"); 11 12$hammerObj.on("pinch", function (event) { 13 event.preventDefault ? event.preventDefault() : (event.returnValue = false); 14 if (!pinchTime) { 15 //start 16 pinchTime = event.timeStamp; 17 var preScale = String($jqTgPanPinchElm.css("transform")).replace("matrix(", ""); 18 preScale = preScale.replace(")", ""); 19 preScale = preScale.split(","); 20 preScale = Math.sqrt(preScale[0] * preScale[0] + preScale[1] * preScale[1]); 21 $jqTgPanPinchArea.data("preScale", preScale).data("scale", event.scale); 22 } else { 23 //move 24 if ($pinchTimer) clearTimeout($pinchTimer); 25 $jqTgPanPinchElm.css("transform", "scale(" + ($jqTgPanPinchArea.data("preScale") + (event.scale - $jqTgPanPinchArea.data("scale"))) + ")"); 26 $pinchTimer = setTimeout(function () { 27 //end 28 pinchTime = false; 29 }, 100); 30 } 31 });
ピンチイベントが始まったタイミングで、先にhammerに紐づけしている$jqTgPanPinchElmのtransform内容を取得。中身を「、」「)」等余計なものを整形し、scaleとして正式に取得。要素の土台となっている$jqTgPanPinchAreaにprescaleやscaleといったプロパティ(?)を与え、そこに実際の数値を入れてあげる。
ピンチイベントが終わったら、元の座標に「動いた(event)分のscaleから元のscaleを引いた数値」(つまり拡大縮小した分)を足して、それを要素のcssのtransformのscaleに返してあげる。
以上のような認識でよいでしょうか。判定をお願いします。
以下は抱えている問題。
イメージ的には、台の上に要素があり、ピンチによる大きさ変更は台の目盛りに依存していると考えています。ところがパン動作を別プラグインのpepに任せると、移動した後の台上の目盛りがjquery内の属性キャッシュにない状態なので、移動後ピンチ動作をすると小刻みに今の場所と元の場所をワープし続ける描写になってしまいます。
pepで移動した後、その状態の座標(?)、台の目盛り(?)をプッシュすればよいかとも思いましたが、pepの記載方法が
pep
1$(document).ready(function(){ 2 $('.pep').pep(); 3 });
だけなのでお手上げでした。
上記の私の理解が正しければピンチインアウトは土台となるエリアに依存しますが、依存しないor上記を修正でなにかよい方法はありますでしょうか。
よろしくお願いします。
あなたの回答
tips
プレビュー