跳到主要内容

JS 拖拽功能的实现

首先是三个事件,分别是 mousedown,mousemove,mouseup 当鼠标点击按下的时候,需要一个 tag 标识此时已经按下,可以执行 mousemove 里面 的具体方法。 clientX,clientY 标识的是鼠标的坐标,分别标识横坐标和纵坐标,并且我们用 offsetX 和 offsetY 来表示元素的元素的初始坐标,移动的举例应该是: 鼠标移动时候的坐标-鼠标按下去时候的坐标。 也就是说定位信息为: 鼠标移动时候的坐标-鼠标按下去时候的坐标+元素初始情况下的 offetLeft. 还有一点也是原理性的东西,也就是拖拽的同时是绝对定位,我们改变的是绝对定位 条件下的 left 以及 top 等等值。 补充:也可以通过 html5 的拖放(Drag 和 drop)来实现

HTML5 原生拖放 API 涉及的关键属性和方法:

  • draggable="true":让一个元素可被拖拽。
  • 事件:拖拽源触发 dragstartdragdragend;放置目标触发 dragenterdragoverdragleavedrop
  • dragstart 中通过 e.dataTransfer.setData('text/plain', id) 传递数据,在 drop 中用 e.dataTransfer.getData('text/plain') 取出。
  • 注意:要让元素允许放置,必须在 dragover 事件中调用 e.preventDefault()
<div id="box" draggable="true">拖我</div>
<div id="target">放在这里</div>
<script>
box.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", e.target.id);
});
target.addEventListener("dragover", (e) => e.preventDefault());
target.addEventListener("drop", (e) => {
e.preventDefault();
const id = e.dataTransfer.getData("text/plain");
target.appendChild(document.getElementById(id));
});
</script>