HTML/JavaScriptでDOMをドラッグ&ドロップで動かせるようにしたい
https://teratail.com/questions/4pnustw5rp458d
<!DOCTYPE html> <meta charset="utf-8"> <title></title> <style> p { border: solid 1px black; width: 100px; height: 100px; margin: 0; } </style> <body> <p>drag</p> <script> class A { draggable = false; diffX = null; diffY = null; #init = function (e) { ['mousedown','mouseup', 'mousemove', 'mouseout'].forEach (etype=>e.addEventListener (etype, this, false)); e.draggable = false; e.style.position = 'absolute'; }; constructor (target) { this.target = target; this.#init (target); } locate (x, y) { let s = this.target.style; s.top = (this.diffY + y) + 'px'; s.left = (this.diffX + x) + 'px'; } handleEvent (event) { switch (event.type) { case 'mousedown': this.draggable = true; let { top, left } = this.target.getBoundingClientRect (); let { clientX: mx, clientY: my} = event; this.diffX = (left - mx) | 0; this.diffY = (top - my) | 0; break; case 'mouseup' : case 'mouseout' : this.draggable = false; break; case 'mousemove': if (this.draggable) { let { pageX: x, pageY: y} = event; this.locate (x, y); } break; } } } let p = new A (document.querySelector ('p')); //_________________ {//蛇足 let p = document.createElement ('p'); for (let i = 1; i <= 12; i++) { let _p = p.cloneNode (true); let x = 600 + Math.sin (360/12*i*Math.PI/180)*300; let y = 320 - Math.cos (360/12*i*Math.PI/180)*300; document.body.appendChild (_p).append ('drag', i); _p.style.position = 'absolute'; _p.style.top = (y|0) + 'px'; _p.style.left = (x|0) + 'px'; new A (_p); } } </script>