js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效

(代码可以直接复制使用,只需要把body中的div的id换成对应的就行,css中可以设置小球的大小和初始位置,修改小球大小之后需要在js里把现在的80改成小球的大小值)

最终实现效果图:

思路:首先先实现一个小球的运动和撞边框反弹效果,并且改变其颜色,效果如下图:

主要实现方法:

1.小球定位,运动靠改变它的position上下左右值;

2.获取浏览器的宽高,由此设置小球运动的最大范围,大于等于这个范围的时候就改变运动方向;

3.颜色的改变采用rgb方法,rgb的三个数值均用Math.random随机生成;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>运动的小球</title><style><!--单个小球的样式-->.ball{width:80px;height:80px;background: red;border-radius: 50%;position:absolute;top:0;left:0;}</style>
</head>
<body><div class="ball"></div>         <!--单个小球的div--><script>var oBall = document.querySelector('.ball'),leftNum = 5;             //设置小球每次向左运动的像素值topNum = 5;              //设置小球每次向下运动的像素值leftMax = document.documentElement.clientWidth-oBall.clientWidth;             //浏览器窗口宽度减去小球的宽度等于小球能运动到的最大左边位置,下一行代码同理。topMax = document.documentElement.clientHeight-oBall.clientHeight;window.onresize = function(){     //当浏览器窗口发生变化时,实时获取浏览器窗口的宽高leftMax = document.documentElement.clientWidth-oBall.clientWidth;topMax = document.documentElement.clientHeight-oBall.clientHeight;}setInterval(function(){              //为小球的运动新建一个计时器var Left = oBall.offsetLeft+leftNum,    //小球每次运动完之后,距离浏览器左边边框的距离:上一次距离边框的距离加上这次运动的距离,下一行代码同理Top = oBall.offsetTop+topNum;//判断当小球向左移动的位置大于之前限定的最大距离或者小于0时,也就是超出浏览器窗口的左右边框时,//使他运动的方向取反leftNum = -leftNum,下面Top的判断同理。if(Left>=leftMax){               Left = leftMax;leftNum = -leftNum;ballBg(oBall);     //传参数到下面的获取随机颜色的function}else if(Left<=0){Left = 0;leftNum = -leftNum;ballBg(oBall);};if(Top>=topMax){Top = topMax;topNum = -topNum;ballBg(oBall);}else if(Top<=0){Top = 0;topNum = -topNum;ballBg(oBall);};oBall.style.left = Left+'px';      oBall.style.top = Top+'px';},30);                        //小球每次执行运动的时间function ballBg(obj){             //随机获取小球颜色var r = Math.floor(Math.random()*256);g = Math.floor(Math.random()*256);b = Math.floor(Math.random()*256);obj.style.backgroundColor = 'rgb('+r+','+g+','+b+')';}</script>
</body>
</html>

一个小球的运动实现之后,当实现多个小球的时候,有两个问题需要考虑:

1.小球数量不能写死,万一数量很多,所以最好不要用div写,而是用appendChild的方法追加,这样,原来<div class="ball"></div>单个;小球的div需要改成<div id="ball"></div> 一个大的div,然后往这个大的div中追加<div class="ball"></div>

2.小球的运动起点虽然相同,但是运动速度不能相同,不然所有的小球都会重叠在一起运动;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>运动的小球</title><style>.ball{width:80px;height:80px;background: red;border-radius: 50%;position:absolute;top:0;left:0;}</style>
</head>
<body><div id="ball"></div><script>var oBall = document.querySelector('#ball'),leftNum = 0,topNum = 0,aBall = null,length = 0;reSize();    window.onresize = reSize;function reSize(){leftMax = document.documentElement.clientWidth-80;topMax = document.documentElement.clientHeight-80;}creatBall(oBall,10);         //传参,往oBall里面追加10个小球aBall = oBall.children;      //获取oBall里面的所有小球length = aBall.length;function creatBall(obj,num){     //创建小球的functionfor(var i=0;i<num;i++){var cBall = document.createElement('div');cBall.className = 'ball';ballBg(cBall);cBall.leftNum=cBall.topNum=(i+1)*1;    //这里去i+1而不取i的原因是,一个小球的i为0,如果不取i+1,那么第一个小球会永远在左上角不动并且不停地变颜色obj.appendChild(cBall);};};setInterval(function(){       //这里注意需要将之前所有对oBall设置的都换成aBall[i]for (var i=0;i<length;i++ ){var Left = aBall[i].offsetLeft+aBall[i].leftNum,Top = aBall[i].offsetTop+aBall[i].topNum;if(Left>=leftMax){Left = leftMax;aBall[i].leftNum = -aBall[i].leftNum;ballBg(aBall[i]);}else if(Left<=0){Left = 0;aBall[i].leftNum = -aBall[i].leftNum;ballBg(aBall[i]);};if(Top>=topMax){Top = topMax;aBall[i].topNum = -aBall[i].topNum;ballBg(aBall[i]);}else if(Top<=0){Top = 0;aBall[i].topNum = -aBall[i].topNum;ballBg(aBall[i]);};aBall[i].style.left = Left+'px';aBall[i].style.top = Top+'px';}   },30);function ballBg(obj){var r = Math.floor(Math.random()*256);g = Math.floor(Math.random()*256);b = Math.floor(Math.random()*256);obj.style.backgroundColor = 'rgb('+r+','+g+','+b+')';}</script>
</body>
</html>

