vue移动端拖拽移动元素

<template>
    <div
      ref="dragBox"
      style="position: fixed; left: 100px; top: 200px"
      @touchstart="touchstartHandle('dragBox', $event)"
      @touchmove="touchmoveHandle('dragBox', $event)"
    >
      可拖拽元素
    </div>
</template>
   data() {
        return {
            coordinate: {
                client: {},
                elePosition: {}
            }
        }
    },
    methods: {
        touchstartHandle(refName, e) {
            let element = e.targetTouches[0]
            // 记录点击的坐标
            this.coordinate.client = {
                x: element.clientX,
                y: element.clientY
            }
            // 记录需要移动的元素坐标
            this.coordinate.elePosition.left = this.$refs[refName].offsetLeft
            this.coordinate.elePosition.top = this.$refs[refName].offsetTop
        },
        touchmoveHandle(refName, e) {
            let element = e.targetTouches[0]
            // 根据初始 client 位置计算移动距离(元素移动位置=元素初始位置+光标移动后的位置-光标点击时的初始位置)
            let x = this.coordinate.elePosition.left + (element.clientX - this.coordinate.client.x)
            let y = this.coordinate.elePosition.top + (element.clientY - this.coordinate.client.y)
            // 限制可移动距离,不超出可视区域
            x = x <= 0 ? 0 : x >= innerWidth - this.$refs[refName].offsetWidth ? innerWidth - this.$refs[refName].offsetWidth : x
            y = y <= 0 ? 0 : y >= innerHeight - this.$refs[refName].offsetHeight ? innerHeight - this.$refs[refName].offsetHeight : y
            // 移动当前元素
            this.$refs[refName].style.left = x + 'px'
            this.$refs[refName].style.top = y + 'px'
        }
    },

 

posted on 2020-03-10 10:19  -coco  阅读(5648)  评论(0编辑  收藏  举报