当前位置:首页 > VUE

vue实现页面拖拽

2026-01-18 14:58:22VUE

Vue 实现页面拖拽的方法

使用原生 HTML5 拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以直接使用这些 API。

<template>
  <div>
    <div 
      draggable="true"
      @dragstart="handleDragStart"
      @dragend="handleDragEnd"
    >
      拖拽元素
    </div>
    <div 
      @dragover="handleDragOver"
      @drop="handleDrop"
    >
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', '拖拽数据');
    },
    handleDragOver(e) {
      e.preventDefault();
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    }
  }
}
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,可以方便地实现列表拖拽排序等功能。

vue实现页面拖拽

安装 Vue.Draggable:

npm install vuedraggable

示例代码:

vue实现页面拖拽

<template>
  <div>
    <draggable 
      v-model="list"
      @end="onDragEnd"
    >
      <div v-for="item in list" :key="item.id">
        {{ item.name }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: '项目1' },
        { id: 2, name: '项目2' },
        { id: 3, name: '项目3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽后的列表:', this.list);
    }
  }
}
</script>

使用鼠标事件实现自定义拖拽

如果需要更灵活的拖拽效果,可以通过监听鼠标事件实现自定义拖拽逻辑。

<template>
  <div>
    <div 
      ref="draggableElement"
      @mousedown="startDrag"
      :style="{ position: 'absolute', left: position.x + 'px', top: position.y + 'px' }"
    >
      自定义拖拽元素
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      position: { x: 0, y: 0 },
      isDragging: false,
      startPos: { x: 0, y: 0 }
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y };
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(e) {
      if (!this.isDragging) return;
      this.position = {
        x: e.clientX - this.startPos.x,
        y: e.clientY - this.startPos.y
      };
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
}
</script>

使用 Vue 指令实现拖拽

可以创建一个自定义指令来实现拖拽功能,使代码更可复用。

<template>
  <div v-draggable class="draggable-box">
    可拖拽元素
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.style.position = 'absolute';
        el.style.cursor = 'move';

        let startX, startY, initialLeft, initialTop;

        el.addEventListener('mousedown', (e) => {
          startX = e.clientX;
          startY = e.clientY;
          initialLeft = el.offsetLeft;
          initialTop = el.offsetTop;

          document.addEventListener('mousemove', move);
          document.addEventListener('mouseup', up);
        });

        function move(e) {
          el.style.left = initialLeft + e.clientX - startX + 'px';
          el.style.top = initialTop + e.clientY - startY + 'px';
        }

        function up() {
          document.removeEventListener('mousemove', move);
          document.removeEventListener('mouseup', up);
        }
      }
    }
  }
}
</script>

以上方法可以根据具体需求选择使用,原生 API 适合简单场景,Vue.Draggable 适合列表排序,自定义实现则提供了最大的灵活性。

标签: 拖拽页面
分享给朋友:

相关文章

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue实现图片拖拽

vue实现图片拖拽

实现图片拖拽功能 在Vue中实现图片拖拽功能可以通过HTML5的拖放API结合Vue的事件处理来完成。以下是一个完整的实现方法: 基础拖拽实现 为图片元素添加draggable属性并绑定相关事件:…

vue实现页面定位

vue实现页面定位

Vue 实现页面定位的方法 在 Vue 中实现页面定位通常可以通过以下几种方式完成,包括使用原生 JavaScript 的 scrollIntoView 方法、Vue Router 的滚动行为配置,以…

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

vue 实现页面注册

vue 实现页面注册

Vue 实现页面注册功能 创建注册表单组件 在 Vue 项目中创建一个注册表单组件,通常命名为 Register.vue。该组件包含用户名、邮箱、密码等输入字段,以及提交按钮。 <templ…

vue实现拖拽div

vue实现拖拽div

Vue 实现拖拽 Div 的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,结合 Vue 的事件绑定可以快速实现拖拽功能。以下是实现步骤: <template&…