vue实现拖拽效果

yizhihongxing

请按照下面的内容进行阅读。

拖拽效果的实现原理

Vue 中实现拖拽效果,通常需要用到两个事件:鼠标按下和鼠标移动。当鼠标按下时,记录下鼠标按下的位置,然后在鼠标移动事件中计算出当前位置和按下位置的差值,再用 JS 或 CSS 把要拖拽的元素移动到当前位置即可。

实现步骤

1. 添加拖拽功能的 HTML 结构

在 HTML 中,我们需要添加一个可拖拽元素,如下所示:

<div id="draggable">
  <h1>我是可拖拽的标题</h1>
</div>

2. 在 Vue 组件中添加拖拽事件处理方法

在 Vue 组件中,我们可以使用鼠标按下和鼠标移动事件来实现拖拽效果。以下是实现过程的代码示例:

<template>
  <div ref="draggable" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">
    <h1>我是可拖拽的标题</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      currentX: 0,
      currentY: 0,
    };
  },
  methods: {
    onMouseDown(e) {
      // 记录鼠标按下时的位置
      this.startX = e.clientX;
      this.startY = e.clientY;
      this.isDragging = true;
    },
    onMouseMove(e) {
      if (!this.isDragging) return;
      // 计算当前位置和鼠标按下时的位置差值
      const deltaX = e.clientX - this.startX;
      const deltaY = e.clientY - this.startY;
      // 设置当前位置
      this.currentX = this.$refs.draggable.offsetLeft + deltaX;
      this.currentY = this.$refs.draggable.offsetTop + deltaY;
      // 移动拖拽元素
      this.$refs.draggable.style.left = `${this.currentX}px`;
      this.$refs.draggable.style.top = `${this.currentY}px`;
    },
    onMouseUp() {
      this.isDragging = false;
    },
  },
};
</script>

onMouseDown 事件中,我们记录了鼠标按下时的位置,并设置 isDragging 标志为 true,表示元素正在被拖拽。

onMouseMove 事件中,我们计算当前位置和鼠标按下时的位置差值,并移动拖拽元素。要注意的是,拖拽元素的位置需要以 offsetLeftoffsetTop 属性为基础,加上差值,以确保元素能够按照鼠标移动的轨迹移动。

onMouseUp 事件中,我们将 isDragging 标志设为 false,表示拖拽操作已经结束。

3. 添加样式,使拖拽元素可拖动

为了使拖拽元素能够被拖动,我们需要在 CSS 中设置元素的 position 属性为 absolute,并设置元素的 lefttop 属性为 0,以确保元素能够放置在父元素的左上角。

#draggable {
  position: absolute;
  left: 0;
  top: 0;
}

示例说明

下面将展示两个示例,一个是基于 Vue 2.x 的示例,另一个是基于 Vue 3.x 的示例。

示例1:Vue 2.x

以下是使用 Vue 2.x 实现拖拽效果的完整示例代码:

<template>
  <div ref="draggable" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">
    <h1>我是可拖拽的标题</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      currentX: 0,
      currentY: 0,
    };
  },
  methods: {
    onMouseDown(e) {
      // 记录鼠标按下时的位置
      this.startX = e.clientX;
      this.startY = e.clientY;
      this.isDragging = true;
    },
    onMouseMove(e) {
      if (!this.isDragging) return;
      // 计算当前位置和鼠标按下时的位置差值
      const deltaX = e.clientX - this.startX;
      const deltaY = e.clientY - this.startY;
      // 设置当前位置
      this.currentX = this.$refs.draggable.offsetLeft + deltaX;
      this.currentY = this.$refs.draggable.offsetTop + deltaY;
      // 移动拖拽元素
      this.$refs.draggable.style.left = `${this.currentX}px`;
      this.$refs.draggable.style.top = `${this.currentY}px`;
    },
    onMouseUp() {
      this.isDragging = false;
    },
  },
};
</script>

<style>
#draggable {
  position: absolute;
  left: 0;
  top: 0;
}
</style>

示例2:Vue 3.x

以下是使用 Vue 3.x 实现拖拽效果的完整示例代码:

<template>
  <div ref="draggable" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">
    <h1>我是可拖拽的标题</h1>
  </div>
</template>

<script>
import { ref } from "vue";

