index.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 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 + offsetY;
  24. if (!(overflow == null ? void 0 : 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(${style.addUnit(moveX)}, ${style.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 = (e2) => {
  38. const moveX = offsetX + e2.clientX - downX;
  39. const moveY = offsetY + e2.clientY - downY;
  40. adjustPosition(moveX, moveY);
  41. };
  42. const onMouseup = () => {
  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) {
  65. targetRef.value.style.transform = "";
  66. }
  67. };
  68. const updatePosition = () => {
  69. const { offsetX, offsetY } = transform;
  70. adjustPosition(offsetX, offsetY);
  71. };
  72. vue.onMounted(() => {
  73. vue.watchEffect(() => {
  74. if (draggable.value) {
  75. onDraggable();
  76. } else {
  77. offDraggable();
  78. }
  79. });
  80. });
  81. vue.onBeforeUnmount(() => {
  82. offDraggable();
  83. });
  84. return {
  85. resetPosition,
  86. updatePosition
  87. };
  88. };
  89. exports.useDraggable = useDraggable;
  90. //# sourceMappingURL=index.js.map