UNPKG

@fe6/water-pro

Version:

An enterprise-class UI design language and Vue-based implementation

126 lines (96 loc) 3.71 kB
"use strict"; 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); }); }