質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

199閲覧

jqueryプラグインhammer.jsの記述で理解が正しいか、解決策はあるか

Izumo1101

総合スコア49

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/05/19 13:19

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上記を修正でなにかよい方法はありますでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問