悬浮球效果的实现以及避免拖拽卡顿问题

269 阅读1分钟

悬浮球全屏拖动是一个常见的需求,本文记录一下实现的代码逻辑以及遇到的问题以及解决的思路

实现代码:

<div class="feedback-container" ref="ballFu" @mousedown="down" @mousemove="move" @mouseup="end">悬浮球</div>

//相关变量
const ballFu = ref()let timer = nulllet flags = false;let comPosition = {  x: 0,  y: 0,};let nx = "";let ny = "";let dx = "";let dy = "";let xPum = "";let yPum = "";let mouseDown = "";
//鼠标按下function down() {  try {    flags = true;    var touch;    if (event.touches) {      touch = event.touches[0];    } else {      touch = event;    }    comPosition.x = touch.clientX;    comPosition.y = touch.clientY;    dx = ballFu.value.offsetLeft;    dy = ballFu.value.offsetTop;  } catch (error) {    console.log(error, "error");  }}
//鼠标移动
function move() {  try {    if (flags) {      var touch;      if (event.touches) {        touch = event.touches[0];      } else {        touch = event;      }      nx = touch.clientX - comPosition.x;      ny = touch.clientY - comPosition.y;      xPum = dx + nx;      yPum = dy + ny;      let width = window.innerWidth - ballFu.value.offsetWidth; //屏幕宽度减去自身控件宽度      let height = window.innerHeight - ballFu.value.offsetHeight; //屏幕高度减去自身控件高度      xPum < 0 && (xPum = 0);      yPum < 0 && (yPum = 0);      xPum > width && (xPum = width);      yPum > height && (yPum = height);      ballFu.value.style.left = xPum + "px";      ballFu.value.style.right = "auto";      // ballFu.value.style.right = '30px';      // ballFu.value.style.left = 'auto';      ballFu.value.style.top = yPum + "px";      //阻止页面的滑动默认事件      document.addEventListener(        "touchmove",        function () {          event.preventDefault();        },        false      );    }  } catch (error) {    console.log(error, "error");  }}

//鼠标松开
function end() {  flags = false;}

这是最初的实现思路,但是这个写法写出来发现要是鼠标拖动过快的情况下,悬浮球的拖动效果就会失效,看起来就很卡顿,网上搜索一番后,改进了做法,JS相关代码不用删,改动HTML代码并增加一段JS代码后如下:

<div class="feedback-container" ref="ballFu">悬浮球</div>

onMounted(() => {  document.addEventListener('click', handleClickOutside);  const feedback = document.querySelector('.feedback-container');  feedback.addEventListener('mousedown',function(e){    down()    document.onmousemove = function(){      move()    }    document.onmouseup = function(){      end()    }  })});

改动之后,悬浮球就可以愉快地拖动而不卡顿了!芜湖~

参考文章:JS拖拽不流畅、鼠标滑动太快导致拖拽物脱离鼠标问题_前端鼠标拖动会断-CSDN博客