vue 移動端 PC 兼容 元素 拖拽移動
效果演示
事件知識點
移動端 | PC端 | 注釋 |
touchstart | mousedown | 鼠標/手指按下事件 |
touchmove | mousemove | 鼠標/手指移動事件 |
touchend | mouseup | 鼠標松開/手指抬起事件 |

實現思路
1.鼠標按下時 記錄 按下狀態 記錄x y軸坐標
2.按下移動時 動態計算坐標 設置拖拽元素 style 控制位置 ;
2.1判斷拖拽區域 溢出時 歸位判斷;
2.2拖拽時 阻止頁面滑動
3.鼠標抬起 修改 按下狀態
上代碼
<template lang="pug"> //- 當前頁面全局容器 div.SchemeDetail( ref='pageDiv' @mousemove="onmousemove($event)" @touchmove="onmousemove($event)" @mouseup="onmouseup($event)" @touchend="onmouseup($event)" ) //- 加號拖拽元素 div.action-mgr(:class="{ active :mgrState}" ref='actionMgr' @click="mgrState=!mgrState" @mousedown="onmousedown($event)" @touchstart="onmousedown($event)") <i class="icon iconfont icon-jia"></i> ..... </template> <script> export default { data() { return { mgrState: false, mousedownState: false, //鼠標默認抬起 iX: 0,//鼠標坐標 與 拖拽按鈕 間距 x iY: 0//鼠標坐標 與 拖拽按鈕 間距 y }; }, methods: { send() { console.log("send"); }, edit() { console.log("edit"); }, /* 鼠標按下事件 */ onmousedown(event) { /* 此處判斷 pc 或 移動端 得到 event 事件 */ var touch; if (event.touches) { touch = event.touches[0]; } else { touch = event; } // 鼠標點擊 面向頁面 的 x坐標 y坐標 let { clientX, clientY } = touch; // 鼠標x坐標 - 拖拽按鈕x坐標 得到鼠標 距離 拖拽按鈕 的間距 this.iX = clientX - this.$refs.actionMgr.offsetLeft; // 鼠標y坐標 - 拖拽按鈕y坐標 得到鼠標 距離 拖拽按鈕 的間距 this.iY = clientY - this.$refs.actionMgr.offsetTop; // 設置當前 狀態為 鼠標按下 this.mousedownState = true; }, /* 鼠標移動事件 */ onmousemove(event) { //鼠標按下 切移動中 if (this.mousedownState) { /* 此處判斷 pc 或 移動端 得到 event 事件 */ var touch; if (event.touches) { touch = event.touches[0]; } else { touch = event; } // 鼠標移動時 面向頁面 的 x坐標 y坐標 let { clientX, clientY } = touch; //當前頁面全局容器 dom 元素 獲取容器 寬高 let { clientHeight: pageDivY, clientWidth: pageDivX } = this.$refs.pageDiv; /* 鼠標坐標 - 鼠標與拖拽按鈕的 間距坐標 得到 拖拽按鈕的 左上角 x軸y軸坐標 */ let [x, y] = [clientX - this.iX, clientY - this.iY]; //拖拽按鈕 dom 元素 獲取 寬高 style 對象 let { clientHeight: actionMgrY, clientWidth: actionMgrX, style: actionMgrStyle } = this.$refs.actionMgr; /* 此處判斷 拖拽按鈕 如果超出 屏幕寬高 或者 小於 設置 屏幕最大 x=全局容器x y=全局容器y 否則 設置 為 x=0 y=0 */ if (x > pageDivX - actionMgrX) x = pageDivX - actionMgrX; else if (x < 0) x = 0; if (y > pageDivY - actionMgrY) y = pageDivY - actionMgrY; else if (y < 0) y = 0; // 計算后坐標 設置 按鈕位置 actionMgrStyle.left = `${x}px`; actionMgrStyle.top = `${y}px`; actionMgrStyle.bottom = "auto"; actionMgrStyle.right = "auto"; //當按下鍵滑動時, 阻止屏幕滑動事件 event.preventDefault(); } }, /* 鼠標抬起事件 */ onmouseup(event) { // 設置當前狀態為鼠標抬起 this.mousedownState = false; } } }; </script>