成品图如下所示:

点击篮球让篮球掉下

搭建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. Codechef-BLACKCOM(树形背包dp)

    题意: 给你一棵由 N 个节点构成的树 T.节点按照 1 到 N 编号,每个节点要么是白色,要么是黑色.有 Q 组询问,每组询问形如 (s, b).你需要检查是否存在一个连通子图,其大小恰好是 s,并 ...

  2. WinCE5.0如何安装.NET3.5

    首先去微软官网下载.NET Compact Framework 3.5 Redistributable 点击下载 下载页面 一共有两种安装方式,我们先介绍常规的安装方式 1.设备连接到电脑,然后双击下 ...

  3. Centos7 Samba 独立账户

    创建了一个组:smbgrp 和用户srijan通过认证来访问Samba服务器. groupadd smbgrp useradd srijan -G smbgrp smbpasswd -a srijan ...

  4. ASP.net MVC+ViewData VS ViewBag

         在使用MVC框架的过程中,往界面传值,我们使用的ViewData.如ITOO部分代码图解:      当然除了ViewData,我们还能够使用同卵兄弟(ViewBag)来完毕相同的功能,详情 ...

  5. startActivity启动过程分析(转)

    基于Android 6.0的源码剖析, 分析android Activity启动流程,相关源码: frameworks/base/services/core/java/com/android/serv ...

  6. PHP开发者实用的代码

    一.查看邮件是否已被阅读 当你在发送邮件时,你或许很想知道该邮件是否被对方已阅读.这里有段非常有趣的代码片段能够显示对方IP地址记录阅读的实际日期和时间. <? error_reporting( ...

  7. 关于 equals()与hashcode()方法

    类重写了equals()方法也必须重写hashcode()方法,否则会导致该类无法与基于散列值的集合(HashMap.HashSet.HashTable)一起正常使用. hashcode()方法遵循的 ...

  8. ios archives 出现的是other items而不是iOS Apps的解决方案

    ios archives 出现的是other items而不是iOS Apps的解决方案 项目打包时出现的是不是出现在iOS Apps栏目下面,而是Other Items而且右边对应的Upload t ...

  9. oracle 10g的备份和还原

    采用 expdp备份,impdp还原. 注意这二者不等同于exp和imp.oracle 10g以前,可以采用exp.imp,10g及以后,expdp + impdp矣.据说10g里面,如果采用exp, ...

  10. Koa2学习(八)使用session

    Koa2学习(八)使用session koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session. 先安装插件: $ npm i koa-s ...