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 相关文章推荐
JavaScript 事件记录使用说明
Oct 20 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
Aug 03 Javascript
javascript获得网页窗口实际大小的示例代码
Sep 21 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
js实现精美的图片跟随鼠标效果实例
May 16 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
如何写好你的JavaScript【推荐】
Mar 02 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
Vue v-text指令简单使用方法示例
Sep 19 Javascript
微信小程序自定义弹出层效果
May 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
一个程序下载的管理程序(一)
2006/10/09 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
JS记录用户登录次数实现代码
2014/01/15 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
Python读写配置文件的方法
2015/06/03 Python
简单实现python爬虫功能
2015/12/31 Python
python设置随机种子实例讲解
2019/09/12 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
新闻专业应届生求职信
2013/10/31 职场文书
营销与策划专业求职信
2014/06/20 职场文书
工程造价专业求职信
2014/07/17 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
Python编写nmap扫描工具
2021/07/21 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
instantclient客户端 连接oracle数据库
2022/04/26 Oracle