美文网首页
vue 实现pc + 移动/h5随意拖拽

vue 实现pc + 移动/h5随意拖拽

作者: 周郭郭先生 | 来源:发表于2019-08-02 14:31 被阅读0次

    // 使用指令

    <div v-drag="greet"></div>

    greet回调移动的距离

    greet (val) { console.log(val }

    // 创建指令

    import Vue from 'vue'

    import _ from 'lodash'

    Vue.directive('drag', {

      // drag自定义指令

      bind: function (a, binding) {

        var isStart = false // 是否已经开始拖拽

        let distance = {} // 拖动的距离

        let l, t, x, y // 当前被拖动的距离

        let w // 当前屏幕宽度

        let h // 当前屏幕的高度

        // 移动端

        a.addEventListener(

          'touchstart',

          function (e) {

            isStart = true // 如果没有开始拖拽, 则可以拖拽

            if (!e.changedTouches[0]) return

            var { clientX, clientY } = e.changedTouches[0]

            x = clientX - e.changedTouches[0].target.x

            y = clientY - e.changedTouches[0].target.y

            w = document.body.clientWidth // 当前屏幕宽度

            h = document.body.clientHeight // 当前屏幕的高度

          },

          { passive: false }

        )

        // _.debounce 防抖

        a.addEventListener(

          'touchmove',

          _.debounce(function (e) {

            e.preventDefault()

            l = e.changedTouches[0].clientX - x

            t = e.changedTouches[0].clientY - y

            if (l < 0 && t < 0) {

              a.style.left = 0 + 'px'

              a.style.top = 0 + 'px'

            } else if (l < 0 && t + a.clientHeight < h) {

              a.style.left = 0 + 'px'

              a.style.top = t + 'px'

            } else if (l < 0 && t + a.clientHeight >= h) {

              a.style.left = 0 + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else if (l + a.clientWidth > w && t < 0) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = 0 + 'px'

            } else if (l + a.clientWidth < w && t + a.clientHeight >= h) {

              a.style.left = l + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else if (l + a.clientWidth < w && t < 0) {

              a.style.left = l + 'px'

              a.style.top = 0 + 'px'

            } else if (l + a.clientWidth > w && t + a.clientHeight < h) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = t + 'px'

            } else if (l + a.clientWidth > w && t + a.clientHeight >= h) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else {

              a.style.left = l + 'px'

              a.style.top = t + 'px'

            }

          }, 5),

          { passive: false }

        )

        a.addEventListener(

          'touchend',

          function (e) {

            // console.log(w)

            isStart = false

            document.ontouchmove = null

            document.ontouchmove = null

            distance = {

              type: 'move',

              clientX: x - e.changedTouches[0].clientX, // 拖动的 x 距离

              clientY: y - e.changedTouches[0].clientY // 拖动的 y 距离

            }

            binding.value(distance) // 返回拖动的距离

          },

          { passive: false }

        )

        // 移动端-- end

        // pc端

        a.onmousedown = function (e) {

          e.preventDefault()

          w = document.body.clientWidth // 当前屏幕宽度

          h = document.body.clientHeight // 当前屏幕的高度

          if (isStart) return // 如果已经开始拖拽, 返回

          isStart = true // 如果没有开始拖拽, 则可以拖拽

          var { clientX, clientY } = e

          var x = clientX - a.offsetLeft

          var y = clientY - a.offsetTop

          document.onmousemove = _.debounce(function (e) {

            e.preventDefault()

            l = e.clientX - x

            t = e.clientY - y

            if (l < 0 && t < 0) {

              a.style.left = 0 + 'px'

              a.style.top = 0 + 'px'

            } else if (l < 0 && t + a.clientHeight < h) {

              a.style.left = 0 + 'px'

              a.style.top = t + 'px'

            } else if (l < 0 && t + a.clientHeight >= h) {

              a.style.left = 0 + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else if (l + a.clientWidth > w && t < 0) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = 0 + 'px'

            } else if (l + a.clientWidth < w && t + a.clientHeight >= h) {

              a.style.left = l + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else if (l + a.clientWidth < w && t < 0) {

              a.style.left = l + 'px'

              a.style.top = 0 + 'px'

            } else if (l + a.clientWidth > w && t + a.clientHeight < h) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = t + 'px'

            } else if (l + a.clientWidth > w && t + a.clientHeight >= h) {

              a.style.left = w - a.clientWidth + 'px'

              a.style.top = h - a.clientHeight + 'px'

            } else {

              a.style.left = l + 'px'

              a.style.top = t + 'px'

            }

          }, 5)

          document.onmouseup = function (e) {

            document.onmousedown = null

            document.onmousemove = null

            isStart = false

            distance = {

              type: 'move',

              clientX: clientX - e.clientX, // 拖动的 x 距离

              clientY: clientY - e.clientY // 拖动的 y 距离

            }

            binding.value(distance) // 返回拖动的距离

          }

        }

        // pc端  -  end

      }

    })

    相关文章

      网友评论

          本文标题:vue 实现pc + 移动/h5随意拖拽

          本文链接:https://www.haomeiwen.com/subject/njsldctx.html