当前位置:首页 > VUE

vue实现固定块拖拽

2026-02-22 03:20:15VUE

Vue 实现固定块拖拽的方法

使用 HTML5 拖放 API

在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖拽功能。需要为元素添加 draggable 属性,并监听 dragstartdragoverdrop 事件。

<template>
  <div
    class="draggable-block"
    draggable="true"
    @dragstart="handleDragStart"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      const draggedElement = document.getElementById(data);
      e.target.appendChild(draggedElement);
    }
  }
};
</script>

使用第三方库 vue-draggable

vue-draggable 是一个基于 Sortable.js 的 Vue 拖拽组件库,适用于列表和网格的拖拽排序。

安装 vue-draggable:

npm install vuedraggable

使用示例:

<template>
  <draggable v-model="list" @end="onDragEnd">
    <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' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

自定义拖拽逻辑

如果需要更灵活的拖拽控制,可以通过监听鼠标事件(mousedownmousemovemouseup)实现自定义拖拽。

vue实现固定块拖拽

<template>
  <div
    class="draggable-block"
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
    @mousedown="startDrag"
  >
    拖拽我
  </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.drag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    drag(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.drag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

注意事项

  • 拖拽性能优化:对于复杂的拖拽场景,避免频繁的 DOM 操作,可以使用 CSS transform 替代 topleft
  • 移动端适配:如果需要支持移动端,需额外处理 touchstarttouchmovetouchend 事件。
  • 拖拽边界限制:可以通过计算边界值限制拖拽范围,确保元素不会超出容器。

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

相关文章

vue实现截图

vue实现截图

Vue 实现截图的方法 使用 html2canvas 库 安装 html2canvas 库: npm install html2canvas 在 Vue 组件中使用: import html2ca…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue实现按钮

vue实现按钮

Vue 实现按钮的方法 使用原生 HTML 按钮 在 Vue 模板中可以直接使用 HTML 的 <button> 元素,通过 v-on 或 @ 绑定点击事件。 <template&…

vue实现定位打卡

vue实现定位打卡

Vue 实现定位打卡功能 获取用户地理位置 使用浏览器提供的 Geolocation API 获取用户当前位置坐标。在 Vue 组件中可以通过 navigator.geolocation 调用。 m…

vue路由实现介绍

vue路由实现介绍

Vue 路由实现介绍 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。它通过动态映射组件到路由实现页面无刷新切换,同时支持嵌套路由、路由参数、导航守卫等高级功能…