useDrag.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. export function useDrag(sliderDom: HTMLElement) {
  2. let startPoint = { x: 0, y: 0 };
  3. let isDown = false;
  4. let premitiveX = 0;
  5. let premitiveY = 0;
  6. function onMouseDown(e: Event) {
  7. e.stopPropagation();
  8. e.preventDefault();
  9. isDown = true;
  10. const style = window.getComputedStyle(sliderDom!);
  11. const { transform } = style;
  12. if (transform !== 'none') {
  13. const matrixArr = transform.replace(/[^0-9\-,]/g, '').split(',');
  14. console.log('matrixArr', matrixArr);
  15. premitiveX = parseInt(matrixArr[4]);
  16. premitiveY = parseInt(matrixArr[5]);
  17. } else {
  18. premitiveX = 0;
  19. premitiveY = 0;
  20. }
  21. const { clientX, clientY } = e;
  22. startPoint = { x: clientX, y: clientY };
  23. }
  24. function onMosueUp(e: any) {
  25. isDown = false;
  26. }
  27. function onMouseMove(e: any) {
  28. if (!isDown) return;
  29. const { clientX, clientY } = e;
  30. const moveDistancX = clientX - startPoint.x;
  31. const moveDistancY = clientY - startPoint.y;
  32. const offsetX = premitiveX + moveDistancX;
  33. const offsetY = premitiveY + moveDistancY;
  34. sliderDom!.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
  35. }
  36. sliderDom.addEventListener('mousedown', onMouseDown);
  37. document.addEventListener('mousemove', onMouseMove);
  38. document.addEventListener('pointerup', onMosueUp);
  39. return { onMouseDown, onMouseMove, onMosueUp };
  40. }