Created
July 2, 2017 07:12
-
-
Save ln-north/a3c29d1921a77f941e456c64c0902a2a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (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