开发完后台管理系统的弹出框模块,被添加拖拽和拉伸功能,看了很多网上成熟的帖子引到项目里总有一点问题,下面是根据自己的需求实现的步骤:

首先在vue项目中创建一个js文件eg:dialog.js

 import Vue from 'vue'
// v-dialogDrag: 弹窗拖拽属性
Vue.directive('dialogDrag', {
bind (el, binding, vnode, oldVnode) {
     // 自定义属性,判断是否可拖拽 
if (!binding.value) return
const dialogHeaderEl = el.querySelector('.el-dialog__header')
const dragDom = el.querySelector('.el-dialog')
dialogHeaderEl.style.cssText += ';cursor:move;'
dragDom.style.cssText += ';top:0px;' // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = (function () {
if (document.body.currentStyle) {
// 在ie下兼容写法
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 const minDragDomTop = dragDom.offsetTop
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight // 获取到的值带px 正则匹配替换
let styL = sty(dragDom, 'left')
     // 为兼容ie 
if (styL === 'auto') styL = '0px'
let styT = sty(dragDom, 'top') console.log(styL)
// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100)
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
}
return false
}
}
}) Vue.directive('dialogChange', {
bind (el, binding, vnode, oldVnode) {
     // 自定义属性,判断是否可拉伸
if (!binding.value) return
const dragDom = el.querySelector('.el-dialog')
let dragMouse
// 在弹出框的右下角添加可拉伸标志 class='mouse'
for (let i = 0; i < dragDom.childNodes[2].childNodes.length; i++) {
if (dragDom.childNodes[2].childNodes[i].className === 'mouse') {
dragMouse = dragDom.childNodes[2].childNodes[i]
}
}
// 鼠标拖拽
dragMouse.onmousedown = (e) => {
// content区域
const content = dragDom.parentNode.parentNode.parentNode.parentNode
const disX = e.clientX - dragDom.offsetWidth
const disY = e.clientY - dragDom.offsetHeight document.onmousemove = function (e) {
e.preventDefault() // 移动时禁用默认事件
// 通过事件委托,计算移动的距离
let width = e.clientX - disX
let height = e.clientY - disY if (width > content.offsetWidth && height < content.offsetHeight) {
dragDom.style.height = `${height}px`
} else if (width < content.offsetWidth && height > content.offsetHeight) {
dragDom.style.width = `${width}px`
} else if (width < content.offsetWidth && height < content.offsetHeight) {
dragDom.style.width = `${width}px`
dragDom.style.height = `${height}px`
}
}
document.onmouseup = function (e) {
document.onmousemove = null
document.onmouseup = null
}
return false
}
}
})

在main.js中引用

import './components/dialog'

dialog组件 代码中添加v-if为了让每次弹出框都不继承上一次的改变:

     <el-dialog
v-if=dialog.dialogVisible
v-dialogDrag:{dialogDrag}=dialog.dialogDrag
v-dialogChange:{dialogChange}=dialog.dialogChange
ref="dialog__wrapper"
:close-on-click-modal="false"
:title=dialog.title
:visible.sync="dialog.dialogVisible"
:before-close="handleClose">
<div class="dialog-body">
<div class="line">
<slot name="content"></slot>
</div>
</div>
<slot slot="footer" class="dialog-footer"></slot>
</el-dialog>

在引用组件时, data返回一个:

    dialog: {// dialog显示隐藏
dialogVisible: false,
dialogDrag: true, // 可拖拽
dialogChange: true, // 可拉伸
title: '详情'
}

最新文章

  1. tomcat内存溢出 PermGen space
  2. 关于form 上传文件时的小问题
  3. [原创]Devexpress XtraReports 系列 4 创建多栏报表
  4. MFC枚举USB设备碰到的一个疑难,还没解决
  5. C语言当中的作用域
  6. HBase的Snapshots功能介绍
  7. 【Sort】多种排序
  8. 响应HttpServletResponse
  9. User Browsing Model简介
  10. [笔记]我的Linux入门之路 - 03.Java环境搭建
  11. cobble服务器安装配置
  12. java生成二维码并融合模板工具类
  13. js关于去重的写法
  14. 原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想)
  15. 细思极恐-你真的会写java吗?
  16. 一个简单的增强型PHP curl函数
  17. Python的递归
  18. OC利用正则表达式获取网络资源(网络爬虫)
  19. linux免密登录ssh验证配置方法及常见错误解决
  20. 配置火星板(MarS Board)的启动参数

热门文章

  1. HDU-6187.DestroyWalls(最大生成树)
  2. 【题解】1-2-K Game
  3. 第021讲:函数:lambda表达式
  4. TP5.1+Vue前后端分离实践
  5. django环境准备学习笔记(三)
  6. Django集合Ueditor
  7. 2019 Multi-University Training Contest 3 Find the answer (离散化+二分+树状数组)
  8. Mongodb副本集实现及读写分离
  9. 永久禁用Win10驱动程序强制签名
  10. Cluster基础(四):创建RHCS集群环境、创建高可用Apache服务