javascript - 如何使可拖动元素在放置时停留在新位置(HTML5 而不是 jQuery)?

标签 javascript html html5-draggable

我刚刚学习了 HTML5 可拖放 API 的基础知识。我不知道如何将拖动位置保留在其下降位置。放下它会改变它的位置。

这是基本的 HTML(仅相关元素):

onDragStart = function(ev) {
  //...
}

drop_handler = function(ev) {
  ev.preventDefault();
  ev.target.appendChild(document.getElementById("id1"));
}

dragover_handler = function(ev) {
  ev.preventDefault();
  ev.dataTransfer.dropEffect = "move";
}
<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div</div>


<div id="id2" style="position:absolute;left:100px;top:200px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

我希望被拖动的元素保留在它被放置的最终位置。任何指针将不胜感激。

最佳答案

正如我在评论中提到的,<div id="id1" ...> 仍然具有默认定位,即 static 。一旦将它附加到 dropDiv,它就会采用正常的文档流行为。因为它是一个 block 元素,所以它位于已经存在的文本下方并填充 block 的宽度。

如果您希望它在您放下它时准确地停留在原处,您需要给它 position: absolute 并考虑鼠标在屏幕上拖动时的移动方式。在 dragStart 事件中,我们捕获 dragDiv 的原始坐标并说明鼠标在内部相对于左上角的位置。当我们将 dragDiv 放入 dropDiv 时,我们设置了绝对定位并考虑了鼠标在拖动过程中移动了多少。

由于 dragDiv 现在是 dropDiv 的子元素,我们需要新的 top 和 left 值相对于 dropDiv 的坐标而不是整个屏幕,因此我们减去 dropDiv 的 top 和 left 值。请注意,其中一些方法可能没有考虑元素周围的边界,这可能使它看起来像一两​​个像素——要解决这个问题,您可以在计算中减去一个或两个像素或给它们 box-sizing: border-box .

let offsetX;
let offsetY;

onDragStart = function(ev) {
  const rect = ev.target.getBoundingClientRect();

  offsetX = ev.clientX - rect.x;
  offsetY = ev.clientY - rect.y;
};

drop_handler = function(ev) {
  ev.preventDefault();

  const left = parseInt(id2.style.left);
  const top = parseInt(id2.style.top);

  id1.style.position = 'absolute';
  id1.style.left = ev.clientX - left - offsetX + 'px';
  id1.style.top = ev.clientY - top - offsetY + 'px';
  id2.appendChild(document.getElementById("id1"));
};

dragover_handler = function(ev) {
  ev.preventDefault();
  ev.dataTransfer.dropEffect = "move";
};
<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div</div>


<div id="id2" style="position:absolute;left:200px;top:50px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

关于javascript - 如何使可拖动元素在放置时停留在新位置(HTML5 而不是 jQuery)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57435575/

相关文章:

html - 在垂直和水平居中绝对位置元素时设置最大宽度和高度

iphone - 具有宽 iframe 的网页在具有视口(viewport)的 iPhone 上不可滚动

javascript - 如果需要在圆括号中的速记?

javascript - 单击其他元素(jQuery)时如何保持选择?

javascript - Ajax setRequestHeader 不起作用

javascript - html5可拖动隐藏原始元素

javascript - HTML5 拖放。检测元素被抓取的位置

javascript - localStorage 与 Puppeteer 的奇怪行为

javascript - Express Node 服务器与其显示 html 之间的通信

javascript - 拖放填充空白