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 相关文章推荐
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
JavaScript和CSS通过expression实现Table居中显示
Jun 28 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
Nov 28 Javascript
使用mouse事件实现简单的鼠标经过特效
Jan 30 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
js实现简单分页导航栏效果
Jun 28 Javascript
微信小程序实现图片压缩
Dec 03 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 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
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
浅谈MySQL中的触发器
2015/05/05 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
python实现简单购物商城
2016/05/21 Python
深入理解python中的atexit模块
2017/03/07 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
简历自我评价模版
2014/01/31 职场文书
开学典礼演讲稿
2014/05/23 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
2015年党性分析材料
2014/12/19 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
vue实现在data里引入相对路径
2022/06/05 Vue.js
MySQL添加索引特点及优化问题
2022/07/23 MySQL