@fe6/water-pro
Version:
An enterprise-class UI design language and Vue-based implementation
126 lines (96 loc) • 3.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useModalDragMove = useModalDragMove;
var _vue = require("vue");
var _useTimeout = require("../../../_util/hooks/use-timeout");
/** @format */
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', (0, _vue.unref)(context.draggable));
var dialogHeaderEl = wrap.querySelector('.ant-modal-header');
var dragDom = wrap.querySelector('.ant-modal');
if (!dialogHeaderEl || !dragDom || !(0, _vue.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 || (0, _vue.unref)(context.destroyOnClose)) {
drag(wrap);
}
}
}
};
(0, _vue.watchEffect)(function () {
if (!(0, _vue.unref)(context.visible) || !(0, _vue.unref)(context.draggable)) {
return;
}
(0, _useTimeout.useTimeoutFn)(function () {
handleDrag();
}, 30);
});
}