index.mjs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { ref, onMounted, watchEffect, onBeforeUnmount } from 'vue';
  2. import { addUnit } from '../../utils/dom/style.mjs';
  3. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  4. const transform = {
  5. offsetX: 0,
  6. offsetY: 0
  7. };
  8. const isDragging = ref(false);
  9. const adjustPosition = (moveX, moveY) => {
  10. if (targetRef.value) {
  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 < clientHeight ? targetHeight : 0) + offsetY;
  23. if (!(overflow == null ? void 0 : overflow.value)) {
  24. moveX = Math.min(Math.max(moveX, minLeft), maxLeft);
  25. moveY = Math.min(Math.max(moveY, minTop), maxTop);
  26. }
  27. transform.offsetX = moveX;
  28. transform.offsetY = moveY;
  29. targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(
  30. moveY
  31. )})`;
  32. }
  33. };
  34. const onMousedown = (e) => {
  35. const downX = e.clientX;
  36. const downY = e.clientY;
  37. const { offsetX, offsetY } = transform;
  38. const onMousemove = (e2) => {
  39. if (!isDragging.value) {
  40. isDragging.value = true;
  41. }
  42. const moveX = offsetX + e2.clientX - downX;
  43. const moveY = offsetY + e2.clientY - downY;
  44. adjustPosition(moveX, moveY);
  45. };
  46. const onMouseup = () => {
  47. isDragging.value = false;
  48. document.removeEventListener("mousemove", onMousemove);
  49. document.removeEventListener("mouseup", onMouseup);
  50. };
  51. document.addEventListener("mousemove", onMousemove);
  52. document.addEventListener("mouseup", onMouseup);
  53. };
  54. const onDraggable = () => {
  55. if (dragRef.value && targetRef.value) {
  56. dragRef.value.addEventListener("mousedown", onMousedown);
  57. window.addEventListener("resize", updatePosition);
  58. }
  59. };
  60. const offDraggable = () => {
  61. if (dragRef.value && targetRef.value) {
  62. dragRef.value.removeEventListener("mousedown", onMousedown);
  63. window.removeEventListener("resize", updatePosition);
  64. }
  65. };
  66. const resetPosition = () => {
  67. transform.offsetX = 0;
  68. transform.offsetY = 0;
  69. if (targetRef.value) {
  70. targetRef.value.style.transform = "";
  71. }
  72. };
  73. const updatePosition = () => {
  74. const { offsetX, offsetY } = transform;
  75. adjustPosition(offsetX, offsetY);
  76. };
  77. onMounted(() => {
  78. watchEffect(() => {
  79. if (draggable.value) {
  80. onDraggable();
  81. } else {
  82. offDraggable();
  83. }
  84. });
  85. });
  86. onBeforeUnmount(() => {
  87. offDraggable();
  88. });
  89. return {
  90. isDragging,
  91. resetPosition,
  92. updatePosition
  93. };
  94. };
  95. export { useDraggable };
  96. //# sourceMappingURL=index.mjs.map