index.mjs 2.8 KB

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