博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前端实现元素可拖拽实战,vue

Posted on 2024-02-28 15:44  Hhuizi  阅读(59)  评论(0编辑  收藏  举报
 1 //  设置元素可拖拽
 2 <div
 3   @click="clickImageItemHandler()"
 4   :draggable="true"
 5   @dragstart="dragstartHandler"
 6   @dragend="dragendHandler"
 7   :class="isSelected ? 'active' : ''"
 8 >
 9 </div>
10 
11 // 获取浏览器可视窗口的宽度
12 getClientWidth() {
13   let width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
14   return width;
15 },
16 
17 dragstartHandler(e) {
18   // 记录被拖拽的数据
19   // e.dataTransfer.setData("myInfo", JSON.stringify(this.result));
20 },
21 dragendHandler(e) {
22   let clientWidth = this.getClientWidth();
23   let clientX = e.clientX;
24   let width = parseInt(clientWidth / 2) + 200;
25   // 判断拖动目标位置决定放置左半部分或右半部分
26   if (width > clientX && clientX > 400) {
27     // 左半部分
28   } else if (width < clientX) {
29     // 右半部分
30   }
31 },

元素已经可以拖动了,但会显示一个禁止的图标,这是因为没有可放置的区域。
创建一个区域 只需要在标签上添加 ondragover 和 ondrop 方法即可,表示这个区域可放置并进行处理。

<!-- 要使@drop事件在vue中生效需要阻止@dragover默认事件 -->
// leftWmtsInfo、rightWmtsInfo拖入的数据
<template>
  <image-item
    v-if="leftWmtsInfo"
    :result="leftWmtsInfo"
    class="results-item-left"
    @delete="deleteHandler('left')"
  />
  <div
    v-else
    class="page-box page-left"
    @dragover="dragoverHandler"
    @drop="dropLeftHandler"
    :class="leftWmtsInfo ? 'active' : ''"
  >
    <div class="operat-tips-box">
      <wb-icon class="image-icon" icon="image-icon" />
      <span>拖入要对比的影像</span>
    </div>
  </div>
</template>
<template>
  <image-item
    v-if="rightWmtsInfo"
    :result="rightWmtsInfo"
    class="results-item-right"
    @delete="deleteHandler('right')"
  />
  <div class="page-box page-right" @dragover="dragoverHandler" @drop="dropRightHandler" v-else>
    <div class="operat-tips-box">
      <wb-icon class="image-icon" icon="image-icon" />
      <span>拖入要对比的影像</span>
    </div>
  </div>
</template>
dragoverHandler(e) {
// 放置位置 - 阻止默认事件 e.preventDefault(); }, dropLeftHandler(e) {
// let data = JSON.parse(e.dataTransfer.getData("myInfo")); // this.setLeftWmtsInfo(data); // console.log(this.leftWmtsInfo, "-----left---------------"); }, dropRightHandler(e) { // let data = JSON.parse(e.dataTransfer.getData("myInfo")); // this.setRightWmtsInfo(data); // console.log("-----right---------------"); },