|
|
@@ -71,75 +71,91 @@ const textarea1 = ref("")
|
|
|
const dialogVisible2 = ref(false)
|
|
|
const Full_Screen = ref(false)
|
|
|
const vDraggable = {
|
|
|
- mounted(el, binding) {
|
|
|
- let isDragging = false;
|
|
|
- let offsetX = 0;
|
|
|
- let offsetY = 0;
|
|
|
- let startTime = '';
|
|
|
-
|
|
|
- const onMouseDown = (event) => {
|
|
|
-
|
|
|
- isDragging = true;
|
|
|
- startTime = new Date().getTime();
|
|
|
- offsetX = event.clientX - el.offsetLeft;
|
|
|
- offsetY = event.clientY - el.offsetTop;
|
|
|
-
|
|
|
- document.body.style.userSelect = "none";
|
|
|
- document.addEventListener("mousemove", onMouseMove);
|
|
|
- document.addEventListener("mouseup", onMouseUp);
|
|
|
- };
|
|
|
-
|
|
|
- const onMouseMove = (event) => {
|
|
|
- let endTime = new Date().getTime();
|
|
|
- if (isDragging && (endTime - startTime > 200)) {
|
|
|
- el.style.left = `${event.clientX - offsetX}px`;
|
|
|
- el.style.top = `${event.clientY - offsetY}px`;
|
|
|
-
|
|
|
- // Vue 3 中需要通过 binding.value 传递回调函数
|
|
|
- if (binding.value?.updatePosition) {
|
|
|
- binding.value.updatePosition({
|
|
|
- x: event.clientX - offsetX,
|
|
|
- y: event.clientY - offsetY
|
|
|
- });
|
|
|
+ mounted(el, binding) {
|
|
|
+ let isDragging = false;
|
|
|
+ let offsetX = 0;
|
|
|
+ let offsetY = 0;
|
|
|
+ let startTime = 0;
|
|
|
+
|
|
|
+ const onMouseDown = (event) => {
|
|
|
+ event.preventDefault();
|
|
|
+ event.stopPropagation();
|
|
|
+
|
|
|
+ console.log('按下');
|
|
|
+ isDragging = true;
|
|
|
+ startTime = Date.now();
|
|
|
+
|
|
|
+ // 获取元素当前位置
|
|
|
+ const rect = el.getBoundingClientRect();
|
|
|
+ offsetX = event.clientX - rect.left;
|
|
|
+ offsetY = event.clientY - rect.top;
|
|
|
+
|
|
|
+ // 确保元素有定位
|
|
|
+ if (getComputedStyle(el).position === 'static') {
|
|
|
+ el.style.position = 'fixed';
|
|
|
+ }
|
|
|
+
|
|
|
+ document.addEventListener("mousemove", onMouseMove);
|
|
|
+ document.addEventListener("mouseup", onMouseUp);
|
|
|
+ document.body.style.cursor = 'move';
|
|
|
+ document.body.style.userSelect = 'none';
|
|
|
+ };
|
|
|
+
|
|
|
+ const onMouseMove = (event) => {
|
|
|
+ if (!isDragging) return;
|
|
|
+
|
|
|
+ console.log('移动');
|
|
|
+
|
|
|
+ // 计算新位置
|
|
|
+ const x = event.clientX - offsetX;
|
|
|
+ const y = event.clientY - offsetY;
|
|
|
+
|
|
|
+ // 设置位置
|
|
|
+ el.style.left = `${x}px`;
|
|
|
+ el.style.top = `${y}px`;
|
|
|
+
|
|
|
+ // 回调
|
|
|
+ if (binding.value?.updatePosition) {
|
|
|
+ binding.value.updatePosition({ x, y });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const onMouseUp = (event) => {
|
|
|
+ console.log('松开');
|
|
|
+
|
|
|
+ const endTime = Date.now();
|
|
|
+
|
|
|
+ // 判断点击(短按)还是拖动
|
|
|
+ if (isDragging && endTime - startTime < 200) {
|
|
|
+ if (binding.value?.onClick) {
|
|
|
+ binding.value.onClick(event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清理
|
|
|
+ isDragging = false;
|
|
|
+ document.removeEventListener("mousemove", onMouseMove);
|
|
|
+ document.removeEventListener("mouseup", onMouseUp);
|
|
|
+ document.body.style.cursor = '';
|
|
|
+ document.body.style.userSelect = '';
|
|
|
+ };
|
|
|
+
|
|
|
+ // 寻找拖动句柄
|
|
|
+ const headerEl = el.querySelector(".window-header") || el;
|
|
|
+ headerEl.style.cursor = 'move';
|
|
|
+ headerEl.addEventListener("mousedown", onMouseDown);
|
|
|
+
|
|
|
+ // 保存引用
|
|
|
+ el._draggable = { onMouseDown, headerEl };
|
|
|
+ },
|
|
|
+
|
|
|
+ unmounted(el) {
|
|
|
+ if (el._draggable) {
|
|
|
+ const { onMouseDown, headerEl } = el._draggable;
|
|
|
+ headerEl.removeEventListener("mousedown", onMouseDown);
|
|
|
+ delete el._draggable;
|
|
|
}
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const onMouseUp = () => {
|
|
|
- isDragging = false;
|
|
|
- let endTime = new Date().getTime();
|
|
|
-
|
|
|
- if (endTime - startTime < 200) {
|
|
|
- // 通过 binding.value 调用回调
|
|
|
- if (binding.value && binding.value.onClick) {
|
|
|
- binding.value.onClick();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- document.body.style.userSelect = "";
|
|
|
- document.removeEventListener("mousemove", onMouseMove);
|
|
|
- document.removeEventListener("mouseup", onMouseUp);
|
|
|
- };
|
|
|
-
|
|
|
- // 确保元素有 window-header 类
|
|
|
- const headerEl = el.querySelector(".window-header");
|
|
|
- if (headerEl) {
|
|
|
- headerEl.addEventListener("mousedown", onMouseDown);
|
|
|
- }
|
|
|
-
|
|
|
- // 保存事件监听器引用以便卸载时清理
|
|
|
- el._draggable = { onMouseDown, headerEl };
|
|
|
- },
|
|
|
-
|
|
|
- unmounted(el) {
|
|
|
- // 清理事件监听器
|
|
|
- if (el._draggable) {
|
|
|
- const { onMouseDown, headerEl } = el._draggable;
|
|
|
- if (headerEl) {
|
|
|
- headerEl.removeEventListener("mousedown", onMouseDown);
|
|
|
- }
|
|
|
}
|
|
|
- }
|
|
|
};
|
|
|
|
|
|
const position = ref({
|