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 相关文章推荐
js脚本学习 比较实用的基础
Sep 07 Javascript
filemanage功能中用到的common.js
Apr 08 Javascript
javawscript 三级菜单的实现原理
Jul 01 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
详解JavaScript中的blink()方法的使用
Jun 08 Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 Javascript
JS结合bootstrap实现基本的增删改查功能
Jul 22 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
将RGB值转换为灰度值的简单算法
Oct 09 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 Javascript
微信小程序中使用vant框架的具体步骤
Feb 18 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
php设置允许大文件上传示例代码
2014/03/10 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
Python用GET方法上传文件
2015/03/10 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
环保公益广告语
2014/03/13 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
扬州个园导游词
2015/02/06 职场文书
银行求职信范文
2019/05/13 职场文书