以上,好多小球的碰撞效果就完成了,代码有问题或者还有可以优化的地方,请指教,如果您觉得这篇文章对您有帮助,麻烦点个赞吧~~

js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效相关推荐

  1. js小球与边框碰撞反弹_四叉树在碰撞检测中的应用

    缘起 <你被追尾了>中预告了加速碰撞检测的算法--四叉树(for 2D),所以本文就来学习一下. 分析 首先是为什么要使用四叉树进行优化,其实<你被追尾了>中已经说了,这里简单 ...

  2. 简单html js 特效,Js实现简单的小球运动特效

    废话不多说了,直接给大家贴js代码了,具体代码如下所示: //定义局部变量 var directX=;//定义x轴方向 var directY=;//定义y轴方向 var ballX=;//定义x轴坐 ...

  3. Canvas+Js制作动量守恒的小球碰撞

    目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,c ...

  4. js实现多个小球碰撞

    实现思路:小球的移动,是通过改变小球的left和top值来改变,坐标分别为(x,y)当x/y值加到最大,即加到父级的宽度或者高度时,使x值或者y值减小,同理当x值或者y值减到最小时,同样的使x值或者y ...

  5. canvas小球连线碰撞效果 html+css+js

    先看效果(完整代码在底部): canvas小球连线碰撞完整源代码 html+css+js 这是我的B站地址~热烈欢迎 实现(看注释,可一步一步跟着实现): 0:定义标签: <h1>北极光之 ...

  6. 游戏开发:js实现简单的板球游戏

    js实现简单的板球游戏 大家好,本次我们来使用js来实现一个简单的板球游戏.截图如下: 首先,设计页面代码,页面代码很简单,因为整个几乎是使用js编写的,页面几乎没有代码,如下: <!DOCTY ...

  7. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  8. 小球自由落体及碰撞反弹

    目录 简述 构成 小球 按钮 运动轨迹 总结 简述 通过setInterval()定时刷新小球位置来完成小球运动状态,模拟自由落体加速度及碰撞反弹效果 构成 整体的物体很少,只有一个小球及一个开始按钮 ...

  9. css画钟表_利用css+原生js制作简单的钟表

    利用css+原生js制作简单的钟表.效果如下所示 实现该效果,分三大块:html.javascript.css html部分html部分比较简单,定义一个clock的div,内部有原点.时分秒针.日期 ...

最新文章

  1. C#复制数组的两种方式,以及效率比较
  2. Nginx could not build the server
  3. 【控制】《多无人机协同控制技术》周伟老师-第1章-无人机协同控制技术概述
  4. c语言产生cl.exe错误,vc++6.0执行cl.exe时出错
  5. sqlite java需要按照,SQLite:java/jdbsqlite和python/sqlite3的区别
  6. 《Access 2007开发指南(修订版)》一一1.11 额外的提示和技巧
  7. 前端状态机系列:SCXML与XState对应关系
  8. 【一天一个C++小知识】004.C++中内部链接和外部链接
  9. Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
  10. linux下texlive的卸载,Linux 下 texlive 2018 的安装
  11. 串口通信基础知识(UART)
  12. CDD分析(rpsblast分析)研究
  13. linux关闭云锁服务器,安全软件之linux系统下云锁简单的安装方法
  14. 微信图文素材中图片url替换
  15. 计算机新手必备知识,新手怎么查看电脑配置,购机必备知识!
  16. key mysql_调整MySQL中的key_reads
  17. 3D Experience — 产品协同研发平台
  18. 【AI视野·今日CV 计算机视觉论文速览 第174期】Tue, 7 Jan 2020
  19. 财务系统建设者须知——财务知识碎片(一) 什么是会计科目、什么是会计账户?
  20. Hibernate常见问题 No row with the given identifier exists问题的原因及解决

热门文章

  1. 没有网络加载不出来html,192.168.1.1无法显示该网页
  2. 对团队中技术支持岗位感悟
  3. VMware workstation克隆一个虚拟机详细步骤
  4. 用知识脑图梳理碎片记忆
  5. 道路视频摄像机智能分析功能及分级要求
  6. jsp学生宿舍人员管理系统
  7. 微信公众平台开发(81) 2014新年微信贺卡
  8. ESP8266配网最方便快捷的库
  9. 获取手机像素,密度和宽高(dp)
  10. 云服务器关闭8080端口,8080端口被占用怎么办?如何关闭被占用的8080端口