当前位置:首页 > VUE

vue 实现div拖拽

2026-03-10 00:40:17VUE

Vue 实现 Div 拖拽的方法

使用原生 HTML5 拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。

<template>
  <div
    class="draggable"
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
      e.target.style.opacity = '0.4';
    },
    handleDragEnd(e) {
      e.target.style.opacity = '1';
    }
  }
};
</script>

<style>
.draggable {
  width: 100px;
  height: 100px;
  background-color: #42b983;
  cursor: move;
}
</style>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更高级的拖拽功能。

vue 实现div拖拽

安装 Vue.Draggable:

npm install vuedraggable

示例代码:

vue 实现div拖拽

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

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

自定义拖拽实现

通过监听鼠标事件实现自定义拖拽逻辑。

<template>
  <div
    class="draggable"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="stopDrag"
    :style="dragStyle"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  computed: {
    dragStyle() {
      return {
        transform: `translate(${this.offsetX}px, ${this.offsetY}px)`
      };
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    onDrag(e) {
      if (this.isDragging) {
        this.offsetX = e.clientX - this.startX;
        this.offsetY = e.clientY - this.startY;
      }
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
};
</script>

<style>
.draggable {
  width: 100px;
  height: 100px;
  background-color: #42b983;
  cursor: move;
  position: absolute;
}
</style>

拖拽边界限制

在自定义拖拽实现中,可以添加边界限制防止元素拖出可视区域。

onDrag(e) {
  if (this.isDragging) {
    const newX = e.clientX - this.startX;
    const newY = e.clientY - this.startY;

    const maxX = window.innerWidth - 100;
    const maxY = window.innerHeight - 100;

    this.offsetX = Math.max(0, Math.min(newX, maxX));
    this.offsetY = Math.max(0, Math.min(newY, maxY));
  }
}

以上方法提供了不同复杂度的拖拽实现方案,可以根据项目需求选择合适的方式。原生 API 适合简单场景,Vue.Draggable 适合列表排序,自定义实现则提供最大的灵活性。

标签: 拖拽vue
分享给朋友:

相关文章

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axios…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…

vue cli 实现

vue cli 实现

Vue CLI 实现步骤 安装 Vue CLI 确保 Node.js 版本在 8.9 或以上。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 创建新项目 使…

vue实现导航

vue实现导航

使用 Vue Router 实现导航 Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页应用(SPA)的导航系统。以下是实现导航的基本步骤。 安装 Vue Router n…

vue实现指引

vue实现指引

Vue 实现指引功能 Vue 中实现指引功能可以通过多种方式完成,常见的有使用第三方库或自定义实现。以下是几种常见方法: 使用第三方库(如 driver.js) 安装 driver.js: np…

vue实现word在线

vue实现word在线

Vue 实现 Word 在线编辑与预览 方案一:使用 docx.js 与前端解析 安装依赖库 docx 和 file-saver,用于生成和下载 Word 文件: npm install docx…