Vue拖拽组件

Vue拖拽组件

vue开发公众号项目,***产品需要添加一个新的功能。拖拽功能。一听简单。百度上轮子挺多,直接拉一个过来用着就行。然鹅。。。兴奋之余,却失望至极。东西很多,没有一个能使得。你让我失望,那我就让你绝望。于是,拖拽的故事就开始了。。

vue拖拽功能

必备知识点:

先给不懂的童鞋补充下流程,文章要细读方能拖动元素到你心里~

按下的时候,我们需要获取

元素当前的 具有相对定位元素的左侧距离

元素当前的具有相对定位元素的顶部距离

鼠标按下点的x轴距离(鼠标左侧的距离)

鼠标按下点的y轴距离 (鼠标顶部的距离)

获取到这些点,先存储起来,后面的计算需要用到这些值

  start(e){
      // 如果touches存在就说明是移动端
      // 否则为pc端直接获取事件源对象
      let touch = e.touches? e.touches[0] : e;
      this.position.x = touch.clientX;
      this.position.y = touch.clientY;
      this.dx = moveDiv.offsetLeft;
      this.dy = moveDiv.offsetTop;
  }

Step1.

让元素跟着鼠标的移动不断移动。既然鼠标的x轴和y轴可以获取到,那我们就可以通过计算来让元素实现移动。

移动的时候,我们需要获取并设置

鼠标此时的当前的x轴和y轴的距离

鼠标点击的x轴和y轴的距离(按下的时候定义过)

此时用移动的距离 - 点击的起始位置就是移动的距离。

赋值给点击元素的left和top即可。

补充:计算的方式很多种,这知识其中一种

  move(e){
      let touch = e.touches? e.touches[0] : e;
      this.nx
### Vue拖拽组件的实现或使用方法 在 Vue 框架中,可以使用第三方库 `vuedraggable` 或者通过原生事件监听结合样式绑定来实现拖拽功能。以下是两种常见的实现方式。 #### 1. 使用 vuedraggable 实现列表项拖拽 `vuedraggable` 是一个基于 `Sortable.js` 的 Vue 组件,用于实现列表项的拖拽排序功能。以下是一个简单的示例: ```vue <template> <div> <draggable v-model="list" class="list-group" group="people" @start="drag=true" @end="drag=false" item-key="id"> <template #item="{ element }"> <div class="list-group-item"> {{ element.name }} </div> </template> </draggable> </div> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable, }, data() { return { list: [ { name: 'Item 1', id: 1 }, { name: 'Item 2', id: 2 }, { name: 'Item 3', id: 3 }, ], drag: false, }; }, }; </script> <style scoped> .list-group { display: flex; flex-direction: column; } .list-group-item { padding: 10px; border: 1px solid #ccc; margin-bottom: 5px; cursor: move; } </style> ``` 上述代码展示了如何使用 `vuedraggable` 来实现一个可拖拽的列表[^1]。通过 `v-model` 将数据与组件绑定,并通过 `@start` 和 `@end` 事件监听拖拽状态。 #### 2. 使用原生事件监听实现自定义组件拖拽 如果需要实现更复杂的拖拽效果(例如自由拖动一个组件),可以通过监听 `mousedown`、`mousemove` 和 `mouseup` 事件来实现。以下是一个示例: ```vue <template> <div class="left-admin" @mousedown="startDrag" :style="{ left: panelPosition.x + 'px', top: panelPosition.y + 'px' }" > 拖拽我 </div> </template> <script> export default { data() { return { panelPosition: { x: 0, y: 0 }, // 初始位置 isDragging: false, // 是否正在拖拽 mouseOffset: { x: 0, y: 0 }, // 鼠标相对于元素的位置偏移 }; }, methods: { startDrag(event) { this.isDragging = true; this.mouseOffset = { x: event.clientX - this.panelPosition.x, y: event.clientY - this.panelPosition.y, }; document.addEventListener('mousemove', this.onDrag); document.addEventListener('mouseup', this.stopDrag); }, onDrag(event) { if (this.isDragging) { this.panelPosition = { x: event.clientX - this.mouseOffset.x, y: event.clientY - this.mouseOffset.y, }; } }, stopDrag() { this.isDragging = false; document.removeEventListener('mousemove', this.onDrag); document.removeEventListener('mouseup', this.stopDrag); }, }, }; </script> <style scoped> .left-admin { position: fixed; width: 100px; height: 100px; background-color: lightblue; cursor: move; text-align: center; line-height: 100px; } </style> ``` 上述代码展示了如何通过监听鼠标事件来实现一个自由拖动的组件[^2]。通过动态绑定 `left` 和 `top` 样式属性,可以实时更新组件的位置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值