Vue全局自定义指令Modal拖拽的示例分析
发表于:2024-10-17 作者:千家信息网编辑
千家信息网最后更新 2024年10月17日,这篇文章将为大家详细讲解有关Vue全局自定义指令Modal拖拽的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景最近一直在做的项目是Vue2搭建的项目,U
千家信息网最后更新 2024年10月17日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安全错误
数据库的锁怎样保障安全
河南万象互联网科技有限公司
怀旧服服务器可以直接买么
数据库结果保存时引文格式共有1
珠海市嘻嘻网络技术有限公司
dell 服务器断电
学什么软件开发技术就业好
网络安全漏洞防范论文
网络安全技术包括哪两个
服务器需要安装什么环境工具
网鱼杀毒服务器管理
阿里云服务器搭配方案
海南计算机网络技术学校
idea怎么添加数据库驱动
中国大地保险软件开发
门户网站 网络安全
计算机中的小机和服务器的区别
苏州阿里云服务器分析
企业内部服务器构建
肥东企业网络技术咨询怎么样
数据库 时分秒
管理软件开发费用标准
宽带缓存服务器 教程
数据库快速预览版是否收费
数据库怎么限制sql语句
新冠病毒网络安全
pi实时数据库视频教程
淘宝购买的图书馆数据库
广电网络技术发展中心
excel服务器财务管理
深圳市网络安全大赛