首页 > 其他分享 >实现拖拽整个div到另外一个div中

实现拖拽整个div到另外一个div中

时间:2023-10-08 14:57:35浏览次数:30  
标签:dataTransfer text drop event 整个 div 拖拽

实现拖拽整个div到另外一个div中

来自你的消息:

vue3代码实现div内容拖拽到另外一个siv中

来自WeTab AI的消息:

在Vue 3中,你可以使用Vue的指令和事件处理器来实现将<div>内容拖拽到另一个<div>中。以下是一个使用Vue 3和原生HTML Drag & Drop API实现的示例代码:

<template>
  <div>
    <div class="drag-container">
      <div class="draggable" draggable="true" @dragstart="dragStart">拖拽我</div>
    </div>
    <div class="drop-container" @dragover="dragOver" @drop="drop">
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    dragStart(event) {
      // 设置拖拽时传输的数据
      event.dataTransfer.setData('text/plain', event.target.innerText);
    },
    dragOver(event) {
      // 阻止浏览器默认操作,允许drop事件发生
      event.preventDefault();
    },
    drop(event) {
      // 阻止浏览器默认操作
      event.preventDefault();
      
      // 获取传输的数据
      const data = event.dataTransfer.getData('text/plain');
      
      // 在drop区域创建新的div,并显示拖拽的内容
      const newDiv = document.createElement('div');
      newDiv.innerText = data;
      event.target.appendChild(newDiv);
    }
  }
};
</script>

<style>
.drag-container, .drop-container {
  border: 1px solid #ccc;
  padding: 10px;
  margin-bottom: 10px;
}

.draggable {
  background-color: #f0f0f0;
  padding: 5px;
  cursor: move;
}
</style>

在上面的示例中,我们使用draggable属性将<div>标记为可拖拽的,@dragstart事件处理器会在拖拽开始时触发。在拖拽时,我们设置了一个数据传输的类型和值。在<div class="drop-container">元素上,我们使用@dragover事件处理器来阻止默认的放置操作,并使用@drop事件处理器来处理放置操作。在@drop事件处理器中,我们通过event.dataTransfer.getData('text/plain')获取传输的数据,并在放置区域中创建一个新的<div>来显示拖拽的内容。

注意:vue-draggable-nested-tree等第三方库也提供了更丰富的拖拽功能,你可以根据具体需求选择适合的库来使用。

来自你的消息:

vue3代码实现将整个div拖拽到另外一个div中

来自WeTab AI的消息:

要实现将整个div拖拽到另一个div中,你可以修改上面的示例代码,将可拖拽的内容设置为整个div,并在拖拽结束时将整个div移动到目标div中。以下是修改后的示例代码:

<template>
  <div>
    <div class="drag-container" draggable="true" @dragstart="dragStart" @dragend="dragEnd">
      <div class="draggable-content">拖拽我</div>
    </div>
    <div class="drop-container" @dragover="dragOver" @drop="drop">
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    dragStart(event) {
      // 获取整个div的HTML内容
      const draggableContent = event.target.innerHTML;
      
      // 设置拖拽时传输的数据为整个div的内容
      event.dataTransfer.setData('text/plain', draggableContent);
      
      // 设置拖拽元素的样式
      event.target.style.opacity = '0.4';
    },
    dragEnd(event) {
      // 恢复拖拽元素的默认样式
      event.target.style.opacity = '1';
    },
    dragOver(event) {
      // 阻止浏览器默认操作,允许drop事件发生
      event.preventDefault();
    },
    drop(event) {
      // 阻止浏览器默认操作
      event.preventDefault();
      
      // 获取传输的数据,这里是整个div的内容
      const data = event.dataTransfer.getData('text/plain');
      
      // 在drop区域创建新的div,并显示拖拽的内容
      const newDiv = document.createElement('div');
      newDiv.innerHTML = data;
      event.target.appendChild(newDiv);
    }
  }
};
</script>

<style>
.drag-container, .drop-container {
  border: 1px solid #ccc;
  padding: 10px;
  margin-bottom: 10px;
}

.draggable-content {
  background-color: #f0f0f0;
  padding: 5px;
  cursor: move;
}
</style>

在这个修改后的示例中,我们直接将<div class="drag-container">标记为可拖拽的,并在dragStart事件处理器中获取整个div的HTML内容。然后,在drop事件处理器中,我们创建一个新的div,并将整个div的内容赋值给新的div的innerHTML属性,然后将新的div添加到目标div中。

注意:上述示例中只能在同一个页面内拖拽,如果你需要拖拽到其他页面,你可能需要更高级的技术,例如使用HTML5的<iframe>或者WebSocket来实现跨页面的拖拽功能。

来自你的消息:

vue3代码实现将整个div的内容样式拖拽到另外一个div中

来自WeTab AI的消息:

