drag.ts 1.75 KB
import { listen } from 'dom-helpers'
import throttle from 'lodash/throttle'

let prevMoveXValue = [0, 0]
let prevMoveYValue = [0, 0]

// 拖拽处理
export const dragCanvas = (e: MouseEvent) => {
  const previewBoxDom = document.querySelector('.go-preview') as HTMLElement
  if (!previewBoxDom || previewBoxDom.style.position !== 'absolute') return
  if (!window.$KeyboardActive?.space) return

  e.preventDefault()
  e.stopPropagation()
  // @ts-ignore
  document.activeElement?.blur()
  const startX = e.screenX
  const startY = e.screenY

  const listenMousemove = listen(
    window,
    'mousemove',
    throttle((moveEvent: MouseEvent) => {
      const nx = moveEvent.screenX - startX
      const ny = moveEvent.screenY - startY

      const [prevMoveX1, prevMoveX2] = prevMoveXValue
      const [prevMoveY1, prevMoveY2] = prevMoveYValue

      prevMoveXValue = [prevMoveX2, nx]
      prevMoveYValue = [prevMoveY2, ny]

      // 去除小数部分
      if (previewBoxDom) {
        const oldLeft = previewBoxDom.style.left ? Number(previewBoxDom.style.left.split('px')[0]) : 0
        const oldTop = previewBoxDom.style.top ? Number(previewBoxDom.style.top.split('px')[0]) : 0
        previewBoxDom.style.left =
          oldLeft +
          (prevMoveX2 > prevMoveX1 ? Math.abs(prevMoveX2 - prevMoveX1) : -Math.abs(prevMoveX2 - prevMoveX1)) +
          'px'
        previewBoxDom.style.top =
          oldTop +
          (prevMoveY2 > prevMoveY1 ? Math.abs(prevMoveY2 - prevMoveY1) : -Math.abs(prevMoveY2 - prevMoveY1)) +
          'px'
      }
    }, 20)
  )

  const listenMouseup = listen(window, 'mouseup', () => {
    prevMoveXValue = [0, 0]
    prevMoveYValue = [0, 0]
    listenMousemove()
    listenMouseup()
  })
}