前端vue中的拖拽知识详解

 更新时间:2025年01月23日 10:04:32   作者:Jinuss  
这篇文章主要介绍了前端拖拽功能的基本知识,并详细讲解了如何在Vue3工程中实现拖拽指令,拖拽功能涉及HTML、CSS和JavaScript的综合运用,需要的朋友可以参考下

概述

本文主要介绍前端中拖拽相关的知识以及如何在 vue3 工程里实现拖拽指令。

前端中的拖拽

前端中的拖拽功能是一种交互设计,允许用户通过鼠标或触摸操作移动页面上的元素到不同的位置。这一功能的实现涉及 HTMLCSS 和 JavaScript 的综合运用。

HTML元素拖拽

  • 拖拽元素

HTML 元素有一个draggable属性,接受一个布尔值,默认值为false(不可拖拽)。

<div draggable="true">我是可拖动的</div>
  • 事件处理

拖拽功能的实现依赖于几个关键的拖放事件:

  • dragstart: 当用户开始拖动元素时触发,可以在这里设置数据传输(如拖动的数据类型和值)。

  • drag: 元素正在被拖动时连续触发。

  • dragend: 用户释放鼠标,结束拖动时触发。

  • dragenter 和 dragover: 当拖动的元素进入或停留在目标区域时触发。通常需要阻止这两个事件的默认行为,以允许元素被放置。

  • drop: 在拖动元素被释放到有效目标时触发,是接收拖动数据并执行相应操作的地方。

示例效果

效果如下:

核心代码

代码如下:

dragClass.addEventListener("dragstart", (e) => {
  const node = e.target.cloneNode(true);
  e.dataTransfer.setData("cloneNode", node.outerHTML);
});

dragClass.addEventListener("dragend", (e) => {
  e.dataTransfer.clearData();
});

dropDom.addEventListener("dragover", (e) => {
  if (e.target.className == "draggable") {
    e.preventDefault();
  }
});

dropDom.addEventListener("drop", (e) => {
  e.preventDefault();
  const node = e.dataTransfer.getData("cloneNode");
  e.target.innerHTML = node;
  const originCellNode = e.dataTransfer.getData("text/html");
  if (originCellNode) {
    originCellNode.removeChild(originCellNode);
  }
  e.dataTransfer.clearData("cloneNode");
});

dragTableCell.addEventListener("dragstart", (e) => {
  const node = e.target.cloneNode(true);
  e.dataTransfer.setData("cloneNode", node.outerHTML);
  e.dataTransfer.setData("text/html", e.target.parentNode.outerHTML);
});

参考地址

参考地址:https://github.com/Jinuss/blog/blob/main/docs/Demo/03.drag.html

vue3 拖拽指令封装

在 vue3 中实现组件的拖拽,可以封装一个拖拽指令,再需要进行拖拽的组件上加上v-drag即可。

拖拽指令实现实现如下:

export const drag = {
  mounted(el) {
    el.style.position = "absolute";
    el.style.cursor = "move";

    let startX, startY, initialX, initialY;

    const dragStart = (e) => {
      startX = e.clientX;
      startY = e.clientY;
      initialX = el.offsetLeft;
      initialY = el.offsetTop;

      document.addEventListener("mousemove", dragMove);
      document.addEventListener("mouseup", dragEnd);
    };

    const dragMove = (e) => {
      const dx = e.clientX - startX;
      const dy = e.clientY - startY;
      const newX = initialX + dx;
      const newY = initialY + dy;

      const maxX = window.innerWidth - el.offsetWidth;
      const maxY = window.innerHeight - el.offsetHeight;

      /**边界检查 */
      el.style.left = `${Math.min(Math.max(newX, 0), maxX)}px`;
      el.style.top = `${Math.min(Math.max(newY, 0), maxY)}px`;
    };

    const dragEnd = () => {
      document.removeEventListener("mousemove", dragMove);
      document.removeEventListener("mouseup", dragEnd);
    };

    el.addEventListener("mousedown", dragStart);
  },
};

总结 

到此这篇关于前端vue中的拖拽知识的文章就介绍到这了,更多相关前端vue拖拽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue使用echarts定制特殊的仪表盘

    Vue使用echarts定制特殊的仪表盘

    这篇文章主要为大家详细介绍了Vue使用echarts定制特殊的仪表盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue使用axios出现options请求方法

    Vue使用axios出现options请求方法

    这篇文章主要介绍了Vue使用axios出现options请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • vant实现购物车功能

    vant实现购物车功能

    这篇文章主要为大家详细介绍了vant实现购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 关于.prettierrc代码格式化配置方式

    关于.prettierrc代码格式化配置方式

    这篇文章主要介绍了关于.prettierrc代码格式化配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue自定义一个v-model的实现代码

    vue自定义一个v-model的实现代码

    这篇文章主要介绍了vue自定义一个v-model的实现代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Vue3 的ref和reactive的用法和区别示例解析

    Vue3 的ref和reactive的用法和区别示例解析

    ref和reactive是Vue3中用来实现数据响应式的API,一般情况下,ref定义基本数据类型,reactive定义引用数据类型,本文给大家介绍Vue3 的ref和reactive的用法和区别,感兴趣的朋友一起看看吧
    2023-10-10
  • 一文带你搞懂V8垃圾回收系统

    一文带你搞懂V8垃圾回收系统

    在V8中,JavaScript的内存空间分为栈(Stack)和堆(Heap)两部分,垃圾回收的基本思路是:查找内存中的所有变量,看哪些已经不再需要,然后释放这些变量所占用的内存,本文就给大家梳理一下V8垃圾回收系统,需要的朋友可以参考下
    2023-07-07
  • Vue路由模块化配置的完整步骤

    Vue路由模块化配置的完整步骤

    这篇文章主要给大家介绍了关于Vue路由模块化配置的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Vue+ECharts+高德地图API实现天气预报数据可视化的教程

    Vue+ECharts+高德地图API实现天气预报数据可视化的教程

    所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向,对于数据可视化,很多互联网公司是很看重这一块的,包括大厂,本就将给大家介绍如何通过Vue+ECharts+高德地图API实现天气预报数据可视化
    2023-06-06
  • Vue dialog模态框的封装方法

    Vue dialog模态框的封装方法

    这篇文章主要为大家详细介绍了Vue dialog模态框的封装方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论