index.mjs 2.5 KB

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