1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

JS运动效果的碰壁运动之自由落体

自由落体:元素在实际运动中,并不是保持匀速运动的,更多的是变速运动,而且会有速度损耗。典型的场景是自由落体运动,物体落地之后会反方向弹几下,最终停在地上

  自由落体运动可以看做是重力与阻力合作的结果。在空中运动时,向下运动时,做匀加速运动;向上运动时,做匀减速运动。与地面碰撞的瞬间,产生速度损耗

<!DOCTYPE html>  <html>  	<head>  		<meta charset="UTF-8">  		<title></title>    	</head>  <body>  <div id="test" style="height:50px;width: 50px;background:lightblue;position:absolute;top:60px;border-radius:50%;"></div>  <button id="btn1">开始运动</button>  <button id="btn2">还原</button>  <script>  document.onmousedown = function(){      return false;  }  btn1.onclick = function(){      collisionMove({          obj:test      })  }  btn2.onclick = function(){      history.go();  }  function getCSS(obj,style){      if(window.getComputedStyle){          return getComputedStyle(obj)[style];      }      return obj.currentStyle[style];  }    function collisionMove(json){      var obj = json.obj;      var fn = json.fn;      //声明y轴的当前值      var curY = parseFloat(getCSS(obj,'top'));      //声明offset高      var offsetHeight = obj.offsetHeight;      //声明元素活动区域高      var activeHeight = json.activeHeight;      //元素获取区域宽高默认值为可视区域高      activeHeight = Number(activeHeight) || document.documentElement.clientHeight;      //声明y轴的步长值      var stepY = 0;      //声明top样式值      var top;      //声明减速系数      var k = 0.8;      //声明碰撞次数      var i = 0;      //清除定时器      if(obj.timer){return;}       //开启定时器      obj.timer = setInterval(function(){          //获取y轴的当前值          curY = parseFloat(getCSS(obj,'top'));          //更新步长值stepY          stepY+= 5;          //更新top值          top = curY + stepY;          //下侧碰壁前一刻,步长大于剩余距离,且元素向下运动时          if(top > activeHeight - offsetHeight){              top = activeHeight - offsetHeight;          }          obj.style.top = top + 'px';          //下侧碰撞瞬间,改变运动方向,并产生速度损耗          if(top == activeHeight - offsetHeight){              //若碰撞10次后,则停止运动              i++;              if(i== 10){                  clearInterval(obj.timer)                  obj.timer = 0;                  fn && fn.call(obj);              }              stepY = -stepY * k;          }      },20);              }  </script>      </body>  </html>

原文链接:https://www.qiquanji.com/post/7057.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

作者:xialibing 分类:网页教程 浏览: