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学习2 选择器的使用说明
Feb 07 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
JavaScript函数使用的基本教程
Jun 04 Javascript
详解AngularJS中的依赖注入机制
Jun 17 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
微信小程序HTTP请求从0到1封装
Sep 09 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 Javascript
Vue中点击active并第一个默认选中功能的实现
Feb 24 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 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数据库调用类调用实例(详细注释)
2012/07/12 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
javascript call方法使用说明
2010/01/11 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
javascript读写json示例
2014/04/11 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
简洁的十分钟Python入门教程
2015/04/03 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
使用python实现BLAST
2018/02/12 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
Django视图、传参和forms验证操作
2020/07/15 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
什么是GWT的Entry Point
2013/08/16 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
初一科学教学反思
2014/01/27 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
英语系毕业生求职信
2014/07/13 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
个人廉政承诺书
2015/04/28 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书