[Javascript] 単純にmouseイベントをtouchイベントに置き換えたら苦労した話

2020年5月11日

Javascript テクノロジー プログラミング

t f B! P L
効率化を考えるのが好きだけど、人にそれを押し付けると嫌がられることもわかっている、ユゲタです。

本日のIT謎掛け

「マウスイベント」とかけまして・・・ 「あだち充の数多い漫画」と、ときます。 そのココロは・・・ (登場人物が)ほぼタッチと同じです。

webサービスのスマートフォン対応

PCのwebブラウザで閲覧・操作するサービスを、スマートフォン対応させる時に、ほとんどの人が「レスポンシブデザイン」を考えるだけですが、 マウスイベント操作をタッチイベント操作に置き換えて、それに伴うユーザーインターフェイスの変更も必要になることは、実際に、デザイン構築が完了して、実際に触ってみてから気がつくことが多いです。 今回のブログは、自分の備忘録も含めて、PCサービスをスマホサービスに対応させるために気をつける点をまとめてみました。

マウスイベントとタッチイベントの違い

マウスイベントの流れ onmousedown -> onmousemove -> onmouseup タッチイベントの流れ ontouchstart -> ontouchmove -> ontouchend 基本的に大きく分かるのが、上記イベントで、それを置き換えるだけでいいようにも思えますが、イベント取得する情報が大きく違っているので、ある程度の書き換えが必要になるでしょう。 受け取り側のeventでの注意点は以下の通り // マウスイベント element.addEventListener("mousedown" , function(event){ // マウスで押されたエレメントの取得 var target = event.target;   // マウス座標 var pageX = event.pageX; var pageY = event.pageY; // エレメント内のクリックされた座標 var offsetX = event.offsetX; var offsetY = event.offsetY; }); // タッチイベント element.addEventListener("touchstart" , function(event){ // マウスで押されたエレメントの取得 var target = event.touches[0].target;   // マウス座標 var pageX = event.touches[0].pageX; var pageY = event.touches[0].pageY; // エレメント内のクリックされた座標 // -> 取れません・・・orz }); 今回は、エレメントをドラッグさせる事が目的だったので、上記のイベント情報を取得したかったんですが、エレメント内のクリックがtouchイベントで取らないことが判明しました。 これは、非常にめんどくさいですね。 とりあえず、クリックしたエレメントのページ内座標を取得して、タッチ座標の差分値で、エレメントのドラッグ表示に対応しました。 ちなみに、エレメントのページ内座標は以下の関数で取得 //指定したエレメントの座標を取得 var element_pos = function(e){ //エレメント確認処理 if(!e){return null;} var t = document.body; //デフォルト座標 var pos={x:0,y:0}; do{ //指定エレメントでストップする。 if(e == t){break} //対象エレメントが存在しない場合はその辞典で終了 if(typeof(e)=='undefined' || e==null){return pos;} //座標を足し込む pos.x += e.offsetLeft; pos.y += e.offsetTop; } //上位エレメントを参照する while(e = e.offsetParent); //最終座標を返す return pos; };

イベント起動で気をつける点

イベントリスナーへの登録の際に、PCとスマートフォンを判別するには、以下のように行います。 // pc if(typeof window.ontouchstart === "undefined"){ element.addEventListener("mousedown" , function(event){...}); } // smartphone else{ element.addEventListener("touchstart" , function(event){...}); } "window.ontouchstart"が、存在するかどうかを判定するだけです。 同時に登録してもいいんですが、今現在はGoogleChromeブラウザでしか確認できていないので、自己責任にて行ってくださいませ。

その他の注意点

他にも、clickイベントは、同じように機能するのですが、そもそもPCとスマートフォンでは、マウスとタッチの違いは結構な操作感の違いがあるので、サービスによっては、方式自体を変更しなければいけない場合などもあるので、しっかりとイメージしておく必要があります。 また、CSSのhoverは、スマートフォンでは機能しないのですが、クリックした際に、hoverイベントが発動するという特性があるので、インターフェイスチャックは欠かさず行っておきましょう。 当たり前ですが、mouseoverやmouseoutに該当する機能もスマートフォンには存在しないので、ツール系サービスの場合などは、操作方法をかなり検討しないと、簡単に変更できるとタカを括っていると、僕みたいに痛い目を見ますよ!!!!

このブログを検索

プロフィール

自分の写真
プログラミングとサーバーを心の底から楽しむクリエーターです。 経営者であり、開発者でもありますが、得意としているのは、アイデア創出で、出来高は無限大です。

ブログ アーカイブ

QooQ