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

vue实现a-model弹窗拖拽移动

通过自定义拖拽指令实现

实现效果

拖动顶部,可对整个弹窗实施拖拽(如果需要拖动底部、中间内容实现拖拽,把下面的ant-modal-header对应改掉就行)

请添加图片描述

代码实现

编写自定义指令

新建一个ts / js文件,用ts举例

import Vue from "vue";// 自定义指令使弹窗可拖动Vue.directive("drag-modal", (el, bindings, vnode) => {Vue.nextTick(() => {// 获取弹窗的属性let { visible, destroyOnClose } = vnode.componentInstance as any;if (!visible) return;let modal: any = el.getElementsByClassName("ant-modal")[0];let header: any = el.getElementsByClassName("ant-modal-header")[0];header.style.cursor = "move"; // 移动到顶部时,鼠标变成“移动”图// 存储上一次拖拽完成时的偏移数据let left = 0;let top = 0;// 未定义 destroyOnClose 时,dom未被销毁,关闭弹窗再次打开,弹窗会停留在上一次拖动的位置if (!destroyOnClose) {left = modal.left || 0;top = modal.top || 0;}// top 初始值为 offsetTop// 因为 modal 初始就有垂直偏移,水平方向没有(是用 margin 保证 modal 在中间的)if (typeof modal.left !== "number") {top = top || modal.offsetTop;}header.onmousedown = (e: any) => {let startX = e.clientX;let startY = e.clientY;el.onmousemove = (event) => {let endX = event.clientX;let endY = event.clientY;modal.left = endX - startX + left; // 记录实时偏移量,数字格式modal.top = endY - startY + top;modal.style.left = modal.left + "px"; // 实时改变modal偏移modal.style.top = modal.top + "px";};el.onmouseup = (event) => {left = modal.left; // 存储偏移量,便于下一次拖拽使用top = modal.top;el.onmousemove = null;el.onmouseup = null;header.releaseCapture && header.releaseCapture(); // 释放捕捉鼠标或键盘事件};header.setCapture && header.setCapture(); // 捕获鼠标或键盘事件,使得即使鼠标移出元素范围或失去焦点,元素仍然可以接收这些事件};});
});

使用方式

使用

<a-modalv-drag-modal:visible="visible":destroyOnClose="true"...
>

选择性添加destroyoncLose属性,添加此属性则弹窗每次打开会回到初始位置

引入

import "@/common/utils/drag-modal";
http://www.lryc.cn/news/399080.html

相关文章:

  • 速盾:如何加强网站的安全性
  • 【PyTorch单点知识】自动求导机制的原理与实践
  • 【Java】搜索引擎设计:信息搜索怎么避免大海捞针?
  • 【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix
  • 痉挛性斜颈对生活有哪些影响?
  • Javassist 修改 jar 包里的 class 文件
  • 交换机的二三层原理
  • HarmonyOS ArkUi 字符串<展开/收起>功能
  • Lianwei 安全周报|2024.07.09
  • 火遍全网的15个Python的实战项目,你该不会还不知道怎么用吧!
  • 快速使用BRTR公式出具的大模型Prompt提示语
  • Xilinx FPGA DDR4 接口的 PCB 准则
  • 神经网络 | Transformer 基本原理
  • 浅析 VO、DTO、DO、PO 的概念
  • 7.8 CompletableFuture
  • iPad锁屏密码忘记怎么办?有什么方法可以解锁?
  • 了解并缓解 IP 欺骗攻击
  • java LogUtil输出日志打日志的class文件内具体方法和行号
  • 02. Hibernate 初体验之持久化对象
  • MySQL超详细学习教程,2023年硬核学习路线
  • 初识SpringBoot
  • Qt之元对象系统
  • Provider(1)- 什么是AudioBufferProvider
  • 加密与安全_密钥体系的三个核心目标之完整性解决方案
  • 【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)
  • 昇思25天学习打卡营第13天|基于MindNLP+MusicGen生成自己的个性化音乐
  • nigix的下载使用
  • nginx+lua 实现URL重定向(根据传入的参数条件)
  • 算法学习笔记(8.4)-完全背包问题
  • C++catch (...)陈述