@fe6/water-pro
Version:
An enterprise-class UI design language and Vue-based implementation
117 lines (91 loc) • 3.53 kB
JavaScript
/** @format */
import { unref, watchEffect } from 'vue';
import { useTimeoutFn } from '../../../_util/hooks/use-timeout';
export function useModalDragMove(context) {
var getStyle = function getStyle(dom, attr) {
return getComputedStyle(dom)[attr];
};
var drag = function drag(wrap) {
if (!wrap) {
return;
}
wrap.setAttribute('data-drag', unref(context.draggable));
var dialogHeaderEl = wrap.querySelector('.ant-modal-header');
var dragDom = wrap.querySelector('.ant-modal');
if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) {
return;
}
dialogHeaderEl.style.cursor = 'move';
dialogHeaderEl.onmousedown = function (e) {
if (!e) {
return;
} // 鼠标按下,计算当前元素距离可视区的距离
var disX = e.clientX;
var disY = e.clientY;
var screenWidth = document.body.clientWidth; // body当前宽度
var screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取)
var dragDomWidth = dragDom.offsetWidth; // 对话框宽度
var dragDomheight = dragDom.offsetHeight; // 对话框高度
var minDragDomLeft = dragDom.offsetLeft;
var maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
var minDragDomTop = dragDom.offsetTop;
var maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; // 获取到的值带px 正则匹配替换
var domLeft = getStyle(dragDom, 'left');
var domTop = getStyle(dragDom, 'top');
var styL = +domLeft;
var styT = +domTop; // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
if (domLeft.includes('%')) {
styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100);
styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100);
} else {
styL = +domLeft.replace(/px/g, '');
styT = +domTop.replace(/px/g, '');
}
document.onmousemove = function (e) {
// 通过事件委托,计算移动的距离
var left = e.clientX - disX;
var 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:".concat(left + styL, "px;top:").concat(top + styT, "px;");
};
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
};
};
};
var handleDrag = function handleDrag() {
var dragWraps = document.querySelectorAll('.ant-modal-wrap');
for (var _i = 0, _Array$from = Array.from(dragWraps); _i < _Array$from.length; _i++) {
var wrap = _Array$from[_i];
if (!wrap) {
continue;
}
var display = getStyle(wrap, 'display');
var draggable = wrap.getAttribute('data-drag');
if (display !== 'none') {
// 拖拽位置
if (draggable === null || unref(context.destroyOnClose)) {
drag(wrap);
}
}
}
};
watchEffect(function () {
if (!unref(context.visible) || !unref(context.draggable)) {
return;
}
useTimeoutFn(function () {
handleDrag();
}, 30);
});
}