当前位置:首页 > 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 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragg…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

css3制作印章文字

css3制作印章文字

使用CSS3制作印章文字效果 通过CSS3的transform、border-radius和text-shadow等属性,可以模拟传统印章的文字排列和视觉效果。 基本结构 <div clas…

vue实现拖拽插件

vue实现拖拽插件

Vue 拖拽插件实现方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以直接在 Vue 中使用。以下是一个简单的示例: <template> <…

vue实现横向拖拽

vue实现横向拖拽

实现横向拖拽的基本思路 使用 Vue 实现横向拖拽功能通常涉及监听鼠标事件(mousedown、mousemove、mouseup),计算拖拽距离,并动态更新元素位置。以下是核心实现方法: 基础实现…

vue 实现 拖拽组件

vue 实现 拖拽组件

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