当前位置:首页 > VUE

vue实现印章拖拽效果

2026-01-21 02:23:49VUE

Vue 实现印章拖拽效果

使用 Vue Draggable 库

安装 vuedraggable 库:

npm install vuedraggable --save

引入并注册组件:

import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      stamps: [
        { id: 1, text: "印章1", x: 50, y: 50 },
        { id: 2, text: "印章2", x: 150, y: 150 }
      ]
    };
  }
};

模板中使用:

vue实现印章拖拽效果

<draggable 
  v-model="stamps" 
  @start="onDragStart" 
  @end="onDragEnd"
  :options="{ handle: '.stamp-handle' }">
  <div v-for="stamp in stamps" :key="stamp.id" class="stamp">
    <div class="stamp-handle">{{ stamp.text }}</div>
  </div>
</draggable>

自定义拖拽实现

通过 Vue 的 @mousedown@mousemove@mouseup 事件实现基础拖拽:

export default {
  data() {
    return {
      stamps: [
        { id: 1, text: "印章", x: 0, y: 0, isDragging: false }
      ],
      dragStart: { x: 0, y: 0 }
    };
  },
  methods: {
    startDrag(stamp, event) {
      stamp.isDragging = true;
      this.dragStart.x = event.clientX - stamp.x;
      this.dragStart.y = event.clientY - stamp.y;
    },
    onDrag(stamp, event) {
      if (stamp.isDragging) {
        stamp.x = event.clientX - this.dragStart.x;
        stamp.y = event.clientY - this.dragStart.y;
      }
    },
    stopDrag(stamp) {
      stamp.isDragging = false;
    }
  }
};

模板部分:

vue实现印章拖拽效果

<div 
  v-for="stamp in stamps" 
  :key="stamp.id"
  class="stamp"
  :style="{ left: stamp.x + 'px', top: stamp.y + 'px' }"
  @mousedown="startDrag(stamp, $event)"
  @mousemove="onDrag(stamp, $event)"
  @mouseup="stopDrag(stamp)"
  @mouseleave="stopDrag(stamp)">
  {{ stamp.text }}
</div>

样式优化

为印章添加基础样式:

.stamp {
  position: absolute;
  width: 100px;
  height: 100px;
  border: 2px dashed #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: move;
  user-select: none;
  background-color: rgba(255, 0, 0, 0.2);
  border-radius: 50%;
}

边界限制

防止拖拽超出容器范围:

onDrag(stamp, event) {
  if (stamp.isDragging) {
    const container = this.$el.getBoundingClientRect();
    const maxX = container.width - 100; // 印章宽度
    const maxY = container.height - 100;

    stamp.x = Math.max(0, Math.min(event.clientX - this.dragStart.x, maxX));
    stamp.y = Math.max(0, Math.min(event.clientY - this.dragStart.y, maxY));
  }
}

触摸屏适配

添加触摸事件支持:

<div
  @touchstart="startDrag(stamp, $event.touches[0])"
  @touchmove="onDrag(stamp, $event.touches[0])"
  @touchend="stopDrag(stamp)">
</div>

标签: 印章拖拽
分享给朋友:

相关文章

vue实现图标拖拽

vue实现图标拖拽

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

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template…

vue拖拽实现

vue拖拽实现

vue拖拽实现方法 使用HTML5原生拖拽API HTML5提供原生拖拽API,通过draggable属性、dragstart、dragend等事件实现基础拖拽功能。 <template>…

vue拖拽容器实现

vue拖拽容器实现

Vue 拖拽容器实现方法 在 Vue 中实现拖拽容器功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来实现。以下是两种方法的详细说明。 使用 HTML5 拖放…

前端vue实现拖拽

前端vue实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现拆分拖拽

vue实现拆分拖拽

Vue 实现拆分拖拽功能 拆分拖拽通常指将一个元素拆分为多个部分,并允许用户通过拖拽重新排列或组合这些部分。以下是实现这一功能的几种方法: 使用 Vue.Draggable 库 Vue.Dragg…