JS弹性运动实现方法分析

发布时间 - 2026-01-10 21:51:01    点击率:

本文实例分析了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切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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


# JS  # 弹性运动  # JavaScript拖拽、碰撞、重力及弹性运动实例分析  # 原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面  # JavaScript模拟重力状态下抛物运动的方法  # Javascript实现重力弹跳拖拽运动效果示例  # 纯js模拟div层弹性运动的方法  # JS实现小球的弹性碰撞效果  # js实现带简单弹性运动的导航条  # js弹性势能动画之抛物线运动实例详解  # JavaScript实现重力下落与弹性效果的方法分析  # 是一个  # 减速运动  # 停下来  # 加速运动  # 都是  # 这是  # 就会  # 放在  # 相关内容  # 让他  # 不需要  # 就不  # 遍历  # 感兴趣  # 这两个  # 数据结构  # 就没  # 用了  # 给大家  # 比较好 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  html如何与html链接_实现多个HTML页面互相链接【互相】  北京专业网站制作设计师招聘,北京白云观官方网站?  *服务器网站为何频现安全漏洞?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  微信小程序 wx.uploadFile无法上传解决办法  在线制作视频的网站有哪些,电脑如何制作视频短片?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  ,网页ppt怎么弄成自己的ppt?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel如何使用Collections进行数据处理?(实用方法示例)  Python文本处理实践_日志清洗解析【指导】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何确保西部建站助手FTP传输的安全性?  Laravel如何自定义分页视图?(Pagination示例)  Python3.6正式版新特性预览  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Python高阶函数应用_函数作为参数说明【指导】  javascript中闭包概念与用法深入理解  如何在万网开始建站?分步指南解析  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  浅谈Javascript中的Label语句  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何选择PHP开源工具快速搭建网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Android Socket接口实现即时通讯实例代码  JavaScript如何实现音频处理_Web Audio API如何工作?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  大连 网站制作,大连天途有线官网?  长沙做网站要多少钱,长沙国安网络怎么样?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何破解联通资金短缺导致的基站建设难题?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  如何在IIS中新建站点并配置端口与IP地址?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  js实现点击每个li节点,都弹出其文本值及修改  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何获取免费开源的自助建站系统源码?  Python数据仓库与ETL构建实战_Airflow调度流程详解