[update] 增加弹框拖拽
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
"dom-align": "1.12.0",
|
"dom-align": "1.12.0",
|
||||||
"echarts": "^5.4.2",
|
"echarts": "^5.4.2",
|
||||||
"enquire.js": "^2.1.6",
|
"enquire.js": "^2.1.6",
|
||||||
|
"jquery": "^3.7.1",
|
||||||
"js-base64": "^3.6.0",
|
"js-base64": "^3.6.0",
|
||||||
"js-cookie": "^2.2.0",
|
"js-cookie": "^2.2.0",
|
||||||
"jsencrypt": "^3.0.0-rc.1",
|
"jsencrypt": "^3.0.0-rc.1",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
|
v-dialog-drag
|
||||||
ref="modal"
|
ref="modal"
|
||||||
:class="getClass(modalClass)"
|
:class="getClass(modalClass)"
|
||||||
:style="getStyle(modalStyle)"
|
:style="getStyle(modalStyle)"
|
||||||
@@ -8,8 +9,9 @@
|
|||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
@ok="handleOk"
|
@ok="handleOk"
|
||||||
@cancel="handleCancel"
|
@cancel="handleCancel"
|
||||||
destroyOnClose
|
|
||||||
>
|
>
|
||||||
|
<!-- 关闭销毁会影响拖拽-->
|
||||||
|
<!-- destroyOnClose-->
|
||||||
|
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
<!--有设置标题-->
|
<!--有设置标题-->
|
||||||
@@ -134,6 +136,25 @@ export default {
|
|||||||
},
|
},
|
||||||
innerFullscreen (val) {
|
innerFullscreen (val) {
|
||||||
this.$emit('update:fullscreen', val)
|
this.$emit('update:fullscreen', val)
|
||||||
|
if (val) {
|
||||||
|
// 全屏了
|
||||||
|
// 设置弹框在左上角
|
||||||
|
const dialogEl = document.getElementsByClassName('ant-modal')[0]
|
||||||
|
dialogEl.style.top = '0px'
|
||||||
|
dialogEl.style.left = '0px'
|
||||||
|
// 设置弹框头部不可拖拽
|
||||||
|
const dialogHeaderEl = document.getElementsByClassName('ant-modal-header')[0]
|
||||||
|
dialogHeaderEl.style.cursor = 'default'
|
||||||
|
dialogHeaderEl.style.pointerEvents = 'none'
|
||||||
|
// 设置取消全屏按钮可点击
|
||||||
|
const fullBtnEl = document.getElementsByClassName('right')[0]
|
||||||
|
fullBtnEl.style.pointerEvents = 'auto'
|
||||||
|
} else {
|
||||||
|
// 取消全屏,设置弹框头部可移动,鼠标事件恢复
|
||||||
|
const dialogHeaderEl = document.getElementsByClassName('ant-modal-header')[0]
|
||||||
|
dialogHeaderEl.style.cursor = 'move'
|
||||||
|
dialogHeaderEl.style.pointerEvents = 'auto'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
|
v-dialog-drag
|
||||||
title="用户列表"
|
title="用户列表"
|
||||||
:width="1000"
|
:width="1000"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal v-model="uploadVisible" :maskClosable="false" :footer="[]" :title="title" @cancel="handlePreImgCancel">
|
<a-modal v-dialog-drag v-model="uploadVisible" :maskClosable="false" :footer="[]" :title="title" @cancel="handlePreImgCancel">
|
||||||
<a-upload-dragger
|
<a-upload-dragger
|
||||||
:accept="accept"
|
:accept="accept"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
|
v-dialog-drag
|
||||||
:title="title"
|
:title="title"
|
||||||
:width="modalWidth"
|
:width="modalWidth"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ import JeroComponents from '@/components/jero/index'
|
|||||||
|
|
||||||
import JDictComponenets from '@comp/dict/index.js'
|
import JDictComponenets from '@comp/dict/index.js'
|
||||||
|
|
||||||
|
// 引入自定义指令
|
||||||
|
import '@/utils/directives'
|
||||||
|
|
||||||
console.log('ant-design-vue version:', version)
|
console.log('ant-design-vue version:', version)
|
||||||
// Vue.prototype.rules = rules
|
// Vue.prototype.rules = rules
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|||||||
@@ -0,0 +1,244 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import $ from 'jquery'
|
||||||
|
|
||||||
|
let binding
|
||||||
|
// v-dialogDrag: 弹窗拖拽属性
|
||||||
|
Vue.directive('dialogDrag', {
|
||||||
|
// , vnode, oldVnode
|
||||||
|
bind (el, bindingOne) {
|
||||||
|
binding = bindingOne
|
||||||
|
const dialogHeaderEl = el.querySelector('.ant-modal-header')
|
||||||
|
const dragDom = el.querySelector('.ant-modal')
|
||||||
|
// dialogHeaderEl.style.cursor = 'move';
|
||||||
|
dialogHeaderEl.style.cssText += ';cursor:move;'
|
||||||
|
// dragDom.style.cssText += ';top:200px;'
|
||||||
|
|
||||||
|
// 获取原有属性 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
|
||||||
|
const minDragDomTop = dragDom.offsetTop
|
||||||
|
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight
|
||||||
|
// 获取到的值带px 正则匹配替换
|
||||||
|
let styL = sty(dragDom, 'left')
|
||||||
|
let styT = sty(dragDom, 'top')
|
||||||
|
|
||||||
|
// const styLT = {styL:styL,styT:styT };
|
||||||
|
// 注意在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.ondblclick = () => {
|
||||||
|
dragDom.style.cssText += `;left:${0}%;top:${0}%;`
|
||||||
|
}
|
||||||
|
|
||||||
|
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 () {
|
||||||
|
document.onmousemove = null
|
||||||
|
document.onmouseup = null
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// import $ from './jq.js'
|
||||||
|
//elementUI vue this.$confirm 弹出框移动
|
||||||
|
$(function () {
|
||||||
|
$('body').on('mousedown', '.el-message-box__header', (e) => {
|
||||||
|
const dialogHeaderEl = document.querySelector('.el-message-box__header')
|
||||||
|
const dragDom = document.querySelector('.el-message-box')
|
||||||
|
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
|
||||||
|
dialogHeaderEl.style.cursor = 'move'
|
||||||
|
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
|
||||||
|
const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
|
||||||
|
// 鼠标按下,计算当前元素距离可视区的距离
|
||||||
|
const disX = e.clientX - dialogHeaderEl.offsetLeft
|
||||||
|
const disY = e.clientY - dialogHeaderEl.offsetTop
|
||||||
|
// 获取到的值带px 正则匹配替换
|
||||||
|
let styL, styT
|
||||||
|
// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
|
||||||
|
if (sty.left.includes('%')) {
|
||||||
|
styL = +document.body.clientWidth * (+sty.left.replace(/%/g, '') / 100)
|
||||||
|
styT = +document.body.clientHeight * (+sty.top.replace(/%/g, '') / 100)
|
||||||
|
} else {
|
||||||
|
let lefts = sty.left
|
||||||
|
let tops = sty.top
|
||||||
|
if (sty.left == 'auto') {
|
||||||
|
lefts = '0px'
|
||||||
|
}
|
||||||
|
if (sty.top == 'auto') {
|
||||||
|
tops = '0px'
|
||||||
|
}
|
||||||
|
styL = +lefts.replace(/px/g, '')
|
||||||
|
styT = +tops.replace(/px/g, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
document.onmousemove = function (e) {
|
||||||
|
// 通过事件委托,计算移动的距离
|
||||||
|
let l = e.clientX - disX
|
||||||
|
let t = e.clientY - disY
|
||||||
|
// 边界处理
|
||||||
|
if (-l > minDragDomLeft) {
|
||||||
|
l = -minDragDomLeft
|
||||||
|
} else if (l > maxDragDomLeft) {
|
||||||
|
l = maxDragDomLeft
|
||||||
|
}
|
||||||
|
if (-t > minDragDomTop) {
|
||||||
|
t = -minDragDomTop
|
||||||
|
} else if (t > maxDragDomTop) {
|
||||||
|
t = maxDragDomTop
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移动当前元素
|
||||||
|
dragDom.style.left = `${l + styL}px`
|
||||||
|
dragDom.style.top = `${t + styT}px`
|
||||||
|
dragDom.style.position = `absolute`
|
||||||
|
|
||||||
|
// 将此时的位置传出去
|
||||||
|
binding.value({ x: e.pageX, y: e.pageY })
|
||||||
|
}
|
||||||
|
document.ondblclick = () => {
|
||||||
|
dragDom.style.cssText += `;left:${45}%;top:${40}%;`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
document.onmouseup = function () {
|
||||||
|
document.onmousemove = null
|
||||||
|
document.onmouseup = null
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
$('body').on('mousedown', '.search-box-header', (e) => {
|
||||||
|
const dialogHeaderEl = document.querySelector('.search-box-header')
|
||||||
|
const dragDom = document.querySelector('.sx-search-box')
|
||||||
|
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
|
||||||
|
dialogHeaderEl.style.cursor = 'move'
|
||||||
|
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
|
||||||
|
const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
|
||||||
|
// 鼠标按下,计算当前元素距离可视区的距离
|
||||||
|
const disX = e.clientX - dialogHeaderEl.offsetLeft
|
||||||
|
const disY = e.clientY - dialogHeaderEl.offsetTop
|
||||||
|
// 获取到的值带px 正则匹配替换
|
||||||
|
let styL, styT
|
||||||
|
// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
|
||||||
|
if (sty.left.includes('%')) {
|
||||||
|
styL = +document.body.clientWidth * (+sty.left.replace(/%/g, '') / 100)
|
||||||
|
styT = +document.body.clientHeight * (+sty.top.replace(/%/g, '') / 100)
|
||||||
|
} else {
|
||||||
|
let lefts = sty.left
|
||||||
|
let tops = sty.top
|
||||||
|
if (sty.left == 'auto') {
|
||||||
|
lefts = '0px'
|
||||||
|
}
|
||||||
|
if (sty.top == 'auto') {
|
||||||
|
tops = '0px'
|
||||||
|
}
|
||||||
|
styL = +lefts.replace(/px/g, '')
|
||||||
|
styT = +tops.replace(/px/g, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
document.onmousemove = function (e) {
|
||||||
|
// 通过事件委托,计算移动的距离
|
||||||
|
let l = e.clientX - disX
|
||||||
|
let t = e.clientY - disY
|
||||||
|
// 边界处理
|
||||||
|
if (-l > minDragDomLeft) {
|
||||||
|
l = -minDragDomLeft
|
||||||
|
} else if (l > maxDragDomLeft) {
|
||||||
|
l = maxDragDomLeft
|
||||||
|
}
|
||||||
|
if (-t > minDragDomTop) {
|
||||||
|
t = -minDragDomTop
|
||||||
|
} else if (t > maxDragDomTop) {
|
||||||
|
t = maxDragDomTop
|
||||||
|
}
|
||||||
|
// 移动当前元素
|
||||||
|
dragDom.style.left = `${l + styL}px`
|
||||||
|
dragDom.style.top = `${t + styT}px`
|
||||||
|
dragDom.style.position = `absolute`
|
||||||
|
|
||||||
|
// 将此时的位置传出去
|
||||||
|
binding.value({ x: e.pageX, y: e.pageY })
|
||||||
|
}
|
||||||
|
document.ondblclick = () => {
|
||||||
|
dragDom.style.cssText += `;left:${45}%;top:${40}%;`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
document.onmouseup = function () {
|
||||||
|
document.onmousemove = null
|
||||||
|
document.onmouseup = null
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
|
v-dialog-drag
|
||||||
:title="title"
|
:title="title"
|
||||||
:width="800"
|
:width="800"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
|
v-dialog-drag
|
||||||
:title="title"
|
:title="title"
|
||||||
:width="800"
|
:width="800"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
|
|||||||
@@ -7458,6 +7458,11 @@ javascript-stringify@^1.6.0:
|
|||||||
resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
|
resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
|
||||||
integrity sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==
|
integrity sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==
|
||||||
|
|
||||||
|
jquery@^3.7.1:
|
||||||
|
version "3.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
|
||||||
|
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
|
||||||
|
|
||||||
js-base64@^2.1.9:
|
js-base64@^2.1.9:
|
||||||
version "2.6.4"
|
version "2.6.4"
|
||||||
resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
|
resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
|
||||||
|
|||||||
Reference in New Issue
Block a user