增加drag.js

This commit is contained in:
xhf 2025-02-17 17:59:51 +08:00
parent a526874ab7
commit 1696320d5a
2 changed files with 74 additions and 27 deletions

View File

@ -1,31 +1,72 @@
// directives.js
export const vDrag = {
mounted(el) {
el.style.position = 'absolute';
mounted(el, binding) {
const enableDrag = binding.value; // 获取指令绑定的值
if (!enableDrag) return; // 如果为 false则不执行后续拖拽逻辑
el.style.position = 'absolute';
let startX, startY, initialMouseX, initialMouseY;
// 记录元素的初始位置
const initialTop = el.offsetTop;
const initialLeft = el.offsetLeft;
const mousemove = (e) => {
const dx = e.clientX - initialMouseX;
const dy = e.clientY - initialMouseY;
el.style.top = `${startY + dy}px`;
el.style.left = `${startX + dx}px`;
};
let startX, startY, initialMouseX, initialMouseY;
const mouseup = () => {
document.removeEventListener('mousemove', mousemove);
document.removeEventListener('mouseup', mouseup);
};
const mousemove = (e) => {
const dx = e.clientX - initialMouseX;
const dy = e.clientY - initialMouseY;
el.style.top = `${startY + dy}px`;
el.style.left = `${startX + dx}px`;
};
el.addEventListener('mousedown', (e) => {
startX = el.offsetLeft;
startY = el.offsetTop;
initialMouseX = e.clientX;
initialMouseY = e.clientY;
document.addEventListener('mousemove', mousemove);
document.addEventListener('mouseup', mouseup);
e.preventDefault();
});
}
const mouseup = () => {
document.removeEventListener('mousemove', mousemove);
document.removeEventListener('mouseup', mouseup);
};
const mousedown = (e) => {
startX = el.offsetLeft;
startY = el.offsetTop;
initialMouseX = e.clientX;
initialMouseY = e.clientY;
document.addEventListener('mousemove', mousemove);
document.addEventListener('mouseup', mouseup);
e.preventDefault();
};
el.addEventListener('mousedown', mousedown);
// 保存 mousedown 事件处理函数,以便在 updated 中使用
el.__vDragMousedown = mousedown;
// 保存初始位置,以便后续还原
el.__vDragInitialTop = initialTop;
el.__vDragInitialLeft = initialLeft;
},
updated(el, binding) {
const enableDrag = binding.value;
const prevEnableDrag = binding.oldValue;
if (enableDrag && !prevEnableDrag) {
// 如果之前禁用,现在启用,添加 mousedown 事件监听器
el.addEventListener('mousedown', el.__vDragMousedown);
} else if (!enableDrag && prevEnableDrag) {
// 如果之前启用,现在禁用,移除 mousedown 事件监听器
el.removeEventListener('mousedown', el.__vDragMousedown);
// 确保在禁用时停止正在进行的拖拽
document.removeEventListener('mousemove', el.__vDragMousemove);
document.removeEventListener('mouseup', el.__vDragMouseup);
}
},
beforeUnmount(el) {
// 在元素卸载前移除 mousedown 事件监听器
if (el.__vDragMousedown) {
el.removeEventListener('mousedown', el.__vDragMousedown);
}
}
};
// 定义一个还原位置的函数
export const resetDragPosition = (el) => {
if (el.__vDragInitialTop!== undefined && el.__vDragInitialLeft!== undefined) {
el.style.top = `${el.__vDragInitialTop}px`;
el.style.left = `${el.__vDragInitialLeft}px`;
}
};

View File

@ -1,6 +1,7 @@
<template>
<div class="affix-container" :style="{ height: heightVal + 'px' }">
<el-affix target=".affix-container" :offset="80">
<span @click="resetPosition ">回到原点</span>
<div class="affix-container-top">
<el-scrollbar>
<div class="scrollbar-flex-content">
@ -28,7 +29,7 @@
</el-scrollbar>
</div>
</el-affix>
<div class="indexpage-container" v-if="imgUrl" v-drag>
<div class="indexpage-container" v-if="imgUrl" v-drag="true" :style="{scale:1,transformOrigin:'0 0'}" ref="draggableElement">
<div class="indexpage-container-box">
<img :src="imgUrl" alt="" class="indexpage-container-box-img" />
@ -121,7 +122,7 @@
<img :src="item.imgUrl" alt="" style="width: 100%; height: 100%" />
</div>
</div>
<div v-else style="width: 10px; height: 10px; border-radius: 50%; background: red">
<div v-else style="width: 10px; height: 10px; border-radius: 50%; background: #1890ff">
</div>
</div>
</div>
@ -137,7 +138,7 @@ import * as MapApi from '@/api/map/map'
import WebSocketClient from '../webSocket.js'
import storeDialog from './storeDialog.vue'
import { color } from 'echarts'
import { resetDragPosition } from '@/utils/drag'
const imgUrl = ref('')
const socketClient = ref(null)
@ -210,7 +211,12 @@ const getPositionMapListFun = async (positionMapId) => {
}
]
}
const draggableElement = ref(null)
const resetPosition = () => {
if (draggableElement.value) {
resetDragPosition(draggableElement.value);
}
};
const calculateDistanceAndAngle = (point1, point2) => {
//
const dx = point2.left - point1.left