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 相关文章推荐
jQuery中removeClass()方法用法实例
Jan 05 Javascript
JavaScript常用基础知识强化学习
Dec 09 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
Apr 20 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
JavaScript中click和onclick本质区别与用法分析
Jun 07 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
vue+elementUI实现表格列的显示与隐藏
Apr 13 Vue.js
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
聊天室php&amp;mysql(四)
2006/10/09 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
js星星评分效果
2014/07/24 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Python networkx包的实现
2020/02/14 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
物业门卫岗位职责
2013/12/28 职场文书
银行开业庆典方案
2014/02/06 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
工会主席岗位责任制
2014/02/11 职场文书
业务内勤岗位职责
2014/04/30 职场文书
离婚协议书标准格式
2014/10/04 职场文书
师范生见习报告范文
2014/11/03 职场文书
全陪导游词
2015/02/04 职场文书
高效课堂教学反思
2016/02/24 职场文书
诚信高考倡议书
2019/06/24 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
在Python中如何使用yield
2021/06/07 Python