UNPKG

element-plus

Version:

A Component Library for Vue 3

95 lines (90 loc) 3 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var style = require('../../utils/dom/style.js'); const useDraggable = (targetRef, dragRef, draggable, overflow) => { const transform = { offsetX: 0, offsetY: 0 }; const adjustPosition = (moveX, moveY) => { if (targetRef.value) { const { offsetX, offsetY } = transform; const targetRect = targetRef.value.getBoundingClientRect(); const targetLeft = targetRect.left; const targetTop = targetRect.top; const targetWidth = targetRect.width; const targetHeight = targetRect.height; const clientWidth = document.documentElement.clientWidth; const clientHeight = document.documentElement.clientHeight; const minLeft = -targetLeft + offsetX; const minTop = -targetTop + offsetY; const maxLeft = clientWidth - targetLeft - targetWidth + offsetX; const maxTop = clientHeight - targetTop - targetHeight + offsetY; if (!(overflow == null ? void 0 : overflow.value)) { moveX = Math.min(Math.max(moveX, minLeft), maxLeft); moveY = Math.min(Math.max(moveY, minTop), maxTop); } transform.offsetX = moveX; transform.offsetY = moveY; targetRef.value.style.transform = `translate(${style.addUnit(moveX)}, ${style.addUnit(moveY)})`; } }; const onMousedown = (e) => { const downX = e.clientX; const downY = e.clientY; const { offsetX, offsetY } = transform; const onMousemove = (e2) => { const moveX = offsetX + e2.clientX - downX; const moveY = offsetY + e2.clientY - downY; adjustPosition(moveX, moveY); }; const onMouseup = () => { document.removeEventListener("mousemove", onMousemove); document.removeEventListener("mouseup", onMouseup); }; document.addEventListener("mousemove", onMousemove); document.addEventListener("mouseup", onMouseup); }; const onDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.addEventListener("mousedown", onMousedown); window.addEventListener("resize", updatePosition); } }; const offDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.removeEventListener("mousedown", onMousedown); window.removeEventListener("resize", updatePosition); } }; const resetPosition = () => { transform.offsetX = 0; transform.offsetY = 0; if (targetRef.value) { targetRef.value.style.transform = ""; } }; const updatePosition = () => { const { offsetX, offsetY } = transform; adjustPosition(offsetX, offsetY); }; vue.onMounted(() => { vue.watchEffect(() => { if (draggable.value) { onDraggable(); } else { offDraggable(); } }); }); vue.onBeforeUnmount(() => { offDraggable(); }); return { resetPosition, updatePosition }; }; exports.useDraggable = useDraggable; //# sourceMappingURL=index.js.map