drag.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /**
  2. * v-dialogDrag 弹窗拖拽
  3. * Copyright (c) 2019 ruoyi
  4. */
  5. export default {
  6. bind(el, binding, vnode, oldVnode) {
  7. const value = binding.value;
  8. if (value == false) return;
  9. let initialTouchX = 0;
  10. let initialTouchY = 0;
  11. let initialLeft = 0;
  12. let initialTop = 0;
  13. el.addEventListener(
  14. 'touchstart',
  15. (e) => {
  16. e.stopPropagation();
  17. const touch = e.touches[0];
  18. initialTouchX = touch.clientX;
  19. initialTouchY = touch.clientY;
  20. initialLeft = e.currentTarget.offsetLeft;
  21. initialTop = e.currentTarget.offsetTop;
  22. },
  23. false
  24. );
  25. el.addEventListener(
  26. 'touchmove',
  27. function (e) {
  28. e.stopPropagation();
  29. const clientX = e.targetTouches[0].clientX;
  30. const clientY = e.targetTouches[0].clientY;
  31. // 限制拖拽范围
  32. const clientWidth = document.documentElement.clientWidth;
  33. const clientHeight = document.documentElement.clientHeight;
  34. // 计算边界限制
  35. const maxLeft = clientWidth - this.offsetWidth;
  36. const maxTop = clientHeight - this.offsetHeight;
  37. // 计算基于初始位置的移动量并应用边界限制
  38. const deltaX = clientX - initialTouchX;
  39. const deltaY = clientY - initialTouchY;
  40. const left = initialLeft + deltaX;
  41. const top = initialTop + deltaY;
  42. // 添加边界限制
  43. this.style.left = `${Math.max(0, Math.min(left, maxLeft))}px`;
  44. this.style.top = `${Math.max(0, Math.min(top, maxTop))}px`;
  45. },
  46. false
  47. );
  48. el.addEventListener('touchend', function (e) {}, false);
  49. },
  50. };