drag-window.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { nextTick, App } from 'vue'
  2. export default function useDragWindowDirective(app: App): void {
  3. app.directive('drag-window', async (el) => {
  4. await nextTick()
  5. const modal = el
  6. const header = el.getElementsByClassName('drag-title')[0]
  7. let left = 0
  8. let top = 0
  9. header.style.cursor = 'move'
  10. top = top || modal.offsetTop
  11. header.onpointerdown = (e: { clientX: number; clientY: number; pointerId: number }) => {
  12. const startX = e.clientX
  13. const startY = e.clientY
  14. header.left = header.offsetLeft
  15. header.top = header.offsetTop
  16. header.setPointerCapture(e.pointerId)
  17. el.onpointermove = (event: { clientX: number; clientY: number }) => {
  18. const endX = event.clientX
  19. const endY = event.clientY
  20. modal.left = header.left + (endX - startX) + left
  21. modal.top = header.top + (endY - startY) + top
  22. modal.style.left = modal.left + 'px'
  23. modal.style.top = modal.top + 'px'
  24. }
  25. el.onpointerup = () => {
  26. left = modal.left || 0
  27. top = modal.top || 0
  28. el.onpointermove = null
  29. el.onpointerup = null
  30. header.releasePointerCapture(e.pointerId)
  31. }
  32. }
  33. })
  34. }