碰撞运动+重力+拖拽+摩擦力

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<meta charset='utf-8' /> 
		<style>
		  #div1{width: 100px; height: 100px; background: red; position: absolute; left: 0; top: 40px;}
		</style>
<script>

//添加拖拽功能

window.οnlοad=function(){
	var oDiv=document.getElementById('div1');

	//当在oDiv中点击鼠标(这里会用到事件对象),则将获取X,Y鼠标当前位置-oDiv
	//当前的left和top值,获取到鼠标离oDiv最左边/上边的距离
	oDiv.οnmοusedοwn=function(ev){
		var oEvent=ev || event;

		var disX=oEvent.clientX-oDiv.offsetLeft;
		var disY=oEvent.clientY-oDiv.offsetTop;

		//当在文档中移动鼠标时,则将当前鼠标坐标-已处理好的disX和disY,获取到oDiv.left/top值
		document.οnmοusemοve=function(ev){
			var oEvent=ev || event;

			var l=oEvent.clientX-disX;
			var t=oEvent.clientY-disY;

			//oDiv的left/top值=获取到的oDiv.left/top值,则用户如何移动left/top随之改变
			oDiv.style.left=l+"px";
			oDiv.style.top=t+"px";
		};

		//当鼠标在文档松开时,则把鼠标移动/松开的方法置空.
		document.οnmοuseup=function(){
			document.οnmοusemοve=null;
			document.οnmοuseup=null;

			//在鼠标松开时调用startMove函数,实现自由弹跳
			startMove();
		};

		//当鼠标移动时,则关闭定时器,为了避免跟startMove函数抢定时器.
		 clearInterval(timer);
	};
};


//定义X和Y轴速度;
var speedX=25;
var speedY=100;
var timer=null;

function startMove(){
	clearInterval(timer);
	timer=setInterval(function(){
		var oDiv=document.getElementById("div1");
		//每次Y轴+2,越弹越高
		speedY+=5;
		//把X,Y轴速度存起来,便意使用
		var l=oDiv.offsetLeft+speedX;
		var t=oDiv.offsetTop+speedY;

		//当T大于了可视化区域-oDIV的高度,就使oDiv越来越慢,随之等于可视化区域-oDiv当前高度.避免了撑大可视化区域
		if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
		{
			//Y*-0.8 使越弹越矮;当然也要让X轴越来越小,随之T等于可视化区域-oDiv当前高度
			speedY*=-0.8;
			speedX*=0.8;
			t=document.documentElement.clientHeight-oDiv.offsetHeight;
		}

		//当T小余等于0时,使Y轴*=-0.8,使越弹越矮;当然也使X轴变慢,随之T=0,避免了撑大可视化区域
		else if(t<=0){
			speedY*=-1;
			speedX*=0.8
			t=0;
		}

		//当L大于了可视化区域-oDIV的宽度,就使oDiv越来越慢,随之等于可视化区域-oDiv当前宽度.避免了撑大可视化区域
		if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
		{
			//X*-0.8 使越弹越矮,随之L等于可视化区域-oDiv当前高度
			speedX*=-0.8;
			l=document.documentElement.clientWidth-oDiv.offsetWidth
		}

		//当L小余等于0时,使X轴*=-0.8,使越弹越矮;随之L=0,避免了撑大可视化区域
		else if(l<=0){
			speedX*=-0.8;
			l=0;
		}

		//当X和Y轴的绝对值小余1时,则X和Y轴=0; 避免负小数点出现误差
		if(Math.abs(speedX)<1){
			speedX=0;
		}
		if(Math.abs(speedY)<1){
			speedY=0;
		}

		//停止条件:当X,Y轴速度都为0时,并且t=可视化高度-oDiv.offsetHeight,则关闭定时器
		if(speedX==0 && speedY==0 && t==document.documentElement.clientHeight-oDiv.offsetHeight){
			clearInterval(timer);
		}else{

		//添加oDIV速度
		oDiv.style.left=l+"px";
		oDiv.style.top=t+"px";
			}

		document.title=speedX;
	},30)
}
</script>
	</head>
	<body>
		<input type="button" value="开始运动" οnclick="startMove()"/>
		<div id="div1"></div>
	</body>
</html>

  

转载于:https://www.cnblogs.com/xiaojiangk/p/7680823.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值