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中this的使用说明
Sep 06 Javascript
jQuery中parents()方法用法实例
Jan 07 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
Mar 09 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
Jul 09 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 jQuery
vue实现点击当前标签高亮效果【推荐】
Jun 22 Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
2014过年倒计时示例
2014/01/31 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
eclipse php wamp配置教程
2016/06/30 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
如何真正的了解python装饰器
2020/08/14 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
物业管理专业个人的自我评价
2013/11/19 职场文书
亮化工程实施方案
2014/03/17 职场文书
大学活动总结范文
2014/04/29 职场文书
政府会议通知范文
2015/04/15 职场文书
工作经历证明范本
2015/06/15 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
go web 预防跨站脚本的实现方式
2021/06/11 Golang
DSP接收机前端设想
2022/04/05 无线电