index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var style = require('../../utils/dom/style.js');
  5. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  6. const transform = {
  7. offsetX: 0,
  8. offsetY: 0
  9. };
  10. const isDragging = vue.ref(false);
  11. const adjustPosition = (moveX, moveY) => {
  12. if (targetRef.value) {
  13. const { offsetX, offsetY } = transform;
  14. const targetRect = targetRef.value.getBoundingClientRect();
  15. const targetLeft = targetRect.left;
  16. const targetTop = targetRect.top;
  17. const targetWidth = targetRect.width;
  18. const targetHeight = targetRect.height;
  19. const clientWidth = document.documentElement.clientWidth;
  20. const clientHeight = document.documentElement.clientHeight;
  21. const minLeft = -targetLeft + offsetX;
  22. const minTop = -targetTop + offsetY;
  23. const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;
  24. const maxTop = clientHeight - targetTop - (targetHeight < clientHeight ? targetHeight : 0) + offsetY;
  25. if (!(overflow == null ? void 0 : overflow.value)) {
  26. moveX = Math.min(Math.max(moveX, minLeft), maxLeft);
  27. moveY = Math.min(Math.max(moveY, minTop), maxTop);
  28. }
  29. transform.offsetX = moveX;
  30. transform.offsetY = moveY;
  31. targetRef.value.style.transform = `translate(${style.addUnit(moveX)}, ${style.addUnit(
  32. moveY
  33. )})`;
  34. }
  35. };
  36. const onMousedown = (e) => {
  37. const downX = e.clientX;
  38. const downY = e.clientY;
  39. const { offsetX, offsetY } = transform;
  40. const onMousemove = (e2) => {
  41. if (!isDragging.value) {
  42. isDragging.value = true;
  43. }
  44. const moveX = offsetX + e2.clientX - downX;
  45. const moveY = offsetY + e2.clientY - downY;
  46. adjustPosition(moveX, moveY);
  47. };
  48. const onMouseup = () => {
  49. isDragging.value = false;
  50. document.removeEventListener("mousemove", onMousemove);
  51. document.removeEventListener("mouseup", onMouseup);
  52. };
  53. document.addEventListener("mousemove", onMousemove);
  54. document.addEventListener("mouseup", onMouseup);
  55. };
  56. const onDraggable = () => {
  57. if (dragRef.value && targetRef.value) {
  58. dragRef.value.addEventListener("mousedown", onMousedown);
  59. window.addEventListener("resize", updatePosition);
  60. }
  61. };
  62. const offDraggable = () => {
  63. if (dragRef.value && targetRef.value) {
  64. dragRef.value.removeEventListener("mousedown", onMousedown);
  65. window.removeEventListener("resize", updatePosition);
  66. }
  67. };
  68. const resetPosition = () => {
  69. transform.offsetX = 0;
  70. transform.offsetY = 0;
  71. if (targetRef.value) {
  72. targetRef.value.style.transform = "";
  73. }
  74. };
  75. const updatePosition = () => {
  76. const { offsetX, offsetY } = transform;
  77. adjustPosition(offsetX, offsetY);
  78. };
  79. vue.onMounted(() => {
  80. vue.watchEffect(() => {
  81. if (draggable.value) {
  82. onDraggable();
  83. } else {
  84. offDraggable();
  85. }
  86. });
  87. });
  88. vue.onBeforeUnmount(() => {
  89. offDraggable();
  90. });
  91. return {
  92. isDragging,
  93. resetPosition,
  94. updatePosition
  95. };
  96. };
  97. exports.useDraggable = useDraggable;
  98. //# sourceMappingURL=index.js.map