JS弹性运动实现方法分析


Posted in Javascript onDecember 15, 2016

本文实例分析了JS弹性运动实现方法。分享给大家供大家参考,具体如下:

描述:像弹簧一样左右弹动,最后缓慢停下来

一、加减速运动

1.加速运动

var iSpeed=0;
iSpeed++;

速度越来越快,最后冲出去

2.减速运动

var iSpeed=20;
iSpeed--;

速度越来越慢,降到0后开始变负值往反方向运动

二、弹性运动

1.在目标点左边,加速;目标点右边,减速,如

if(div1.offsetLeft<300){
 iSpeed=iSpeed+1;  //等同iSpeed++;
}
else{
 iSpeed=iSpeed-1;
}

这是最简单的弹性运动,缺陷:加速度恒定(应该根据松紧带而变)

if(div1.offsetLeft<300){
 iSpeed=iSpeed+(300-div1.offsetLeft)/50; 
}
else{
 iSpeed=iSpeed-(div1.offsetLeft-300)/50;
}
iSpeed=iSpeed+(300-div1.offsetLeft)/50; ==>iSpeed=iSpeed+300/50-div1.offsetLeft/50;
iSpeed=iSpeed-(div1.offsetLeft-300)/50; ==>iSpeed=iSpeed-div1.offsetLeft/50+300/50;

这两个完全一样 所以不需要if/else

iSpeed+=(300-div1.offsetLeft)/50; 
div1.style.left=div1.offsetLeft+iSpeed+'px';

缺陷2:不会停下来(缺少摩擦力)

iSpeed+=(300-div1.offsetLeft)/50; 
iSpeed*=0.95; //乘一个小数,越来越小
div1.style.left=div1.offsetLeft+iSpeed+'px';

三、带摩擦力的弹性运动

比较好的组合

iSpeed+=(300-div1.offsetLeft)/5; 
iSpeed*=0.7;

注:var iSpeed=0;要放在定时器外面,不然每次都从0开始,加啊乘啊就没用了

四、整合好的弹性运动框架

var iSpeed=0;
var left=0;
function startMove(obj,iTarget){
 clearInterval(obj.timer);
 obj.timer=setInterval(function(){
  iSpeed+=(iTarget-obj.offsetLeft)/5;
  iSpeed*=0.7;  //计算出来的速度是一个小数,如果给它取整,会一直左右移动
  left+=iSpeed;  //把速度存在变量里,变量是可以有小数的
  if(Math.abs(iSpeed)<1 && Math.abs(left-iTarget)<1){ //因为iSpeed和left都是小数,所以永远达不到0和目标点,只能无限接近
   clearInterval(obj.timer);  //虽然速度最后接近于0,看似运动停止了,但定时器还一直开着,所以当速度=0并且到达目标点,关掉(只是速度=0关掉,运动到最右边准备回来那一刹那,速度=0,同理只是到达目标点关掉,一开始往右运动经过中间时会达到目标点,所以必须两者同时满足)
   obj.style.left=iTarget+'px'; //小数无法完全贴合,所以最后直接让他等于目标点,一般人肉眼看不出来
  }
  else{
   obj.style.left=left+'px';  //style.left只能是一个整数,所以每次会把小数抹掉,误差是累计的,最终累加起来就会有1-2像素,用obj.offsetLeft+iSpeed就会无法完全贴合
  }
 },30);
};

五、弹性运动不适用的地方

样式会过界的

比如高度,先变大后变小,如果物体本身高度很小,可能会变成负值,就不对了

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

Javascript 相关文章推荐
Extjs中常用表单介绍与应用
Jun 07 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
Javascript/Jquery——简单定时器的多种实现方法
Jul 03 Javascript
jQuery实现点击图片翻页展示效果的方法
Feb 16 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
微信小程序 wxapp内容组件 progress详细介绍
Oct 31 Javascript
Element Carousel 走马灯的具体实现
Jul 26 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
Dec 24 Javascript
jquery实现点击左右按钮切换图片
Jan 27 jQuery
js正则匹配markdown里的图片标签的实现
Mar 24 Javascript
JS经典正则表达式笔试题汇总
Dec 15 #Javascript
javascript中闭包概念与用法深入理解
Dec 15 #Javascript
javascript读取文本节点方法小结
Dec 15 #Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 #Javascript
jQuery validate插件功能与用法详解
Dec 15 #Javascript
EditPlus 正则表达式 实战(3)
Dec 15 #Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 #Javascript
You might like
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
初识PHP
2014/09/28 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
php防止sql注入的方法详解
2017/02/20 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python中map()函数的使用方法示例
2017/09/29 Python
Python常见字典内建函数用法示例
2018/05/14 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
关于打架的检讨书
2014/01/17 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
财政局个人总结
2015/03/04 职场文书
工程催款通知书
2015/04/17 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android