成品图如下所示:

点击篮球让篮球掉下

搭建HTML+CSS代码

html:

 <div id="demo"></div>

css:

div{
width:100px;
height:100px;
background-image:url("../images/lanqiu.png");
background-size: 100px 100px;
position: absolute;
left: 0px;
top: 0px;
border-radius: 50% 50%;
}

js代码(注释都在里面):

      var oDiv = document.getElementById('demo');
var timer = null; oDiv.onclick = function (){ //点击篮球触发运动函数
startMove(this);
} function startMove (dom){//运动函数
clearInterval(dom.timer);//清理定时器
var iSpeedX = 6; //横向初速度
var iSpeedY = 8; //竖向初速度
var g = 3; //重力初速度 dom.timer = setInterval(function (){ //开启定时器
iSpeedY += g; //竖向坐标每次加等于本身
var newTop = dom.offsetTop + iSpeedY; //篮球自身纵坐标加上竖向速度值付给newTop
var newLeft = dom.offsetLeft + iSpeedX;//篮球自身横坐标加上横向速度值付给newLeft
if(newTop >= document.documentElement.clientHeight - dom.clientHeight){ //newTop如果大于或等于浏览器窗口高度减去篮球自身高度
iSpeedY *= -1; //当篮球到达窗口底部的时候纵向速度乘以-1,使篮球反向运动 //加上能量损失,让篮球碰到四壁的时候,能量减小
iSpeedY *= 0.8; //纵向速度乘以0.8,会越乘越小
iSpeedX *= 0.8; //横向速度乘以0.8,会越乘越小
newTop = document.documentElement.clientHeight - dom.clientHeight;
//为了防止篮球大于等于底部的时候略过浏览器窗口底边出现滚动条,所以让newTop值直接等于浏览器窗口高度减去自身高度
}
if(newTop <= 0){ //当newTop值反向走到流浪器窗口顶部的时候,即等于0
iSpeedY *= -1; //则继续以纵向速度乘以-1,继续反向运动 //加上能量损失,让篮球碰到四壁的时候,能量减小
iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
newTop = 0; //防止略过窗口,直接让newTop值等于0
}
if(newLeft >= document.documentElement.clientWidth - dom.clientWidth){//newLeft如果大于或等于流浪器窗口宽度减去篮球自身宽度
iSpeedX *= -1;//则继续以横向速度乘以-1,继续反向运动 //加上能量损失,让篮球碰到四壁的时候,能量减小
iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
newLeft = document.documentElement.clientWidth - dom.clientWidth;
//为了防止篮球大于等于宽度的时候略过浏览器窗口宽度出现横向滚动条,所以让newTop值直接等于浏览器窗口宽度减去自身宽度
}
if(newLeft <= 0){ //当newLeft值反向走到流浪器窗口最左侧的时候,即等于0
iSpeedX *= -1;//则继续以横向速度乘以-1,继续反向运动 //加上能量损失,让篮球碰到四壁的时候,能量减小
iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
newLeft = 0;//防止略过窗口,直接让newTop值等于0
}
if(Math.abs(iSpeedX) < 1 && Math.abs(iSpeedY) < 1){ //当横向速度和纵向速度小于1的时候,横向纵向速度等于0
iSpeedX = 0;
iSpeedY = 0;
}
if(iSpeedX == 0 && iSpeedY == 0 && newTop == document.documentElement.clientHeight - dom.clientHeight){
//当横向速度和纵向速度等于0并且newTop值等于窗口高度减去自身高度的时候
clearInterval(dom.timer);//清理定时器,停止运动
}else{//停了运动就跟着停止了
dom.style.top = newTop + 'px';
dom.style.left = newLeft + 'px';
}
},30);//每30毫秒运行一次
}

谢谢观看,如有大佬经过请多指教!    谢谢观看,如有大佬经过请多指教!   谢谢观看,如有大佬经过请多指教!

原生JavaScript之实战 模拟重力场(篮球)的更多相关文章

  1. 原生javascript之实战 轮播图

    成品效果如下图所示: 因为博客园限制图片上传大小被我删了一些帧数,所以图片看起来会有一点卡,现实运行是不会的 搭建HTML和CSS结构 HTML代码如下: <div class="wr ...

  2. 用原生javascript模拟经典FC游戏公路争霸

    #用原生javascript模拟经典FC游戏公路争霸 前几天看了园子里面的随笔 [原生javascript开发仿微信打飞机小游戏](http://www.cnblogs.com/Mr-Nobody/p ...

  3. 原生javascript模仿win8等待进度条。

    一.序言 一直很中意win8等待提示圆圈进度条.win8刚出来那会,感觉好神奇!苦于当时没思路,没去研究.通过最近网上找找资料,终于给搞出来了!先上Demo,献丑了!预览请看:win8进度条. 二.简 ...

  4. 表单美化-原生javascript和jQuery单选按钮(兼容IE6)

    最近很多人问怎么美化表单的元素,大家都知道表单元素在各个浏览器中的表现不一,反正也是特别的丑,那么问题就来了,我们能自己设计表单元素的外观么?答案是可以的,现在我们就来试试吧.我们用两种方式来实现这一 ...

  5. 使用原生 JavaScript 操作 DOM

    原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...

  6. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  7. 原生 JavaScript 实现 state 状态管理系统

    原生 JavaScript 实现 state 状态管理系统 Build a state management system with vanilla JavaScript | CSS-Tricks 在 ...

  8. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  9. JavaScript继承的模拟实现

    我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类 ...

随机推荐

  1. 异步SOCKET分包和组包的一种通用算法

    unit uPackage;// 应用协议// cxg 2016-9-23// 包=包头+包体 interface uses SysUtils, Classes, PeachCtrl.Net.Iocp ...

  2. 分布式RPC框架性能大比拼

    https://github.com/grpc/grpc http://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/ http ...

  3. 将oracle10g 升级至10.2.0.4

    http://blog.csdn.net/launch_225/article/details/7221489 一.单实例环境,全时长一个半钟多. 详细图文说明到这下载 1.停止所有oracle相关进 ...

  4. 项目中遇到的HQL查询问题

    问题描写叙述: 目的:想要查询出全部最新版本号的组件 说明:组件:版本号 =1:n关系 ,假设这个组件仅仅有一个版本号也要可以查出来. 项目中使用的是内存数据库,无法看到表结构,这里的样例仅仅用于模拟 ...

  5. Hdfs的ACL測试

    Hadoop从2.4.0版本号開始支持hdfs的ACL,在CDH5.0其中也集成了该特性,以下对其进行一些測试: unnamed user (file owner) 文件的拥有者 unnamed gr ...

  6. Linux安全应用之防垃圾邮件server的构建

    Linux安全应用之防垃圾邮件server的构建 一.垃圾邮件产生的原因 垃圾邮件(SPAM) 也称作UCE(Unsoticited Commercial Email.未经许可的商业电子邮件)或UBE ...

  7. uva live 4394 String painter 区间dp

    // uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...

  8. iOS 开发小常识 开发笔记

    一   自定义push方法 /*  参数说明 *  controllerName : push的目标页 例:@“testcontroll”    ---注意不带.h *  isNibPage     ...

  9. Linux设备驱动--块设备(四)之“自造请求”

    前面, 我们已经讨论了内核所作的在队列中优化请求顺序的工作; 这个工作包括排列请求和, 或许, 甚至延迟队列来允许一个预期的请求到达. 这些技术在处理一个真正的旋转的磁盘驱动器时有助于系统的性能. 但 ...

  10. Resolve the error: an error occurred during local report processing

    Issue: an error occurred during local report processing.the definition of the report'Main Report'is ...