简体   繁体   English

可拖动效果在 Javascript 中不起作用

[英]Draggable effect doesn't work in Javascript

I have the follow code to make the div to become draggable:我有以下代码使div变得可拖动:

 let div = document.querySelector('div') div.onmousedown = function() { div.addEventListener('mousemove', move, true) } window.onmouseup = function() { window.removeEventListener('mousemove', move, true) } function move(e) { this.style.position = 'absolute' this.style.top = e.clientY + 'px' this.style.left = e.clientX + 'px' }
 div { background: red; width: 100px; height: 100px; }
 <div></div>

I am not sure why, this code doesn't work properly as I expected.我不知道为什么,这段代码不能像我预期的那样正常工作。

Sometimes, when I just hover the div , it position will also change and that is what I don't expect.有时,当我只是 hover div时,它 position 也会改变,这是我没想到的。 I checked the code for several times, but I didn't define the mouseover effect.我检查了几次代码,但我没有定义mouseover效果。

Could anyone tell me what I did wrong and how to fix it?谁能告诉我我做错了什么以及如何解决?

Thanks for any responds!感谢您的任何回复!

You have to remove the event listener from the div, not the window:您必须从 div 中删除事件侦听器,而不是 window:

I also centered the div when the user is dragging it, so the mouse has no chance to leave the div.当用户拖动它时,我也将 div 居中,因此鼠标没有机会离开 div。

 let div = document.querySelector('div'); function move(e) { this.style.position = 'absolute' this.style.top = e.clientY - (this.offsetHeight / 2) + 'px' this.style.left = e.clientX - (this.offsetWidth / 2) + 'px' } div.addEventListener('mousedown', function() { this.addEventListener('mousemove', move, true); }); window.addEventListener('mouseup', function() { div.removeEventListener('mousemove', move, true); });
 div { background: red; width: 100px; height: 100px; }
 <div></div>

There were two issues,有两个问题,

  1. You were removing the event lister from the window, not on the div.您正在从 window 中删除事件列表器,而不是在 div 上。
  2. You need to consider the offset values to correctly position the div when moving.您需要考虑偏移值以在移动时正确 position div。

 let div = document.querySelector('div') let offsetX = ""; let offsetY = ""; div.onmousedown = function(e) { var domRect = this.getBoundingClientRect(); offsetX = e.clientX - domRect.left; offsetY = e.clientY - domRect.top; div.addEventListener('mousemove', move, true) } window.onmouseup = function() { div.removeEventListener('mousemove', move, true) } function move(e) { this.style.position = 'absolute' this.style.top = e.clientY - offsetY + 'px' this.style.left = e.clientX - offsetX + 'px' }
 #my-div { background: red; width: 100px; height: 100px; }
 <div id="my-div"></div>

 dragElement(document.getElementById("mydiv")); function dragElement(elmnt) { var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; if (document.getElementById(elmnt.id + "header")) { document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown; } else { elmnt.onmousedown = dragMouseDown; } function dragMouseDown(e) { e = e || window.event; e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e = e || window.event; e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; } function closeDragElement() { document.onmouseup = null; document.onmousemove = null; } }
 #mydiv { position: absolute; z-index: 9; background-color: #f1f1f1; text-align: center; border: 1px solid #d3d3d3; } #mydivheader { height: 100px; width: 100px; cursor: move; z-index: 10; background-color: #2196F3; color: #fff; }
 <h1>Draggable DIV Element</h1> <div id="mydiv"> <div id="mydivheader"></div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM