本文主要是介绍[vue 日志]el-dialog拖拽记录,包含不出边界代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 代码
新建drag.js
文件
/**
* v-dialogDrag 弹窗拖拽
*/export default {bind(el, binding, vnode, oldVnode) {const value = binding.valueif (value == false) return// 获取拖拽内容头部const dialogHeaderEl = el.querySelector('.el-dialog__header');const dragDom = el.querySelector('.el-dialog');dialogHeaderEl.style.cursor = 'move';// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);dragDom.style.position = 'absolute';dragDom.style.marginTop = 0;dragDom.style.top = '15vh';//默认top,可根据实际传入修改let width = dragDom.style.width;if (width.includes('%')) {width = +document.body.clientWidth * (+width.replace(/\%/g, '') / 100);} else {width = +width.replace(/\px/g, '');}dragDom.style.left = `${(document.body.clientWidth - width) / 2}px`;// 鼠标按下事件dialogHeaderEl.onmousedown = (e) => {// 鼠标按下,计算当前元素距离可视区的距离 (鼠标点击位置距离可视窗口的距离)const disX = e.clientX - dialogHeaderEl.offsetLeft;const disY = e.clientY - dialogHeaderEl.offsetTop;// 获取到的值带px 正则匹配替换let styL, styT;// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为pxif (sty.left.includes('%')) {styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);} else {styL = +sty.left.replace(/\px/g, '');styT = +sty.top.replace(/\px/g, '');};// 鼠标拖拽事件document.onmousemove = function (e) {// 通过事件委托,计算移动的距离 (开始拖拽至结束拖拽的距离)const l = e.clientX - disX;const t = e.clientY - disY;let finallyL = l + styLlet finallyT = t + styT//不出边界if (finallyL < 0) {finallyL = 0} else if (finallyL > dragDom.offsetParent.clientWidth - dragDom.clientWidth - dragDom.offsetParent.offsetLeft) {finallyL = dragDom.offsetParent.clientWidth - dragDom.clientWidth - dragDom.offsetParent.offsetLeft}if (finallyT < 0) {finallyT = 0} else if (finallyT > dragDom.offsetParent.clientHeight - dragDom.clientHeight - dragDom.offsetParent.offsetLeft) (finallyT = dragDom.offsetParent.clientHeight - dragDom.clientHeight - dragDom.offsetParent.offsetLeft)// 移动当前元素dragDom.style.left = `${finallyL}px`;dragDom.style.top = `${finallyT}px`;};document.onmouseup = function (e) {document.onmousemove = null;document.onmouseup = null;};}}
};
2.在main.js中引入
import './js/drag.js'
3.在el-dialog标签中加入v-dialogDrag属性
属性 close-on-click-modal 取消自动关闭
属性 modal:关闭遮罩
属性 class:注意class添加,overflow hidden否则有溢出
4.使用
<el-dialog v-dialogDrag :close-on-click-modal="false" :modal="false" class="my-dialog">xxx</el-dialog>
这篇关于[vue 日志]el-dialog拖拽记录,包含不出边界代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!