vue项目实现鼠标拖拽功能

<div
    id="back"
    @mousedown="draggableFun($event)"
 ></div>
//e.clientX和e.clientY 相对于浏览器可视区的位置
//元素.offsetLeft\ 元素.offsetTop  获取元素、节点位置 参照已定位的祖先元素的位置,
//当所有祖先都未定位则参照 body 元素
//原理:鼠标移动前后相对于浏览器可视区的位置的差值+元素相对于已定位的祖先元素的位置

// 鼠标拖拽事件
const draggableFun = (val) => {
  let div = document.getElementById("back");
  let dragFlag = false;
  let x, y;

  div.onmousedown = function (e) {
    dragFlag = true;
    e = e || window.event;
    // 获取鼠标在元素上的位置(鼠标按下时在元素上得位置)
    x = e.clientX - div.offsetLeft;
    y = e.clientY - div.offsetTop;
    
  };

  div.onmousemove = function (e) {
    if (dragFlag) {
      e = e || window.event;
      div.style.left = e.clientX - x + "px";
      div.style.top = e.clientY - y + "px";
    }
  };
  // 鼠标抬起事件
  div.onmouseup = function (e) {
    dragFlag = false;
  };
};
当鼠标按下鼠标移动的时候,记录移动中的 x、y 值,那么这个被拖拽的 dom 的 top 和
left 值就是:
top=鼠标按下时记录的 dom 的 top 值+(移动中的 y 值 - 鼠标按下时的 y 值)
left=鼠标按下时记录的 dom 的 left 值+(移动中的 x 值 - 鼠标按下时的 x 值)

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 是一种流行的 JavaScript 框架,用于构建用户界面。要实现甘特图的拖拽功能,可以借助 Vue 3 的指令和事件处理机制。 首先,你可以使用 Vue 3 的指令来实现元素的拖拽功能。可以自定义一个指令,例如 "drag",并在元素上应用该指令。在指令的定义中,可以使用 HTML5 的拖拽 API 来处理拖拽事件。具体步骤如下: 1. 在 Vue 组件中定义一个自定义指令 "drag",可以使用 `v-directive` 指令来定义。 2. 在指令的 `bind` 钩子函数中,添加拖拽事件的监听器。可以使用 `el.addEventListener` 来监听元素的拖拽事件,例如 `dragstart`、`drag` 和 `dragend`。 3. 在 `dragstart` 事件中,可以设置拖拽数据,例如使用 `event.dataTransfer.setData` 方法设置数据类型和值。 4. 在 `drag` 事件中,可以获取鼠标位置,并根据需要更新元素的位置。 5. 在 `dragend` 事件中,可以进行一些清理操作,例如重置元素的位置。 除了指令,你还可以使用 Vue 3 的事件处理机制来处理拖拽事件。具体步骤如下: 1. 在 Vue 组件中定义一个方法,例如 `handleDragStart`,用于处理拖拽开始事件。 2. 在元素上绑定拖拽事件,例如 `@dragstart="handleDragStart"`。 3. 在方法中,可以使用 `event.dataTransfer.setData` 方法设置拖拽数据。 4. 可以使用 `@drag` 和 `@dragend` 绑定其他的拖拽事件,并在方法中处理相应的逻辑。 以上是实现甘特图拖拽功能的一种思路,具体实现方式可以根据你的需求和项目结构进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值