vue拖拽图片

发布于:2024-12-06 ⋅ 阅读:(128) ⋅ 点赞:(0)

这是我封装的组件大家直接用就好

我的gitee仓库地址 拖拽(父子) · 刘志辉/vue功能 - 码云 - 开源中国

//使用页面参考文档

//标签内

:imgSrc="'../img/tibet-1.jpg'"         <!-- 设置图片路径 -->

@dragstart="handleDragStart"    <!-- 监听拖拽开始位置事件 -->

@dragend="handleDragEnd"      <!-- 监听拖拽结束位置事件 -->

//注意

如果使用的是 Vue CLI 或 Vite 来构建项目,../img/tibet-1.jpg 的相对路径可能会导致加载问题,特别是如果文件放在了 public 目录外。

解决方案:

推荐:将图片放在 public 目录中,public 文件夹中的内容会被自动拷贝到输出目录,路径从根目录开始引用。因此,你可以将图片放入 public 文件夹,然后使用 /img/tibet-1.jpg 路径来加载。

将图片放在 assets 文件夹并通过 require 或 import 引入: 如果图片存放在 src/assets 文件夹中,你可以使用 import 或 require 来导入图片。

:imgSrc自己把路径换成活的就好

目前支持的是传递单张图片以及拖拽

//使用页面

<template>
  <!-- 图片 -->
  <Draggable
    imgSrc="/img/tibet-5.jpg"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  />
</template>

<script setup>
import Draggable from "../views/tz.vue"; // 引入 Draggable 组件
// 拖拽开始时触发的回调
function handleDragStart(event) {
  console.log("拖拽开始位置:", event); // 打印拖拽开始位置
}
// 拖拽结束时触发的回调
function handleDragEnd(event) {
  console.log("拖拽结束位置:", event); // 打印拖拽结束位置
}
</script>

 //组件页面

<template>
  <div
    style="position: relative; width: 100%; height: 100vh; overflow: hidden"
  >
    <img
      :src="props.imgSrc"
      alt="drag-image"
      class="drag_box mycss"
      draggable="true"
      @dragstart="dragstart"
      @dragend="dragend"
      :style="{ left: `${elLeft}px`, top: `${elTop}px` }"
    />
  </div>
</template>

<script setup>
import { ref, defineProps, defineEmits } from "vue";

// 接收父组件传入的参数(props)
const props = defineProps({
  imgSrc: String,
});

// 定义事件
const emit = defineEmits();

// 定义响应式变量
let elLeft = ref(40); // 左偏移量
let elTop = ref(40); // 上偏移量
let startPosition = ref({ x: 0, y: 0 }); // 记录拖拽开始时的鼠标位置
let isFirstDrag = ref(true); // 判断是否是首次拖拽
// 拖拽开始事件
function dragstart(e) {
  startPosition.value = { x: e.clientX, y: e.clientY }; // 记录开始时的鼠标位置
  e.target.style.transition = "none"; // 禁止拖拽时的过渡效果
  if (isFirstDrag.value) {
    // 首次拖拽时,计算初始位置
    const rect = e.target.getBoundingClientRect();
    elLeft.value = rect.left;
    elTop.value = rect.top;
    isFirstDrag.value = false; // 更新首次拖拽状态
  }
  e.target.classList.remove("mycss"); // 移除mycss类
  emit("dragstart", startPosition.value);
}

// 拖拽结束事件
function dragend(e) {
  const deltaX = e.clientX - startPosition.value.x;
  const deltaY = e.clientY - startPosition.value.y;
  elLeft.value += deltaX; // 更新元素的左偏移量
  elTop.value += deltaY; // 更新元素的上偏移量
  emit("dragend", { x: elLeft.value, y: elTop.value });
}
</script>

<style scoped>
.drag_box {
  position: absolute;
  user-select: none;
  cursor: move;
  height: 70%;
}
.mycss {
  left: 50% !important;
  top: 50% !important;
  transform: translate(-50%, -50%);
}
</style>


网站公告

今日签到

点亮在社区的每一天
去签到