export default {
  setup() {
    const isDragging = ref(false);
    const startX = ref(0);
    const startY = ref(0);
    const currentX = ref(0);
    const currentY = ref(0);
    const draggable = ref(null);

    const onMouseDown = (e) => {
      // 记录鼠标按下时的位置
      startX.value = e.clientX;
      startY.value = e.clientY;
      isDragging.value = true;
    };

    const onMouseMove = (e) => {
      if (!isDragging.value) return;
      // 计算当前位置和鼠标按下时的位置差值
      const deltaX = e.clientX - startX.value;
      const deltaY = e.clientY - startY.value;
      // 设置当前位置
      currentX.value = draggable.value.offsetLeft + deltaX;
      currentY.value = draggable.value.offsetTop + deltaY;
      // 移动拖拽元素
      draggable.value.style.left = `${currentX.value}px`;
      draggable.value.style.top = `${currentY.value}px`;
    };

    const onMouseUp = () => {
      isDragging.value = false;
    };

    return {
      isDragging,
      startX,
      startY,
      currentX,
      currentY,
      draggable,
      onMouseDown,
      onMouseMove,
      onMouseUp,
    };
  },
};
</script>

<style>
#draggable {
  position: absolute;
  left: 0;
  top: 0;
}
</style>

以上就是基于 Vue 的实现拖拽效果的完整攻略,并附上了两个示例代码,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现拖拽效果 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue新手指南之环境搭建及入门

    Vue新手指南之环境搭建及入门 本篇文章将为大家提供Vue环境搭建和入门的详细步骤和示例。 环境搭建 安装Node.js Node.js是一款基于Chrome V8引擎的JavaScript运行环境,需要先安装这个环境才能使用Vue。Windows和MacOS用户可以在Node.js官网下载对应的安装包,然后按照默认设置一路安装即可。Linux用户可以使用包…

    Vue 2023年5月27日
    00
  • Vue中data传递函数、props接收函数及slot传参的使用及说明

    下面是“Vue中data传递函数、props接收函数及slot传参的使用及说明”的完整攻略。 Vue中data传递函数 在 Vue 中,我们可以通过 data 对象来传递数据。但是有时候我们希望传递的是一个函数,这时候该怎么办呢?我们需要将这个函数封装成方法,然后再传递到 data 对象中。示例代码如下: <template> <div&g…

    Vue 2023年5月28日
    00
  • vue预览 pdf、word、xls、ppt、txt文件的实现方法

    实现网页预览PDF、Word、Excel、PPT、TXT等各种文件格式,一般需要使用第三方库进行实现。本文将介绍如何使用Vue和依赖库来预览这些文件格式。 1. 安装vue2-pdf预览库 Vue2-pdf 是一个基于 Vue 2.0 开发的 PDF 预览组件,支持PDF的浏览、缩放、翻页和导出等操作。具体实现步骤: 安装依赖 npm install vue…

    Vue 2023年5月28日
    00
  • 利用Vue v-model实现一个自定义的表单组件

    实现一个自定义的表单组件,我们通常需要用到Vue.js中的组件。这个组件将包含一些输入元素,例如输入框、下拉框、单选框、复选框等等。这些元素需要收集数据并传递给父组件,以便在父组件中进行处理。 为了实现这个功能,我们可以利用Vue.js提供的v-model指令。v-model指令是一个双向数据绑定指令,它将数据绑定到表单元素的value属性上。当用户在输入框…

    Vue 2023年5月28日
    00
  • uniapp路由uni-simple-router实例详解

    uni-app路由 – uni-simple-router实例详解 引言 在uni-app的开发中,使用Vue.js的开发方式来创建页面,同时也使用了Vue-router来处理路由逻辑。但是,uni-app的路由也可以使用uni-simple-router来实现。uni-simple-router是一个轻量级的路由库,它使用Vue.js同样的路由API来实现…

    Vue 2023年5月28日
    00
  • element中el-autocomplete的常见用法示例

    当使用 Vue.js 和 Element UI 搭建网站时,使用 el-autocomplete 组件可以实现一个自动完成的输入框。以下是 el-autocomplete 的常见用法示例: 基本用法 使用 v-model 在父组件中绑定输入框的值,使用 fetchSuggestions 方法获取自动完成的选项列表: <template> <…

    Vue 2023年5月28日
    00
  • 深度解析 Vue3 的响应式机制

    深度解析 Vue3 的响应式机制 Vue3 的响应式机制借鉴了 ES6 中的 Proxy,相较于 Vue2 中的 Object.defineProperty,其实现更加高效灵活。下面将详细介绍 Vue3 的响应式机制及其实现原理。 Vue3 的响应式机制 Vue3 中的响应式机制是通过 reactivity 模块来实现的,它主要包括以下几个部分: react…

    Vue 2023年5月27日
    00
  • 聊聊vue 中的v-on参数问题

    文本框架: 聊聊Vue中的v-on参数问题 什么是v-on v-on语法 不带参数的v-on 带参数的v-on v-on参数示例 示例一:点击按钮弹出提示框 示例二:在输入框中输入文字被实时监听 v-on综合示例 点击按钮改变背景色并弹出提示 总结 什么是v-on v-on 是 Vue 中的指令,用于监听 DOM 事件并触发Vue中指定的方法。在 Vue 中…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部