为了账号安全,请及时绑定邮箱和手机立即绑定

拖拽抛物动画bug怎么解决?

拖拽抛物动画bug怎么解决?

天天向上学 2019-03-17 23:52:37
html<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>js抛物动画</title>     <link rel="stylesheet" href="css/reset.min.css">     <style>  html, body {             height: 100%;  overflow: hidden;  }         #box1, #box2, #box3 {             position: absolute;  width: 150px;  height: 150px;  cursor: move;  z-index: 0;  }         #box1 {             top: 100px;  left: 100px;  background: lightcoral;  }         #box2 {             top: 200px;  left: 400px;  background: lightgreen;  }         #box3 {             top: 50px;  left: 50px;  background: orange;  }     </style> </head> <body> <div id="box1"></div> <div id="box2"></div> <div id="box3"></div> <script src="js/subscribe.js"></script> <script src="js/drag.js"></script> <script>  let drag1 = new Drag(box1),  drag2 = new Drag(box2),  drag3 = new Drag(box3);  let change = function change(curEle) {         let divs = document.querySelectorAll("div");  [].forEach.call(divs, function (item) {             item.style.zIndex = 0;  });  curEle.style.zIndex = 1;  };  drag1.subDown.add(change);  drag2.subDown.add(change);  drag3.subDown.add(change);  let computedFly = function computedFly(curEle) {         if (!curEle.lastFly) {             curEle.lastFly = curEle.offsetLeft;  curEle.speedFly = 0;  return;  }         curEle.speedFly = curEle.offsetLeft - curEle.lastFly;  curEle.lastFly = curEle.offsetLeft;  }     drag1.subMove.add(computedFly);  drag2.subMove.add(computedFly);  drag3.subMove.add(computedFly);  let stopAnimate = function stopAnimate(curEle) {         clearInterval(curEle.flyTimer);  curEle.speedFly = undefined;  clearInterval(curEle.dropTimer);  };  drag1.subDown.add(stopAnimate);  drag2.subDown.add(stopAnimate);  drag3.subDown.add(stopAnimate);  let animateFly = function animateFly(curEle) {         let minL = 0,  maxL = document.documentElement.clientWidth - curEle.offsetWidth;  let speed = curEle.speedFly,  dir = "right";  speed < 0 ? dir = "left" : null;  speed = Math.abs(speed);  curEle.flyTimer = setInterval(() => {             if (speed < 0.5) {                 clearInterval(curEle.flyTimer);  return;  }             speed *= 0.98;  let curL = curEle.offsetLeft;  if (dir === "right") {                 if (curL >= maxL) {                     curEle.style.left = maxL + "px";  dir = "left";  return;  }                 curL += speed;  } else {                 if (curL < minL) {                     curEle.style.left = minL + "px";  dir = "right";  return;  }                 curL -= speed;  }             curEle.style.left = curL + "px";  }, 17);  }     drag1.add(animateFly);  drag2.add(animateFly);  drag3.add(animateFly);  let animateDrop = function animateDrop(curEle) {         let speed = 9.8,  minT = 0,  maxT = document.documentElement.clientHeight - curEle.offsetHeight,  flag = 0;  curEle.dropTimer = setInterval(() => {             if (flag > 1) {                 clearInterval(curEle.dropTimer);  return;  }             speed +=10;  speed-=0.98;  let curT = curEle.offsetTop;  curT+=speed;  if(curT>=maxT){                 curEle.style.top=maxT+"px";  speed*=-1;  flag++;  return;  }             if(curT<=minT){                 curEle.style.top=minT+"px";  speed*=-1;  return;  }             curEle.style.top =curT+"px";  flag =0;  }, 17)     }     drag1.add(animateDrop);  drag2.add(animateDrop);  drag3.add(animateDrop); </script> </body> </html>subscribe.js~function anonymous(window) {     class Subscribe {         constructor() {             this.pond = [];         }         add(fn) {             let pond = this.pond,                 isExist = false;             pond.forEach(item=>item === fn ? isExist = true : null);             !isExist ? pond.push(fn) : null;         }         remove(fn) {             let pond = this.pond;             pond.forEach((item,index)=>{                 if (item===fn){                     pond[index]=null;                 }             })         }         fire(...arg) {             let pond = this.pond;             for(let i=0;i<pond.length;i++){                 let item=pond[i];                 if (item===null){                     pond.splice(i,1);                     i--;                     continue;                 }                 item(...arg);             }         }     }     window.Subscribe = Subscribe; }(window);drag.js~function anonymous() {     if (typeof Subscribe==='undefined') {{         throw new ReferenceError("不能没有订阅工具插件");     }     }     class Drag extends Subscribe {         constructor(ele) {             super();             this.ele = ele;             ['strX', 'strY', 'strL', 'strT', 'curL', 'curT'].forEach(item=> {                 this[item] = null;             });             this.subDown = new Subscribe;             this.subMove = new Subscribe;             this.DOWN = this.down.bind(this);             this.ele.addEventListener('mousedown', this.DOWN);         }         down(ev) {             ev.preventDefault();             let ele = this.ele;             this.strX = ev.clientX;             this.strY = ev.clientY;             this.strL = ele.offsetLeft;             this.strT = ele.offsetTop;             this.MOVE = this.move.bind(this);             this.UP = this.up.bind(this);             document.addEventListener('mousemove', this.MOVE);             document.addEventListener('mouseup', this.UP);             this.subDown.fire(ele,ev);         }         move(ev) {             ev.preventDefault();             let ele = this.ele;             this.curL = ev.clientX - this.strX + this.strL;             this.curT = ev.clientY - this.strY + this.strT;             ele.style.left = this.curL + "px";             ele.style.top = this.curT + "px";             this.subMove.fire(ele,ev);         }         up(ev) {             ev.preventDefault();             document.removeEventListener('mousemove', this.MOVE);             document.removeEventListener('mouseup', this.UP);             this.fire(this.ele,ev);         }     }     window.Drag = Drag; }();这个demo有个bug: 就是在下坠抛物期间 长按鼠标捕获移动中的元素时. 鼠标按下并移动快的时候,有时候会出现一个"禁止"的鼠标指针. 然后这个元素在按下鼠标时就跟鼠标黏贴住了.抬起鼠标后这个元素会不停的上下高速移动,按下鼠标后,又黏贴鼠标.并且如果多试几遍去操作另外那两个元素的话.另外那两个元素也会出现同样的bug现象,同时黏住鼠标,撒开鼠标就上下高速运动. 请帮忙看看什么问题,谢谢!!
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 772 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信