成品图如下所示:

点击篮球让篮球掉下

搭建HTML+CSS代码

html:

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

css:

  1. div{
  2. width:100px;
  3. height:100px;
  4. background-image:url("../images/lanqiu.png");
  5. background-size: 100px 100px;
  6. position: absolute;
  7. left: 0px;
  8. top: 0px;
  9. border-radius: 50% 50%;
  10. }

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

  1.      var oDiv = document.getElementById('demo');
  2. var timer = null;
  3.  
  4. oDiv.onclick = function (){ //点击篮球触发运动函数
  5. startMove(this);
  6. }
  7.  
  8. function startMove (dom){//运动函数
  9. clearInterval(dom.timer);//清理定时器
  10. var iSpeedX = 6; //横向初速度
  11. var iSpeedY = 8; //竖向初速度
  12. var g = 3; //重力初速度
  13.  
  14. dom.timer = setInterval(function (){ //开启定时器
  15. iSpeedY += g; //竖向坐标每次加等于本身
  16. var newTop = dom.offsetTop + iSpeedY; //篮球自身纵坐标加上竖向速度值付给newTop
  17. var newLeft = dom.offsetLeft + iSpeedX;//篮球自身横坐标加上横向速度值付给newLeft
  18. if(newTop >= document.documentElement.clientHeight - dom.clientHeight){ //newTop如果大于或等于浏览器窗口高度减去篮球自身高度
  19. iSpeedY *= -1; //当篮球到达窗口底部的时候纵向速度乘以-1,使篮球反向运动
  20.  
  21. //加上能量损失,让篮球碰到四壁的时候,能量减小
  22. iSpeedY *= 0.8; //纵向速度乘以0.8,会越乘越小
  23. iSpeedX *= 0.8; //横向速度乘以0.8,会越乘越小
  24. newTop = document.documentElement.clientHeight - dom.clientHeight;
  25. //为了防止篮球大于等于底部的时候略过浏览器窗口底边出现滚动条,所以让newTop值直接等于浏览器窗口高度减去自身高度
  26. }
  27. if(newTop <= 0){ //当newTop值反向走到流浪器窗口顶部的时候,即等于0
  28. iSpeedY *= -1; //则继续以纵向速度乘以-1,继续反向运动
  29.  
  30. //加上能量损失,让篮球碰到四壁的时候,能量减小
  31. iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
  32. iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
  33. newTop = 0; //防止略过窗口,直接让newTop值等于0
  34. }
  35. if(newLeft >= document.documentElement.clientWidth - dom.clientWidth){//newLeft如果大于或等于流浪器窗口宽度减去篮球自身宽度
  36. iSpeedX *= -1;//则继续以横向速度乘以-1,继续反向运动
  37.  
  38. //加上能量损失,让篮球碰到四壁的时候,能量减小
  39. iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
  40. iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
  41. newLeft = document.documentElement.clientWidth - dom.clientWidth;
  42. //为了防止篮球大于等于宽度的时候略过浏览器窗口宽度出现横向滚动条,所以让newTop值直接等于浏览器窗口宽度减去自身宽度
  43. }
  44. if(newLeft <= 0){ //当newLeft值反向走到流浪器窗口最左侧的时候,即等于0
  45. iSpeedX *= -1;//则继续以横向速度乘以-1,继续反向运动
  46.  
  47. //加上能量损失,让篮球碰到四壁的时候,能量减小
  48. iSpeedY *= 0.8;//纵向速度乘以0.8,会越乘越小
  49. iSpeedX *= 0.8;//横向速度乘以0.8,会越乘越小
  50. newLeft = 0;//防止略过窗口,直接让newTop值等于0
  51. }
  52. if(Math.abs(iSpeedX) < 1 && Math.abs(iSpeedY) < 1){ //当横向速度和纵向速度小于1的时候,横向纵向速度等于0
  53. iSpeedX = 0;
  54. iSpeedY = 0;
  55. }
  56. if(iSpeedX == 0 && iSpeedY == 0 && newTop == document.documentElement.clientHeight - dom.clientHeight){
  57. //当横向速度和纵向速度等于0并且newTop值等于窗口高度减去自身高度的时候
  58. clearInterval(dom.timer);//清理定时器,停止运动
  59. }else{//停了运动就跟着停止了
  60. dom.style.top = newTop + 'px';
  61. dom.style.left = newLeft + 'px';
  62. }
  63. },30);//每30毫秒运行一次
  64. }

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

原生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. 解决idea中启动tomcat出现控制台乱码问题

    尝试了很多方法,最后终于解决了,现在提供给大家一个我认为最简单也最有效的方案. 1.修改配置文件 找到idea的安装目录,在bin文件夹下找到以下两个文件,用记事本或者其他软件打开: 然后两个文件中都 ...

  2. Java的对象和类

    以下内容引用自http://wiki.jikexueyuan.com/project/java/object-classes.html: 一.概述 Java是一种面向对象的语言.作为一种具有面向对象特 ...

  3. IOS开发 AFN和ASI

    做项目有一段时间了,项目过程中处理网络请求难免的,而对于选择第三方来处理网络请求肯定是个明智的选择! AFNetworking和ASIHTTPRequest   这两个第三方该如何选择       我 ...

  4. 【Todo】开个文章学VUE咯

    2017年FE架构组制定的框架选型主导为VUE.看了一下VUE的介绍,很不错. 开学~ https://www.zhihu.com/question/38213423 这个里面有VUE应用和背景的一些 ...

  5. rand和srand的用法(转载)

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include<stdlib.h> ...

  6. Kemans算法及其Python 实现

    算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就 ...

  7. Java使用三种不同循环结构对1+2+3+...+100 求和

    ▷//第一种求法,使用while结构 /** * @author 9527 * @since 19/6/20 */ public class Gaosi { public static void ma ...

  8. 运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the service 'tomcat6'

    错误:运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the service 'tomcat6'(我用的是官网下载的解压版) 解决方法: 打开命令行提示符窗口=& ...

  9. ABAP Debug 技巧

    小技巧,可以在Debugger的时候跳过不想执行的代码,           或者返回执行已经执行过的代码,实际开发过程中很有帮助

  10. NDK编程中如何在C文件中打印调试信息

      1,在Android.mk文件中加上 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PATH := $(call my-dir)include ...