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,我们将及时处理。
微信扫码关注
更新实时通知