UNPKG

@fe6/water-pro

Version:

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

117 lines (91 loc) 3.53 kB
/** @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); }); }