vue中的拖拽事件

2023-12-13 06:19:35

在Vue中实现拖拽事件的方法如下:

  1. 在需要拖拽的元素上绑定mousedown和mouseup事件,分别设置为dragStart和dragEnd函数。
<div class="box" @mousedown="dragStart" @mouseup="dragEnd"></div>

  1. 在dragStart函数中,设置元素的初始位置和鼠标按下时的坐标,并为document对象绑定mousemove事件,设置为dragging函数。
dragStart(event) {
  // 获取元素初始位置和鼠标按下时的坐标
  this.startX = event.clientX;
  this.startY = event.clientY;
  this.offsetX = event.currentTarget.offsetLeft;
  this.offsetY = event.currentTarget.offsetTop;
  // 绑定mousemove事件
  document.addEventListener('mousemove', this.dragging);
}

  1. 在dragging函数中,计算鼠标移动了多少距离,并将元素的位置进行更新。
dragging(event) {
  // 计算鼠标移动了多少距离
  const deltaX = event.clientX - this.startX;
  const deltaY = event.clientY - this.startY;
  // 更新元素的位置
  const newLeft = this.offsetX + deltaX;
  const newTop = this.offsetY + deltaY;
  event.currentTarget.style.left = newLeft + 'px';
  event.currentTarget.style.top = newTop + 'px';
}

  1. 在dragEnd函数中,解除document对象的mousemove事件。
dragEnd() {
  document.removeEventListener('mousemove', this.dragging);
}

完整的示例代码如下:

<template>
  <div class="box" @mousedown="dragStart" @mouseup="dragEnd"></div>
</template>

<script>
export default {
  data() {
    return {
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0,
    }
  },
  methods: {
    dragStart(event) {
      // 获取元素初始位置和鼠标按下时的坐标
      this.startX = event.clientX;
      this.startY = event.clientY;
      this.offsetX = event.currentTarget.offsetLeft;
      this.offsetY = event.currentTarget.offsetTop;
      // 绑定mousemove事件
      document.addEventListener('mousemove', this.dragging);
    },
    dragging(event) {
      // 计算鼠标移动了多少距离
      const deltaX = event.clientX - this.startX;
      const deltaY = event.clientY - this.startY;
      // 更新元素的位置
      const newLeft = this.offsetX + deltaX;
      const newTop = this.offsetY + deltaY;
      event.currentTarget.style.left = newLeft + 'px';
      event.currentTarget.style.top = newTop + 'px';
    },
    dragEnd() {
      // 解除mousemove事件
      document.removeEventListener('mousemove', this.dragging);
    },
  },
}
</script>

文章来源:https://blog.csdn.net/weixin_59525879/article/details/134900578
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。