要实现将整个div的内容样式拖拽到另一个div中,你可以通过修改数据绑定和样式绑定来实现。以下是一个示例代码:

<template>
  <div>
    <div class="drag-container" draggable="true" @dragstart="dragStart" @dragend="dragEnd">
      <div class="draggable-content" :style="draggedDivStyle">
        <p>{{ draggedContent }}</p>
      </div>
    </div>
    <div class="drop-container" @dragover="dragOver" @drop="drop">
      <p>{{ droppedContent }}</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      draggedContent: '拖拽我',
      droppedContent: '放置区域'
    }
  },
  computed: {
    draggedDivStyle() {
      return {
        backgroundColor: 'lightblue',
        padding: '10px',
        cursor: 'move'
      };
    }
  },
  methods: {
    dragStart(event) {
      // 设置拖拽时传输的数据为被拖拽div的内容和样式
      event.dataTransfer.setData('text/plain', JSON.stringify({
        content: this.draggedContent,
        style: this.draggedDivStyle
      }));
      
      // 设置拖拽元素的样式
      event.target.style.opacity = '0.4';
    },
    dragEnd(event) {
      // 恢复拖拽元素的默认样式
      event.target.style.opacity = '1';
    },
    dragOver(event) {
      // 阻止浏览器默认操作,允许drop事件发生
      event.preventDefault();
    },
    drop(event) {
      // 阻止浏览器默认操作
      event.preventDefault();
      
      // 获取传输的数据,这里是被拖拽div的内容和样式
      const data = JSON.parse(event.dataTransfer.getData('text/plain'));
      
      // 更新放置区域的内容和样式
      this.droppedContent = data.content;
      this.droppedDivStyle = data.style;
    }
  }
};
</script>

<style>
.drag-container, .drop-container {
  border: 1px solid #ccc;
  padding: 10px;
  margin-bottom: 10px;
}

.draggable-content {
  background-color: #f0f0f0;
  padding: 5px;
}
</style>

在这个示例中,我们使用draggedContent表示被拖拽的div的内容,draggedDivStyle表示被拖拽的div的样式。在dragStart事件处理器中,我们将被拖拽div的内容和样式序列化为JSON字符串并设置为传输的数据。

drop事件处理器中,我们解析传输的数据并更新放置区域的内容和样式。

注意:这里的示例仅展示了如何拖拽整个div的内容样式,如果你想将其他更复杂的属性或样式拖拽到另一个div中,你可能需要相应地扩展数据和处理方法。

来自你的消息:

拖拽对象event.dataTransfer.setData怎么传递html格式的内容

来自WeTab AI的消息:

要传递包含 HTML 格式的内容,你可以使用 event.dataTransfer.setData() 方法的第一个参数来指定 MIME 类型为 "text/html",并将 HTML 字符串作为第二个参数传递。以下是一个示例代码:

dragStart(event) {
  const htmlContent = '<p>这是一个包含HTML格式的内容</p>';
  event.dataTransfer.setData('text/html', htmlContent);
}

在这个示例中,我们将一个包含 HTML 格式的内容的字符串传递给 event.dataTransfer.setData() 方法,并将 MIME 类型设置为 "text/html"

在接收拖放的元素的 drop 事件处理器中,你可以使用 event.dataTransfer.getData() 方法来获取传递的 HTML 内容。例如:

drop(event) {
  const htmlContent = event.dataTransfer.getData('text/html');
  // 在此处使用获取的 HTML 内容
}

在这个示例中,我们使用 event.dataTransfer.getData() 方法并指定 MIME 类型为 "text/html",从 DataTransfer 对象获取传递的 HTML 内容。

请注意,传递 HTML 内容需要浏览器支持并且在拖放操作中正确配置。某些浏览器可能不支持拖放 HTML 内容,或者需要特定的设置和处理。

最后还是没达到我想要的效果

  <div class="flex justify-center items-center space-x-10">
      <div
        class="border-spacing-1 border-green-400 p-2 mb-2"
        draggable="true"
        @dragstart="dragStart"
        @dragend="dragEnd"
      >
        <div class="bg-sky-500 p-1" :style="draggedDivStyle">
          <p>{{ draggedContent }}</p>
        </div>
      </div>
      <div
        class="border-spacing-1 border-green-400 w-[200px] h-[200px] bg-sky-100 mb-2"
        @dragover="dragOver"
        @drop="drop"
        id="contentarea"
      >
        <p>{{ droppedContent }}</p>
      </div>
    </div>

通过id= contentara添加进去拖拽区域的

const draggedContent = ref("拖拽我");
const droppedContent = ref("放置区域");
const draggedDivStyle = computed(() => {
  return {
    backgroundColor: "lightblue",
    padding: "10px",
    cursor: "move",
  };
});

