当前位置: 首页 > news >正文

vue3 + antd modal弹窗拖拽全局封装 使用useDraggable

建一个draggable.js

// draggableDirective.js
import { ref, watch, watchEffect } from 'vue';import { useDraggable } from '@vueuse/core';const draggableDirective = {mounted(el) {const { isDragging, x, y } = useDraggable(el);const startX = ref(0);const startY = ref(0);const startedDrag = ref(false);const transformX = ref(0);const transformY = ref(0);const preTransformX = ref(0);const preTransformY = ref(0);const dragRect = ref({left: 0,right: 0,top: 0,bottom: 0,});watch([x, y], () => {if (!startedDrag.value) {startX.value = x.value;startY.value = y.value;const bodyRect = document.body.getBoundingClientRect();const titleRect = el.getBoundingClientRect();dragRect.value.right = bodyRect.width - titleRect.width;dragRect.value.bottom = bodyRect.height - titleRect.height;preTransformX.value = transformX.value;preTransformY.value = transformY.value;}startedDrag.value = true;});watch(isDragging, () => {if (!isDragging.value) {startedDrag.value = false;}});const updateTransform = () => {const modelCenter = el.closest('.ant-modal-content');modelCenter.style.transform = `translate(${transformX.value}px, ${transformY.value}px)`;};watchEffect(() => {if (startedDrag.value) {// 允许拖拽到看不见// transformX.value = preTransformX.value + x.value - startX.value;// transformY.value = preTransformY.value + y.value - startY.value;// 拖拽边靠近title时就拖拽不动了transformX.value =preTransformX.value +Math.min(Math.max(dragRect.value.left, x.value),dragRect.value.right,) -startX.value;transformY.value =preTransformY.value +Math.min(Math.max(dragRect.value.top, y.value),dragRect.value.bottom,) -startY.value;updateTransform();}});},
};export default draggableDirective;

在main.js中注入

使用时在modal内加入

<template #title><div style="width: 100%; cursor: move" v-draggable>采购申请</div></template>

http://www.dtcms.com/a/338315.html

相关文章:

  • LeetCode100 -- Day1
  • 嵌入式工程师常去的网址
  • 缺陷检测最新综述:针对现实世界工业缺陷检测的综合调查:挑战、方法与展望
  • C++对象的内存布局
  • 拓扑排序详解:从力扣 207 题看有向图环检测
  • 2025年最新美区Apple ID共享账号免费分享(持续更新)
  • 决策树(1)
  • 2025年秋招Java后端面试场景题+八股文题目
  • pandas基本数据
  • 开疆智能Profient转EtherCAT网关连接伦茨变频器配置案例
  • DeepSeek辅助编写的将ET格式文件转换为xls和xlsb格式程序
  • 数据结构:查找表
  • Unity爆炸力场实战指南
  • 94、23种设计模式之工厂方法模式
  • 循序渐进学 Spring (下):从注解、AOP到底层原理与整合实战
  • SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!
  • SpringBoot3整合OpenAPI3(Swagger3)完整指南
  • 王树森深度强化学习DRL(三)围棋AlphaGo+蒙特卡洛
  • Laravel中如何使用php-casbin
  • MP4 文件格式验证工具
  • onRequestHide at ORIGIN_CLIENT reason HIDE_SOFT_INPUT fromUser false
  • kafka的pull的依据
  • python 数据拟合(线性拟合、多项式回归)
  • 【2025CVPR-目标检测方向】学习稳健且硬件自适应的对象检测器,以应对边缘设备的延迟攻击
  • 【K8s】K8s 服务优雅下线调试记录
  • C# NX二次开发:字符串控件StringBlock讲解
  • 【MongoDB】常见八股合集,mongodb的特性,索引使用,优化,事务,ACID,聚合查询,数据复制机制,理解其基于raft的选举机制
  • 虚拟货币(BTC)走势分析指标体系
  • JMeter与大模型融合应用之构建AI智能体:评审性能测试脚本
  • 浅入浅出常见敏感数据处理的加密算法