このサイトを参考に、htmlオブジェクトをドラッグ&ドロップできるコードを組んでみました。
↓ソースコードです
html
1<!DOCTYPE html> 2<html> 3 4<head> 5 <style> 6 p { 7 border: solid 1px black; 8 width: 100px; 9 height: 100px; 10 } 11 </style> 12</head> 13 14<body> 15 16 <p id="p1" draggable="true">drag</p> 17 18 <script> 19 const doc = document.getElementById('p1') 20 doc.onmousedown = function (event) { 21 let shiftX = event.clientX - doc.getBoundingClientRect().left; 22 let shiftY = event.clientY - doc.getBoundingClientRect().top; 23 24 console.log(doc.getBoundingClientRect().left) 25 doc.style.position = 'absolute'; 26 doc.style.zIndex = 1000; 27 document.body.append(doc); 28 29 moveAt(event.pageX, event.pageY); 30 31 // ボールを(pageX、pageY)座標の中心に置く 32 function moveAt(pageX, pageY) { 33 doc.style.left = pageX - shiftX + 'px'; 34 doc.style.top = pageY - shiftY + 'px'; 35 } 36 37 function onMouseMove(event) { 38 moveAt(event.pageX, event.pageY); 39 } 40 41 // (3) mousemove でボールを移動する 42 document.addEventListener('mousemove', onMouseMove); 43 44 // (4) ボールをドロップする。不要なハンドラを削除する 45 doc.onmouseup = function () { 46 document.removeEventListener('mousemove', onMouseMove); 47 doc.onmouseup = null; 48 }; 49 50 }; 51 52 doc.ondragstart = function () { 53 return false; 54 }; 55 </script> 56</body> 57 58</html>
しかし、ドラッグを始めるとボックスが少し下にジャンプしてしまいます。
そして、ボックスの上付近をクリックしジャンプした結果カーソルからボックスが離れると、
ドロップを検知できず、永久に離せなくなってしまいます。
そのため、javascript4行目を
javascript
1let shiftY = event.clientY - doc.getBoundingClientRect().top + 16;
としなければジャンプさせないことができません。
(なぜ16かは不明ですが、1pxずつ確かめた結果ジャンプしないのが16でした)
参考サイトでは同じコードでもジャンプしていません。
ボックスのサイズを変更してもズレは16pxでした。
なにが原因で16pxのズレが生じているのかわかりますでしょうか。
追伸
もっとよいコードをご存じの方はそちらも教えていただけるとありがたいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/01 07:29