const dragStart = (event) => {
  console.log(event.srcElement);
  // 设置拖拽时传输的数据为整个div的内容
  // event.dataTransfer.setData('text/plain', draggedContent.value);
  // event.dataTransfer.setData("text/html", event.srcElement);
  // event.dataTransfer.setData("text/html", event.srcElement);

  // 设置拖拽元素的样式
  event.target.style.opacity = "0.4";
};
const dragEnd = (event) => {
  // 恢复拖拽元素的默认样式
  let el1 = event.srcElement;
  let el = document.getElementById("contentarea");
  el.appendChild(el1);
  console.log(event.srcElement);
  // const data = event.dataTransfer.getData("text/html");
  event.target.style.opacity = "1";
};
const dragOver = (event) => {
  // 阻止浏览器默认操作,允许drop事件发生
  event.preventDefault();
};
const drop = (event) => {
  // 阻止浏览器默认操作
  event.preventDefault();
};

标签:dataTransfer,text,drop,event,整个,div,拖拽
From: https://www.cnblogs.com/sxliu414/p/17749041.html

相关文章

  • Codeforces Round 900 (Div. 3) E. Iva & Pav (位运算)
    CodeforcesRound900(Div.3)E.Iva&Pav//思路:10^9转换为2^32上的位,进行位运算,a[x][i]为到x为止第i位的1个数前缀和//对于与运算,如果当前i的前缀和不为r-l+1,则这一位的与运算结果为0//当找到从左往右第一个位置i为1使得k在这位为0,则与运算前缀大于k//二分查找最后一......
  • Codeforces Round 901 (Div. 2) C. Jellyfish and Green Apple (位运算)
    CodeforcesRound901(Div.2)C.JellyfishandGreenApple//思路:浮点数转二进制,a/b的结果为gcd(a,b)*最简分式(n/m)的结果//苹果能分的前提是人数得是一个2的次幂数,通过切割只能分为形同0.001的二进制小数//a/b的二进制如果在从左到右的sp位为1,则需要切割到这个情况//一个......
  • Vue3 Div 与 v-for 的配合应用,超出自动带滚动条
    效果图 代码<li><ahref="javascript:;"class="IndReaflexCHuans"><i></i><p>当前会议[0]</p></a><divstyle="height:80%;overflow:auto;"><divv-for="......
  • 「题解」Codeforces Round 883 (Div. 3)
    A.EscalatorConversationsProblem[题目](RudolphandCuttheRope)Sol&Code绳子长度大于钉子高度的要剪#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}in......
  • 「题解」Codeforces Round 888 (Div. 3)
    A.EscalatorConversationsProblem题目Sol&Code签到#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,n,m,k,h;intmain(){scanf(......
  • 「题解」Codeforces Round 891 (Div. 3)
    A.ArrayColoringProblem题目Sol&Code只有数列的和为偶数时才符合要求,即有任意个偶数,偶数个奇数。将这些数分成两部分,发现两部分初始值\(0\)为偶数,偶数不会影响奇偶性,故需要偶数个奇数。#include<bits/stdc++.h>#defineN51typedeflonglongll;intmin(inta,......
  • CF1249(Div. 3) 题解(A to D)
    \(\texttt{EF}\)忘(不)记(会)写了。AYetAnotherDividingintoTeams题解题目大意有一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\),将他们分为若干组,使得每一组没有两个数的差为\(1\),使分的组数尽可能少。解题思路排完序后对于任意\(1\lei<n\)均有\(a_i\)与\(a_{i......
  • CF1234(Div. 3) 题解(A to E)
    AEqualizePricesAgain题解题目大意\(n\)个商品,每个商品价格为\(a_i\),求一个最小的价格\(x\),使得不亏本(即\(\sum\limits_{i=1}^n{(a_i-x)}\ge0\))。解题思路输出平均数向上取整(即\(\left\lceil(\sum\limits_{i=1}^n{a_i})\divn\right\rceil\))即可。代码#include<bit......
  • CF1203(Div. 3) 题解(C to F1)
    由于太懒了,所以不想(会)写\(\texttt{AB}\)和\(\texttt{F2}\)。CCommonDivisors题解题目大意给定一个长度为\(n\)的数列\(\{a_i\}\),求\(\sigma(\gcd\limits_{i\in[1,n]}\{a_i\})\)。解题思路先算出所有元素的最大公因数,如果最大公因数\(g\)为\(1\),即所有元素两两......
  • CF1873(Div. 4) 题解 (A to E)
    AShortSort题解题目大意给定一个长度为\(3\)、由\(a,b,c\)组成的字符串,问可以不变或交换两个字符是的变为\(\texttt{abc}\)。解题思路由于大小固定,所以预处理可行的字符串(仅包含\(\texttt{abcacbbaccba}\))即可。代码#include<bits/stdc++.h>usingnamespacest......