打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JS模拟弹力球--window.onload、clearInterval()防止计时器叠加
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>弹性运动</title>
  6. <style type="text/css">
  7. #div {
  8. width: 100px;
  9. height: 100px;
  10. background: green;
  11. position: absolute;
  12. border-radius: 50%;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <script type="text/javascript">
  18. //window.onload表示等页面标签内容加载完之后再加载window.onload里面的内容
  19. window.onload = function(){
  20. //分别设置div在x和y方向的的初速度
  21. var speedX = 2;
  22. var speedY = 3;
  23. //获取div标签
  24. var div = document.getElementById("div");
  25. //获取按钮
  26. var btn = document.getElementById("btn");
  27. //定义点击事件
  28. btn.onclick = function(){
  29. startMove();
  30. };
  31. //定义一个空的定时器,防止上次事件定时器的返回值叠加
  32. var timer = null;
  33. //定义点击事件函数
  34. function startMove(){
  35. //内部清空计时器,防止上次返回值叠加
  36. clearInterval(timer);
  37. //设置计时器
  38. timer = setInterval(function(){
  39. //竖直方向上反向运动时速度为负值,为了达到反弹逐渐速度逐渐减小的效果,可以在向下碰撞后速度加上一个正值
  40. speedY += 6;
  41. //分别获取div距离左边距和上边距的动态距离
  42. var iW = div.offsetLeft + speedX;
  43. var iH = div.offsetTop + speedY;
  44. //获取div水平方向运动的最大距离,即不包含边框的浏览器窗口的宽度clientWidth减去div的宽度
  45. var w = document.documentElement.clientWidth - div.offsetWidth;
  46. //获取div垂直方向运动的最大距离
  47. var h = document.documentElement.clientHeight - div.offsetHeight;
  48. //当动态宽度达到div最大运动宽度范围时,立刻转换速度为反方向负值,同时把w的值负值给iw,因为w是可视窗口范围,当w缩小时,iw保存的还是上一次窗口条件下的距离左边距的距离
  49. if (iW >= w||iW <= 0){speedX = -speedX;iW = w;}
  50. //当动态高度达到div最大运动高度范围时,立刻转向速度,同时将x方向速度乘以0.8,使之速度逐渐减小
  51. if (iH >= h||iH <= 0){speedY = -speedY;iH = h;speedX *= 0.95;}
  52. //由于div.style.left和div.style.top还储存这上一次或第一次的计时后的值,此次计时后应把新的值储存起来,使div出现动态效果
  53. div.style.left = iW + "px";
  54. div.style.top = iH + "px";
  55. console.log(speedX);
  56. },30);
  57. }
  58. }
  59. </script>
  60. <input type="button" name="btn" id="btn" value="开始运动" />
  61. <div id="div"></div>
  62. </body>
  63. </html>






<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>弹性运动</title>
<style type="text/css">
#div {
position: absolute;
left:25px;
bottom:30px;
width: 50px;
height: 50px;
background: blue;
border-radius: 50%;
}
#mat{
position: absolute;
left:0;
bottom:0;
width: 100px;
height: 30px;
background: brown;
position: absolute;
}
</style>
</head>
<body>
<script type="text/javascript">
//window.onload表示等页面标签内容加载完之后再加载window.onload里面的内容
window.onload = function(){
//分别设置div在x和y方向的的初速度
var speedX = 9;
var speedY = -50;
//获取div标签
var div = document.getElementById("div");
var mat = document.getElementById("mat");
//获取按钮
var btn = document.getElementById("btn");
//定义点击事件
mat.onclick = function(){
speedY = -50;
clearInterval(timer);
startMove();
};
//定义一个空的定时器,防止上次事件定时器的返回值叠加
var timer = null;
//定义点击事件函数
function startMove(){
//内部清空计时器,防止上次返回值叠加
clearInterval(timer);
//设置计时器
timer = setInterval(function(){
//竖直方向上反向运动时速度为负值,为了达到反弹逐渐速度逐渐减小的效果,可以在向下碰撞后速度加上一个正值
speedY += 7;
//获取div距离上边距的动态距离
var iH = div.offsetTop + speedY;
//获取div垂直方向运动的最大距离
var h = document.documentElement.clientHeight - div.offsetHeight - mat.offsetHeight;
if (iH >= h){
speedY = -speedY;
iH = h;
// speedX *= 0.95;
}else if(iH <= 0){
speedY = -speedY;
iH = 0;
}
  //由于div.style.left和div.style.top还储存这上一次或第一次的计时后的值,此次计时后应把新的值储存起来,使div出现动态效果
  div.style.top = iH + "px";
  if(speedY===-2||speedY===-4){
  return;
  }
  console.log(speedY);
  },30);
}
}
</script>
<div id="mat"></div>//因为有window.onload在,等页面标签内容加载完之后再加载window.onload里面的内容,所以这两个元素可以放在最后面。如果没有window.onload,那么这两个div就要放在代码前面,否则获取对象是获取不到。
<div id="div"></div>
</body>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
javascript图片预加载技术
JS抽奖程序代码,转盘抽奖
图片左右循环连续滚动代码,解决marquee的留白问题
js不间断滚动的简单教程
JavaScript 动画
基于HTML5打造的一款别踩白板小游戏
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服