index.mjs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { onMounted, watchEffect, onBeforeUnmount } from 'vue';
  2. import '../../utils/index.mjs';
  3. import { addUnit } from '../../utils/dom/style.mjs';
  4. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  5. let transform = {
  6. offsetX: 0,
  7. offsetY: 0
  8. };
  9. const onMousedown = (e) => {
  10. const downX = e.clientX;
  11. const downY = e.clientY;
  12. const { offsetX, offsetY } = transform;
  13. const targetRect = targetRef.value.getBoundingClientRect();
  14. const targetLeft = targetRect.left;
  15. const targetTop = targetRect.top;
  16. const targetWidth = targetRect.width;
  17. const targetHeight = targetRect.height;
  18. const clientWidth = document.documentElement.clientWidth;
  19. const clientHeight = document.documentElement.clientHeight;
  20. const minLeft = -targetLeft + offsetX;
  21. const minTop = -targetTop + offsetY;
  22. const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;
  23. const maxTop = clientHeight - targetTop - targetHeight + offsetY;
  24. const onMousemove = (e2) => {
  25. let moveX = offsetX + e2.clientX - downX;
  26. let moveY = offsetY + e2.clientY - downY;
  27. if (!(overflow == null ? void 0 : overflow.value)) {
  28. moveX = Math.min(Math.max(moveX, minLeft), maxLeft);
  29. moveY = Math.min(Math.max(moveY, minTop), maxTop);
  30. }
  31. transform = {
  32. offsetX: moveX,
  33. offsetY: moveY
  34. };
  35. if (targetRef.value) {
  36. targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(moveY)})`;
  37. }
  38. };
  39. const onMouseup = () => {
  40. document.removeEventListener("mousemove", onMousemove);
  41. document.removeEventListener("mouseup", onMouseup);
  42. };
  43. document.addEventListener("mousemove", onMousemove);
  44. document.addEventListener("mouseup", onMouseup);
  45. };
  46. const onDraggable = () => {
  47. if (dragRef.value && targetRef.value) {
  48. dragRef.value.addEventListener("mousedown", onMousedown);
  49. }
  50. };
  51. const offDraggable = () => {
  52. if (dragRef.value && targetRef.value) {
  53. dragRef.value.removeEventListener("mousedown", onMousedown);
  54. }
  55. };
  56. onMounted(() => {
  57. watchEffect(() => {
  58. if (draggable.value) {
  59. onDraggable();
  60. } else {
  61. offDraggable();
  62. }
  63. });
  64. });
  65. onBeforeUnmount(() => {
  66. offDraggable();
  67. });
  68. };
  69. export { useDraggable };
  70. //# sourceMappingURL=index.mjs.map