vue彈窗拖拽事件


import Vue from 'vue'
const isServer = Vue.prototype.$isServer
export default {
  inserted (el, binding, vnode) {
    const on = (function () {
      if (!isServer && document.addEventListener) {
        return function (element, event, handler) {
          if (element && event && handler) {
            element.addEventListener(event, handler, false)
          }
        }
      } else {
        return function (element, event, handler) {
          if (element && event && handler) {
            element.attachEvent('on' + event, handler)
          }
        }
      }
    })()

    const off = (function () {
      if (!isServer && document.removeEventListener) {
        return function (element, event, handler) {
          if (element && event) {
            element.removeEventListener(event, handler, false)
          }
        }
      } else {
        return function (element, event, handler) {
          if (element && event) {
            element.detachEvent('on' + event, handler)
          }
        }
      }
    })()

    // const rafThrottle = function (fn) {
    //   let locked = false
    //   return function (...args) {
    //     if (locked) return false
    //     locked = true
    //     window.requestAnimationFrame(_ => {
    //       console.log(this, 999)
    //       fn.apply(this, args) // 一個(gè)一個(gè)傳
    //       locked = false
    //     })
    //   }
    // }
    const rafThrottle = function (fn) {
      let locked = false
      return function (e) {
        if (locked) return false
        locked = true
        console.log(this) // document
        window.requestAnimationFrame(_ => {
          fn.call(this, e) // 整體傳
          locked = false
        })
      }
    }

    // console.log(el)
    const dragDom = el.querySelector('.el-dialog')
    const drayHeader = el.querySelector('.el-dialog__header')
    drayHeader.style.cursor = 'move'
    // console.log(dragDom, drayHeader)
    const getStyle = (function () {
      if (window.document.currentStyle) {
        return (dom, attr) => dom.currentStyle[attr]
      } else {
        return (dom, attr) => getComputedStyle(dom, false)[attr]
      }
    })()

    drayHeader.onmousedown = (e) => {
      // 當(dāng)前元素距離可是區(qū)域的距離
      const disX = e.clientX - drayHeader.offsetLeft
      const disY = e.clientY - drayHeader.offsetTop

      // 可是區(qū)域的寬高
      const screenHeight = document.body.offsetHeight
      const screenWidth = document.body.offsetWidth

      //   // 獲取left top
      let styLeft = getStyle(dragDom, 'left')
      let styTop = getStyle(dragDom, 'top')

      if (styLeft.includes('%')) {
        styLeft = +screenWidth * (+styLeft.replace(/%/g, '') / 100)
        styTop = +screenHeight * (+styTop.replace(/%/g, '') / 100)
      } else {
        styLeft = +styLeft.replace(/\px/g, '')
        styTop = +styTop.replace(/\px/g, '')
      }

      const hehe = rafThrottle(e => {
        const left = e.clientX - disX
        const top = e.clientY - disY
        dragDom.style.cssText += `;left: ${left + styLeft}px; top:${top + styTop}px`
      })

      on(document, 'mousemove', hehe)
      on(document, 'mouseup', ev => {
        off(document, 'mousemove', hehe)
      })
      e.preventDefault()
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容