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 相关文章推荐
用jQuery打造TabPanel效果代码
May 22 Javascript
JavaScript用Number方法实现string转int
May 13 Javascript
jQuery插件分享之分页插件jqPagination
Jun 06 Javascript
jquery简单实现幻灯片的方法
Aug 03 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 Javascript
在js文件中引入(调用)另一个js文件的三种方法
Sep 11 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
JavaScript 创建对象
2009/07/17 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
用uWSGI和Nginx部署Flask项目的方法示例
2019/05/05 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
了解AppleTalk协议吗
2014/04/01 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
眼镜促销方案
2014/03/15 职场文书
李敖北大演讲稿
2014/05/24 职场文书
舞蹈专业求职信
2014/06/13 职场文书
债务授权委托书范本
2014/10/17 职场文书
先进典型发言材料
2014/12/30 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
劳动仲裁调解书
2015/05/20 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers