Skip to content

Instantly share code, notes, and snippets.

@ln-north
Created July 2, 2017 07:12
Show Gist options
  • Select an option

  • Save ln-north/a3c29d1921a77f941e456c64c0902a2a to your computer and use it in GitHub Desktop.

Select an option

Save ln-north/a3c29d1921a77f941e456c64c0902a2a to your computer and use it in GitHub Desktop.
(function(){
//要素の取得
var elements = document.querySelectorAll("body > *");
//要素内のクリックされた位置を取得するグローバル(のような)変数
var x;
var y;
//マウスが要素内で押されたとき、又はタッチされたとき発火
for(var i = 0; i < elements.length; i++) {
elements[i].style.cursor = "move";
elements[i].addEventListener("mousedown", mdown, false);
elements[i].addEventListener("touchstart", mdown, false);
}
//マウスが押された際の関数
function mdown(e) {
//クラス名に .drag を追加
this.classList.add("drag");
//タッチデイベントとマウスのイベントの差異を吸収
if(e.type === "mousedown") {
var event = e;
} else {
var event = e.changedTouches[0];
}
//要素内の相対座標を取得
x = event.pageX - this.offsetLeft;
y = event.pageY - this.offsetTop;
this.style.position = "absolute";
this.style.top = x;
this.style.left = y;
//ムーブイベントにコールバック
document.body.addEventListener("mousemove", mmove, false);
document.body.addEventListener("touchmove", mmove, false);
}
//マウスカーソルが動いたときに発火
function mmove(e) {
//ドラッグしている要素を取得
var drag = document.getElementsByClassName("drag")[0];
//同様にマウスとタッチの差異を吸収
if(e.type === "mousemove") {
var event = e;
} else {
var event = e.changedTouches[0];
}
//フリックしたときに画面を動かさないようにデフォルト動作を抑制
e.preventDefault();
//マウスが動いた場所に要素を動かす
drag.style.top = event.pageY - y + "px";
drag.style.left = event.pageX - x + "px";
//マウスボタンが離されたとき、またはカーソルが外れたとき発火
drag.addEventListener("mouseup", mup, false);
document.body.addEventListener("mouseleave", mup, false);
drag.addEventListener("touchend", mup, false);
document.body.addEventListener("touchleave", mup, false);
}
//マウスボタンが上がったら発火
function mup(e) {
var drag = document.getElementsByClassName("drag")[0];
//ムーブベントハンドラの消去
document.body.removeEventListener("mousemove", mmove, false);
drag.removeEventListener("mouseup", mup, false);
document.body.removeEventListener("touchmove", mmove, false);
drag.removeEventListener("touchend", mup, false);
//クラス名 .drag も消す
drag.classList.remove("drag");
}
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment