24
2019
06

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

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

微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。