JS实现匀速与减速缓慢运动的动画效果封装示例


Posted in Javascript onAugust 27, 2018

本文实例讲述了JS实现匀速与减速缓慢运动的动画效果。分享给大家供大家参考,具体如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>3water.com JS匀速/减速运动</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    .box1 {
      width: 100px;
      height: 100px;
      background-color: pink;
      margin-top: 10px;
      position: relative;
    }
    .box2 {
      width: 100px;
      height: 100px;
      background-color: red;
      margin-top: 10px;
      position: relative;
    }
  </style>
</head>
<body>
<button>匀速移动</button>
<button>减速移动</button>
<div class="box1" ></div>
<div class="box2" ></div>
<script>
  // 动画原理 = 盒子位置 + 步长。
  //   1.闪动。 (瞬间到达)
  //   2.匀速。 (每次走一样距离)
  //   3.缓动。 (开始特快越走越慢,步长越来越小)
  //        (类似刹车,电梯停止,压缩弹簧...)
  // 好处:
  //   1.有非常逼真的缓动效果,实现的动画效果更细腻。
  //   2.如果不清除定时器,物体永远跟着目标在移动。
  var box1 = document.getElementsByClassName("box1")[0];
  var box2 = document.getElementsByClassName("box2")[0];
  var but1 = document.getElementsByTagName("button")[0];
  var but2 = document.getElementsByTagName("button")[1];
  console.log(box1.offsetLeft);
  but1.onclick = function () {
    animate1(box1,200);
  }
  but2.onclick = function () {
    animate2(box2,500);
  }
  //匀速动画
  function animate1(ele,target){
    //要用定时器,先清除定时器
    //一个盒子只能有一个定时器,这样儿的话,不会和其他盒子出现定时器冲突
    //而定时器本身讲成为盒子的一个属性
    clearInterval(ele.timer);
    //我们要求盒子既能向前又能向后,那么我们的步长就得有正有负
    //目标值如果大于当前值取正,目标值如果小于当前值取负
    var speed = target>ele.offsetLeft?3:-3;
    ele.timer = setInterval(function () {
      //在执行之前就获取当前值和目标值之差
      var val = target - ele.offsetLeft;
      ele.style.left = ele.offsetLeft + speed + "px";
      //目标值和当前值只差如果小于步长,那么就不能在前进了
      //因为步长有正有负,所有转换成绝对值来比较
      if(Math.abs(val)<=Math.abs(speed)){
        ele.style.left = target + "px";
        clearInterval(ele.timer);
      }
    },30)
  }
  //缓动动画封装
  function animate2(ele,target) {
    clearInterval(ele.timer); //清楚历史定时器
    ele.timer = setInterval(function () {
      //获取步长 确定移动方向(正负值) 步长应该是越来越小的,缓动的算法。
      var step = (target-ele.offsetLeft)/10;
      //对步长进行二次加工(大于0向上取整,小于0项下取整)
      step = step>0?Math.ceil(step):Math.floor(step);
      //动画原理: 目标位置 = 当前位置 + 步长
      console.log(step);
      ele.style.left = ele.offsetLeft + step + "px";
      //检测缓动动画有没有停止
      if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){
        ele.style.left = target + "px"; //直接移动指定位置
        clearInterval(ele.timer);
      }
    },30);
  }
</script>
</body>
</html>

这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun,可得到如下运行效果:

JS实现匀速与减速缓慢运动的动画效果封装示例

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

Javascript 相关文章推荐
QUnit jQuery的TDD框架
Nov 04 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
javascript生成随机数方法汇总
Nov 12 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
零基础轻松学JavaScript闭包
Dec 30 Javascript
详解网站中图片日常使用以及优化手法
Jan 09 Javascript
React Native如何消除启动时白屏的方法
Aug 08 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
浅谈Webpack 持久化缓存实践
Mar 22 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
Javascript类型判断相关例题及解析
Aug 26 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 #Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 #Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
Aug 27 #Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 #Javascript
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 #Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
Aug 27 #Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 #Javascript
You might like
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
关于尾递归的使用详解
2013/05/02 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
jquery.pager.js实现分页效果
2019/07/29 jQuery
前端vue如何使用高德地图
2020/11/05 Javascript
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
python手写均值滤波
2020/02/19 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
《在大海中永生》教学反思
2014/02/24 职场文书
会计学专业求职信
2014/07/17 职场文书
投资意向书
2014/07/30 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
2015年教务工作总结
2015/05/23 职场文书
《海上日出》教学反思
2016/02/23 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS