Vue全局自定义指令Modal拖拽的示例分析
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章将为大家详细讲解有关Vue全局自定义指令Modal拖拽的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景最近一直在做的项目是Vue2搭建的项目,U
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
删除数据库文件的命令
赛博朋克桑多拉的数据库
小白网络技术教学视频
oppo网络安全吗
网络安全梯队
sapibp是什么数据库
第2章网络安全技术基础
虚拟机修复数据库
唐山百德福网络技术有限公司
知乎软件开发的方向
基础网络安全评估报告
学数据库应该先学什么科目
巢湖公司二手服务器回收信息推荐
国家对校园网络安全的要求
勇士软件开发俱乐部
周鸿祎提高网络安全意识
网络安全宣传周特别节目观后感
光年小说软件开发
空间相册点不开提示服务器繁忙
泰兴进口网络技术厂家价格
服务器登录达梦数据库
国内的交友软件开发
服务器运行速度对照表
软件开发适合用苹果电脑吗
中药研究相关最新数据库
无法从服务器获取信息
句容软件开发文档
我的世界服务器麦C大道
服务器管理器中搭建服务器
本溪互助盘软件开发