vue2 图片拖拽时,e.clientX与e.clientY有1秒会变成0

本文介绍了如何在Vue应用中使用`@dragover.prevent`防止默认拖放行为,以及配合`dragstart`和`drop`事件创建可拖拽排序的列表。实例展示了如何跟踪拖动项和索引,以及在`handleDrop`方法中处理列表项的移动。
摘要由CSDN通过智能技术生成

【文心一言提供的参考】

在Vue中,你可以使用@dragover.prevent来阻止拖拽事件的默认行为。这是一个常见的需求,尤其是在你想要创建可拖拽排序的列表时。

以下是一个简单的例子,演示如何在Vue中使用dragover.prevent

<template>
  <div>
    <ul
      @dragover.prevent="handleDragOver"
      @drop.prevent="handleDrop"
      style="border: 1px solid #ccc; padding: 10px; width: 300px;"
    >
      <li
        v-for="(item, index) in items"
        :key="index"
        draggable
        @dragstart="handleDragStart"
        style="margin: 5px; padding: 5px; border: 1px dashed #ccc; cursor: move;"
      >
        {{ item }}
      </li>
    </ul>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      draggedItem: null,
      draggedIndex: null,
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      this.draggedIndex = this.items.indexOf(item);
    },
    handleDragOver(event) {
      // 可以在这里添加自定义样式以指示可以放置
    },
    handleDrop(event) {
      const dropIndex = Array.from(event.target.parentNode.children).indexOf(event.target);
      const newItems = [...this.items];
      newItems.splice(dropIndex, 0, newItems.splice(this.draggedIndex, 1)[0]);
      this.items = newItems;
    }
  }
};
</script>

在这个例子中,我们有一个可拖动列表项的ul元素,每个li元素都是可拖动的。我们使用dragstart事件来记录拖动的项和索引,使用dragover.prevent来阻止默认的拖拽放置行为,并在drop事件中处理项的移动。这样就可以创建一个可拖拽排序的列表了。


【实际使用】

根据以上参考,添加了这句 @dragover.prevent="handlerDrag"

<div class="img-item" 
:style="imgItem" 

...

@dragover.prevent="handlerDrag">

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
// draggable.js import { onMounted, onBeforeUnmount } from 'vue' export default { mounted(el) { console.log('el',el) el.setAttribute('draggable', true) let startX, startY, initialLeft, initialTop, currentX, currentY const onDragStart = (e) => { console.log('e',e.preventDefault()) e.stopPropagation() // e.preventDefault() startX = e.clientX || e.touches[0].clientX startY = e.clientY || e.touches[0].clientY initialLeft = el.offsetLeft initialTop = el.offsetTop el.classList.add('dragging') } const onDrag = (e) => { e.stopPropagation() currentX = (e.clientX || e.touches[0].clientX) - startX currentY = (e.clientY || e.touches[0].clientY) - startY el.style.left = `${initialLeft + currentX}px` el.style.top = `${initialTop + currentY}px` } const onDragEnd = (e) => { e.stopPropagation() el.classList.remove('dragging') } el.addEventListener('dragstart', onDragStart) el.addEventListener('drag', onDrag) el.addEventListener('dragend', onDragEnd) el.addEventListener('touchstart', onDragStart) el.addEventListener('touchmove', onDrag) el.addEventListener('touchend', onDragEnd) onMounted(() => { el.classList.add('draggable') }) onBeforeUnmount(() => { el.removeEventListener('dragstart', onDragStart) el.removeEventListener('drag', onDrag) el.removeEventListener('dragend', onDragEnd) el.removeEventListener('touchstart', onDragStart) el.removeEventListener('touchmove', onDrag) el.removeEventListener('touchend', onDragEnd) el.classList.remove('draggable') el.classList.remove('dragging') }) } } 为什么出现虚影,残影, 怎么解决这个问题
05-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值