Vue全局自定义指令Modal拖拽的示例分析
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章将为大家详细讲解有关Vue全局自定义指令Modal拖拽的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景最近一直在做的项目是Vue2搭建的项目,U
千家信息网最后更新 2025年02月23日Vue全局自定义指令Modal拖拽的示例分析背景
实现思路
实现效果
这篇文章将为大家详细讲解有关Vue全局自定义指令Modal拖拽的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
背景
最近一直在做的项目是Vue2搭建的项目,UI框架用的antdV,项目中用到了很多Modal对话框,然后突然有一天产品说:"这个对话框为什么不能移动啊,挡住我看信息了",那没办法,有需求就得做,这就是新生代打工人。
首先我去antdV官网看Modal的配置属性和方法,看看有没有这方面的属性或者方法可以直接解决,无奈没有找到。第二步开始问百度,相关的博客也有一些,但是总的来说五花八门,不是特别好搞懂,然后发现有个使用全局自定义指定的方式好像有点意思,然后开始自己的实操解决需求。
实现思路
首先我们主要是要完成鼠标放在Modal框的头部部分时按住左键移动后对话框移动的一个效果。
这里我们要获取头部的元素并监听它的onmousedown方法,然后在onmousedown方法时通过计算对话框的高度宽度设定边界限制不让它移动到屏幕外,然后要监听_document.onmousemove的方法计算鼠标移动的方向和距离,然后依据这个调整对话框的位置即可。
代码实现
import Vue from 'vue'// 弹窗拖拽属性/** * @directive 自定义属性 * @todo 弹窗拖拽属性 * @desc 使用在弹窗内部任意加载的html添加v-drag * @param .ant-modal-header 弹窗头部用来拖动的属性 * @param .ant-modal 拖动的属性*/Vue.directive('drag', (el, binding, vnode, oldVnode) => { // inserted (el, binding, vnode, oldVnode) { Vue.nextTick(() => { const isThemeModal = el.classList.contains('grid-theme') const dialogHeaderEl = isThemeModal ? el.querySelector('.ant-tabs-bar') : document.querySelector('.ant-modal-header') const dragDom = isThemeModal ? el.querySelector('.ant-modal') : document.querySelector('.ant-modal') // dialogHeaderEl.style.cursor = 'move'; dialogHeaderEl.style.cssText += ';cursor:move;' // dragDom.style.cssText += ';top:0px;' // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null); const sty = (function () { if (window.document.currentStyle) { return (dom, attr) => dom.currentStyle[attr] } else { return (dom, attr) => getComputedStyle(dom, false)[attr] } })() dialogHeaderEl.onmousedown = (e) => { // 鼠标按下,计算当前元素距离可视区的距离 const disX = e.clientX - dialogHeaderEl.offsetLeft const disY = e.clientY - dialogHeaderEl.offsetTop const screenWidth = document.body.clientWidth // body当前宽度 const screenHeight = document.documentElement.clientHeight // 可见区域高度(应为body高度,可某些环境下无法获取) const dragDomWidth = dragDom.offsetWidth // 对话框宽度 const dragDomheight = dragDom.offsetHeight // 对话框高度 const minDragDomLeft = dragDom.offsetLeft const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth - (isThemeModal ? 10 : 0) const minDragDomTop = dragDom.offsetTop const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight - (isThemeModal ? 10 : 0) // 获取到的值带px 正则匹配替换 let styL = sty(dragDom, 'left') let styT = sty(dragDom, 'top') // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px if (styL.includes('%')) { // eslint-disable-next-line no-useless-escape styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100) // eslint-disable-next-line no-useless-escape styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100) } else { styL = +styL.replace(/\px/g, '') styT = +styT.replace(/\px/g, '') }; _document.onmousemove = function (e) { // 通过事件委托,计算移动的距离 let left = e.clientX - disX let top = e.clientY - disY // 边界处理 if (-(left) > minDragDomLeft) { left = -(minDragDomLeft) } else if (left > maxDragDomLeft) { left = maxDragDomLeft } if (-(top) > minDragDomTop) { top = -(minDragDomTop) } else if (top > maxDragDomTop) { top = maxDragDomTop } // 移动当前元素 dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;` } _document.onmouseup = function (e) { _document.onmousemove = null _document.onmouseup = null } } })})
组件调用
a-modal组件设置v-drag即可
...... 确定删除字段吗
实现效果
关于"Vue全局自定义指令Modal拖拽的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
属性
移动
对话框
对话
元素
方法
高度
全局
头部
宽度
篇文章
组件
项目
鼠标
指令
示例
分析
效果
更多
边界
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器性能监控的行业前景
网页后台数据库如何连接
东营慧星软件开发
搭建网络安全系统
佛山pc软件开发设计
互联网科技传媒公司招聘
足球滚球概率统计数据库
大学生网络安全法规
嘉兴数据库培训机构
软件开发中级证书有用吗
服务器不能识别usb3
荔湾区国内网络技术开发公司
数据库锁的使用场景
淘宝租的服务器安全吗
军营网络安全标语
判断数据库中是否已经存在
广西任务态势系统软件开发
小程序制作公司的服务器怎么收费
net应用软件开发就业
rust助手服务器管理工具
软件开发自评估
存储阵列服务器支持硬盘体检功能
什么手机软件可以修改数据库
阿里服务器建站
广电网络技术部工作计划
计算机网络技术数据通信技术
东阳科技互联网推广
数据库 字符型
即墨区管理软件开发系统
数据库日期怎么输出