成品图如下所示:

点击篮球让篮球掉下

搭建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. JVM(零):走入JVM

    JVM(零):走入JVM 本系列主要讲述JVM相关知识,作为本系列的第一篇文章,本文从Java为什么是一个跨平台的语音开始介绍,逐步引入Java虚拟机的概念,并给出一个JVM相关知识图谱,可以让读者从 ...

  2. JDBC调用存储过程,进参出参

    今天做了一个数据表拷贝的功能,用到了存储过程,就写了一个java中用jdbc调用存储过程的代码,成功的实现了功能,晚上跑回家记录下 Connection conn = ConnectionUtil.g ...

  3. Free命令详解和释放linux Cache(转载)

    因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache.这些cache起来的内容可以增加文件以及的读写速度. 先说下free命令怎么看内存 [root@yuyii proc]# fr ...

  4. Deepin-安装node

    点击下载:Linux x64 文件解压: 方式1$xz -d file.tar.xz $tar -xvf file.tar 方式2 $tar xvJf file.tar.xz 解压后,把它移动到:/u ...

  5. Android从无知到有知——NO.6

    紧随上一篇,说一下创建ip拨号器过程中出现的一些问题. 1)在一開始监听外拨电话的时候会报这样一个警告: Permission Denial: receiving Intent { act=andro ...

  6. swift-for循环遍历,遍历字典,循环生成数组

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

  7. nyoj473 A^B Problem (高速幂)

    题目473 题目信息 执行结果 pid=473" style="text-decoration:none; color:rgb(55,119,188)">本题排行 ...

  8. [原创+分享]Mandelbrot Explorer

    Mandelbrot Explorer 是一款用于在MandelBort集/Julia集上进行无限漫游的软件,使用VS2013+CUDA6.5开发而成.它也是我学习CUDA开发的一个小小的成果,欢迎大 ...

  9. Rust 1.7.0 语法基础 sep_token 和 non_special_token

    一.分隔符 sep_token 指的是分隔符, 是除了 * 和 + 之外的不论什么符号,通常情况下是使用 , 逗号. 比如: 宏的多个參数分隔,以下代码中的逗号就是 sep_token (target ...

  10. hdu1873 看病要排队(结构体优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...