tav-ui
Version:
1 lines • 7.03 kB
Source Map (JSON)
{"version":3,"file":"useModalDrag2.mjs","sources":["../../../../../../../../packages/components/modal/src/hooks/useModalDrag.ts"],"sourcesContent":["import { unref, watchEffect } from 'vue'\nimport { useTimeoutFn } from '@tav-ui/hooks/core/useTimeout'\nimport type { Ref } from 'vue'\n\nexport interface UseModalDragMoveContext {\n draggable: Ref<boolean>\n destroyOnClose: Ref<boolean | undefined> | undefined\n visible: Ref<boolean>\n}\n\nexport function useModalDragMove(context: UseModalDragMoveContext) {\n const getStyle = (dom: any, attr: any) => {\n return getComputedStyle(dom)[attr]\n }\n const drag = (wrap: any) => {\n if (!wrap) return\n wrap.setAttribute('data-drag', unref(context.draggable))\n const dialogHeaderEl = wrap.querySelector('.ant-modal-header')\n const dragDom = wrap.querySelector('.ant-modal')\n\n if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return\n\n dialogHeaderEl.style.cursor = 'move'\n\n dialogHeaderEl.onmousedown = (e: any) => {\n if (!e) return\n // 鼠标按下,计算当前元素距离可视区的距离\n const disX = e.clientX\n const disY = e.clientY\n const screenWidth = document.body.clientWidth // body当前宽度\n const screenHeight = document.documentElement.clientHeight // 可见区域高度(应为body高度,可某些环境下无法获取)\n\n const dragDomWidth = dragDom.offsetWidth // 对话框宽度\n const dragDomheight = dragDom.offsetHeight // 对话框高度\n\n const minDragDomLeft = dragDom.offsetLeft\n\n const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth\n const minDragDomTop = dragDom.offsetTop\n const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight\n // 获取到的值带px 正则匹配替换\n const domLeft = getStyle(dragDom, 'left')\n const domTop = getStyle(dragDom, 'top')\n let styL = +domLeft\n let styT = +domTop\n\n // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px\n if (domLeft.includes('%')) {\n styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100)\n styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100)\n } else {\n styL = +domLeft.replace(/px/g, '')\n styT = +domTop.replace(/px/g, '')\n }\n\n document.onmousemove = function (e) {\n // 通过事件委托,计算移动的距离\n let left = e.clientX - disX\n let top = e.clientY - disY\n\n // 边界处理\n if (-left > minDragDomLeft) left = -minDragDomLeft\n else if (left > maxDragDomLeft) left = maxDragDomLeft\n\n if (-top > minDragDomTop) top = -minDragDomTop\n else if (top > maxDragDomTop) top = maxDragDomTop\n\n // 移动当前元素\n dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`\n }\n\n document.onmouseup = () => {\n document.onmousemove = null\n document.onmouseup = null\n }\n }\n }\n\n const handleDrag = () => {\n const dragWraps = document.querySelectorAll('.ant-modal-wrap')\n for (const wrap of Array.from(dragWraps)) {\n if (!wrap) continue\n const display = getStyle(wrap, 'display')\n const draggable = wrap.getAttribute('data-drag')\n if (display !== 'none') {\n // 拖拽位置\n if (draggable === null || unref(context.destroyOnClose)) drag(wrap)\n }\n }\n }\n\n watchEffect(() => {\n if (!unref(context.visible) || !unref(context.draggable)) return\n\n useTimeoutFn(() => {\n handleDrag()\n }, 30)\n })\n}\n"],"names":[],"mappings":"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"}