JS小球抛物线轨迹运动的两种实现方法详解


Posted in Javascript onDecember 20, 2017

本文实例讲述了JS小球抛物线轨迹运动的两种实现方法。分享给大家供大家参考,具体如下:

js实现小球抛物轨迹运动的大致思路:

1、用setInterval()方法,进行间隔性刷新,更新小球位置,以实现动态效果
2、绘制小球和运动区域,运动区域可通过flex布局实现垂直居中
3、用物理公式S(y)=1/2*g*t*tS(x)=V(x)t来计算路径
现确定V(x)=4m/s,刷新的时间间隔设置为0.1s。原本px和米之间的转换,不同尺寸转换不同,本例采用17寸显示器,大约1px=0.4mm。但浏览器太小,因此只能模拟抛物线轨迹,本例将px和米之间缩成100倍。

第一种:通过border-radius绘制小球

思路:用border-radius: 50%绘制小球,给小球设置relative,每次计算小球当前位置,赋给top和left。计算运动轨迹时,可用变量自增计算setInterval调用次数,每次是0.1s,这样可计算总时间。代码如下:

<!DOCTYPE>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title></title>
  <style type="text/css">
  /*给body进行flex布局,实现垂直居中*/
  body {
  min-height: 100vh;/*高度适应浏览器高度*/
  display: flex;
  justify-content: center;/*水平居中*/
  align-items: center;/*垂直居中*/
    font-size: 20px;
    font-weight: bold;
  }
  /*设置运动区域*/
  #bg {
    width: 600px;
    height: 600px;
    border: 2px solid #e0e0e0;
    border-radius: 4px;/*给div设置圆角*/
    padding: 20px;
  }
  /*生成小球,并定义初始位置*/
  #ball {
    border-radius: 50%;/*可把正方形变成圆形,50%即可*/
    background: #e0e0e0;
    width: 60px;
    height: 60px;
    position: relative;
    top: 30px;
    left: 30px;
  }
  button {
    width: 80px;
    height: 30px;
    border-radius: 4px;
    color: #fff;
    background: #AA7ECC;
    font-size: 20px;
    font-weight: bold;
    margin-left: 20px;
  }
  </style>
</head>
<body>
<div id="bg">
  此时水平速度为:4<button onclick="start()">演示</button>
  <div id="ball"></div>
</div>
<script type="text/javascript">
function start(){
  var x,y,k=1,t;
  //x是水平方向移动路径;y是垂直方向的;k记录次数,可与0.1相乘得时间;t记录setInterval的返回id,用于clearInterval
  t = setInterval(function(){
  x = 30+0.1*k*4*100;
    //S(x)=S(0)+t*V(x),100是自定义的米到px转换数
    y = 30+1/2*9.8*0.1*k*0.1*k*100;//S(y)=S(0)+1/2*g*t*t
  var j = document.getElementById("ball");
    //通过修改小球的top和left,修改小球的位置
    j.style.top = y;
    j.style.left = x;
  k++;//每次调用,k自增,简化计算
  if(x>480||y>480){
  clearInterval(t);//小球达到边界时,清除setInterval
  }
  },100);//每0.1s调用一次setInterval的function
}
</script>
</body>
</html>

第二种:h5中的canvas绘制小球和运动区域

思路:采用canvas绘制小球,由于小球不能通过top和left移动,因此它需要每次调用都要用clearRect清空画布,然后绘制计算后位置的小球。代码如下:

<!DOCTYPE>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title></title>
  <style type="text/css">
  body {
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  }
  #myCanvas {
  box-shadow: -2px -2px 2px #efefef,5px 5px 5px #b9b9b9;
  }
  </style>
</head>
<body>
<canvas id="myCanvas" width="600px" height="600px"></canvas>
<script type="text/javascript">
var x=50,y=50,k=1;
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#e0e0e0";
cxt.beginPath();
cxt.arc(x,y,30,0,Math.PI*2,true);
cxt.closePath();
cxt.fill();
t=setInterval("parabola()",100);
function parabola(){
  cxt.clearRect(0,0,600,600);//清除原始图形
  cxt.beginPath();
  x=50+0.1*k*4*100;y=50+9.8*0.1*k*0.1*k*1/2*100;
  cxt.arc(x,y,30,0,Math.PI*2,true);
  cxt.closePath();
  cxt.fill();
  k++;
  if(x>520||y>520){
  clearInterval(t);
  }
}
</script>
</body>
</html>

两个方式都能实现,计算的方式都是一样的,只是方式不同。第一个是偏css,采用了border-radius和动态修改DOM,第二个采用canvas绘制图形,绘制过程要好好研究。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 数组的 uniq 方法
Jan 23 Javascript
juqery 学习之五 文档处理 插入
Feb 11 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
常用javascript表单验证汇总
Jul 20 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 Javascript
关于vue.js发布后路径引用的问题解决
Aug 15 Javascript
浅谈vue路径优化之resolve
Oct 13 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
vue-cli3.0 环境变量与模式配置方法
Nov 08 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
Dec 20 #Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 #Javascript
JavaScript实现重力下落与弹性效果的方法分析
Dec 20 #Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 #Javascript
vue.js $refs和$emit 父子组件交互的方法
Dec 20 #Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
Dec 20 #jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 #Javascript
You might like
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
jQuery基础知识小结
2014/12/22 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python中字符串的操作方法大全
2018/06/03 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
大学生职业生涯规划书前言
2014/01/09 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
坎儿井导游词
2015/02/09 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python