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当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
Aug 10 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 Javascript
Echarts动态加载多条折线图的实现代码
May 24 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
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
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
PHP 编程安全性小结
2010/01/08 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
购买大码女装:Lane Bryant
2016/09/07 全球购物
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
两年的个人工作自我评价
2014/01/10 职场文书
中学生运动会入场词
2014/02/12 职场文书
学习标兵获奖感言
2014/02/20 职场文书
验房委托书
2014/08/30 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python