UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

84 lines (81 loc) 2.58 kB
import { watchEffect, onBeforeUnmount } from 'vue'; import { on, off } from '../../utils/dom.mjs'; const useDraggable = (targetRef, dragRef, dragData, draggable, options) => { const handleMoveStart = (event) => { if (!draggable.value) { return false; } const rect = targetRef.value.getBoundingClientRect(); dragData.rect = rect; dragData.x = rect.x || rect.left; dragData.y = rect.y || rect.top; const distance = { x: event.clientX, y: event.clientY }; dragData.dragX = distance.x; dragData.dragY = distance.y; dragData.dragging = true; on(window, "mousemove", handleMoveMove); on(window, "mouseup", handleMoveEnd); }; const handleMoveMove = (event) => { if (!draggable.value) { return false; } const distance = { x: event.clientX, y: event.clientY }; const diffDistance = { x: distance.x - dragData.dragX, y: distance.y - dragData.dragY }; if (options.sticky) { const clientWidth = document.documentElement.clientWidth; const clientHeight = document.documentElement.clientHeight; if (dragData.x + diffDistance.x <= options.stickyDistance && diffDistance.x < 0) { dragData.x = 0; } else if (dragData.x + dragData.rect.width - clientWidth > -options.stickyDistance && diffDistance.x > 0) { dragData.x = clientWidth - dragData.rect.width; } else { dragData.x += diffDistance.x; } if (dragData.y + diffDistance.y <= options.stickyDistance && diffDistance.y < 0) { dragData.y = 0; } else if (dragData.y + dragData.rect.height - clientHeight > -options.stickyDistance && diffDistance.y > 0) { dragData.y = clientHeight - dragData.rect.height; } else { dragData.y += diffDistance.y; } } else { dragData.x += diffDistance.x; dragData.y += diffDistance.y; } dragData.dragX = distance.x; dragData.dragY = distance.y; }; const handleMoveEnd = () => { dragData.dragging = false; off(window, "mousemove", handleMoveMove); off(window, "mouseup", handleMoveEnd); }; const onDraggable = () => { if (dragRef.value) { dragRef.value.addEventListener("mousedown", handleMoveStart); } }; const offDraggable = () => { if (dragRef.value) { dragRef.value.removeEventListener("mousedown", handleMoveStart); } }; watchEffect(() => { onDraggable(); }); onBeforeUnmount(() => { offDraggable(); }); }; export { useDraggable }; //# sourceMappingURL=index.mjs.map