drag.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. export default {
  2. mounted(el, binding) {
  3. const { draggable, scaleX = 1, scaleY = 1 } = binding.value;
  4. if (!draggable) {
  5. // 如果拖拽功能被禁用,则不执行任何拖拽相关的逻辑
  6. return;
  7. }
  8. el.style.position = 'absolute';
  9. el.style.cursor = 'move';
  10. const dragDom = el;
  11. let disX = 0; // 鼠标按下时,鼠标与拖拽元素的左边距
  12. let disY = 0; // 鼠标按下时,鼠标与拖拽元素的上边距
  13. dragDom.onmousedown = (e) => {
  14. // 鼠标按下,计算当前元素距离可视区的距离
  15. disX = e.clientX / scaleX - dragDom.offsetLeft;
  16. disY = e.clientY / scaleY - dragDom.offsetTop;
  17. // 鼠标移动事件
  18. document.onmousemove = function (e) {
  19. // 通过事件委托,计算移动的距离
  20. const l = e.clientX / scaleX - disX;
  21. const t = e.clientY / scaleY - disY;
  22. // 移动当前元素
  23. dragDom.style.left = `${l + 'px'}`;
  24. dragDom.style.top = `${t + 'px'}`;
  25. // 将此时的位置传出去
  26. // binding.value({x:e.pageX,y:e.pageY})
  27. };
  28. // 鼠标松开事件
  29. document.onmouseup = function (e) {
  30. document.onmousemove = null;
  31. document.onmouseup = null;
  32. };
  33. };
  34. }
  35. };