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 相关文章推荐
Dojo 学习笔记入门篇 First Dojo Example
Nov 15 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
Mar 27 Javascript
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
node.js中的emitter.emit方法使用说明
Dec 10 Javascript
Javascript访问器属性实例分析
Dec 30 Javascript
JS实现的幻灯片切换显示效果
Sep 07 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
May 07 Javascript
TypeScript类型声明书写详解
Aug 28 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防盗链代码实例
2014/08/27 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
vue实现弹幕功能
2019/10/25 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python面向对象编程基础解析(二)
2017/10/26 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
会议邀请书范文
2014/02/02 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
初三班主任寄语大全
2014/04/04 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android