tween.js缓动补间动画算法详解

本文主要和大家介绍了tween.js缓动补间动画示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

一、理解tween.js

如果看到上面的已经理解了,可以跳过下面的部分.下面为对Tween.js的解释 下面就介绍如何使用这个Tween了,首先b、c、d三个参数(即初始值,变化量,持续时间)在缓动开始前,是需要先确定好的。 首先引入一个概念就补间动画 Flash做动画时会用到Tween类,利用它可以做很多动画效果,例如缓动、弹簧等等。 tween.js在Flash中可以解释为补间动画. 那么问题来了,什么是补间动画呢?

相信学过Flash的都知道补间动画是flash主要的非常重要的表现手段之一.补间动画有动作补间动画与形状补间动画两种,但是在js中却不需要了解这么多. 好了,废话不多说,先看看百度百科关于补间动画给出的定义: 补间动画:做flash动画时,在两个关键帧中间需要做“补间动画”,才能实现图画的运动; 插入补间动画后两个关键帧之间的插补帧是由计算机自动运算而得到的

那么什么是关键帧呢? 举个栗子: 先科普一下,平常所看的电影,动画都是24帧的,24帧为一秒.在人眼可以捕捉的范围内.可以想象两个点之间有有22个点,形成一条直线或者曲线.而每一个点就代表一帧,帧——就是动画中最小单位的单幅影像画面,而单幅影像画面就可以看做是一个对象(一切皆对象,除去值类型)了.而这条线就代表对象的运动轨迹.

二、四个参数

t: current time–>代表第一个点,也就是第一帧,也就是一个动画开始的地方。

b: beginning value–>代表初始值,也就是开始量,我们看电影或者动画一般都不会看序幕把,那么跳过开头部分,选择第一帧和最后一帧之间你要开始看位置,而此位置就是初始值。

c: change in value–>代表的就是最后一帧减去初始值就是变化量,

d: duration–>代表最后一帧,1s的结束,也是动画的结束。

tween.js的使用 1.下载 2.引入 3.使用tween.js语法

Tween.缓动函数名.缓动效果名(t,b,c,d);

注意:当开始步数增加到与结束步数相等时,整个运动结束. 注注意:只有当t增加到与d相等时才会结束运动;如果不等,运动不会停止.

三、tween文件代码

/* * Tween.js * t: current time(当前时间); * b: beginning value(初始值); * c: change in value(变化量); * d: duration(持续时间)。*/var Tween = {  Linear: function(t, b, c, d) { //匀速    return c * t / d + b;   },  Quad: { //二次方缓动效果    easeIn: function(t, b, c, d) {      return c * (t /= d) * t + b;    },    easeOut: function(t, b, c, d) {      return -c *(t /= d)*(t-2) + b;    },    easeInOut: function(t, b, c, d) {      if ((t /= d / 2) < 1) return c / 2 * t * t + b;      return -c / 2 * ((--t) * (t-2) - 1) + b;    }  },  Cubic: { //三次方缓动效果    easeIn: function(t, b, c, d) {      return c * (t /= d) * t * t + b;    },    easeOut: function(t, b, c, d) {      return c * ((t = t/d - 1) * t * t + 1) + b;    },    easeInOut: function(t, b, c, d) {      if ((t /= d / 2) < 1) return c / 2 * t * t*t + b;      return c / 2*((t -= 2) * t * t + 2) + b;    }  },  Quart: { //四次方缓动效果    easeIn: function(t, b, c, d) {      return c * (t /= d) * t * t*t + b;    },    easeOut: function(t, b, c, d) {      return -c * ((t = t/d - 1) * t * t*t - 1) + b;    },    easeInOut: function(t, b, c, d) {      if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;      return -c / 2 * ((t -= 2) * t * t*t - 2) + b;    }  },  Quint: { //五次方缓动效果    easeIn: function(t, b, c, d) {      return c * (t /= d) * t * t * t * t + b;    },    easeOut: function(t, b, c, d) {      return c * ((t = t/d - 1) * t * t * t * t + 1) + b;    },    easeInOut: function(t, b, c, d) {      if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;      return c / 2*((t -= 2) * t * t * t * t + 2) + b;    }  },  Sine: { //正弦缓动效果    easeIn: function(t, b, c, d) {      return -c * Math.cos(t/d * (Math.PI/2)) + c + b;    },    easeOut: function(t, b, c, d) {      return c * Math.sin(t/d * (Math.PI/2)) + b;    },    easeInOut: function(t, b, c, d) {      return -c / 2 * (Math.cos(Math.PI * t/d) - 1) + b;    }  },  Expo: { //指数缓动效果    easeIn: function(t, b, c, d) {      return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;    },    easeOut: function(t, b, c, d) {      return (t==d) ? b + c : c * (-Math.pow(2, -10 * t/d) + 1) + b;    },    easeInOut: function(t, b, c, d) {      if (t==0) return b;      if (t==d) return b+c;      if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;      return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;    }  },  Circ: { //圆形缓动函数    easeIn: function(t, b, c, d) {      return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;    },    easeOut: function(t, b, c, d) {      return c * Math.sqrt(1 - (t = t/d - 1) * t) + b;    },    easeInOut: function(t, b, c, d) {      if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;      return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;    }  },  Elastic: { //指数衰减正弦曲线缓动函数    easeIn: function(t, b, c, d, a, p) { //加速      var s;      if (t==0) return b;      if ((t /= d) == 1) return b + c;      if (typeof p == "undefined") p = d * .3;      if (!a || a < Math.abs(c)) {        s = p / 4;        a = c;      } else {        s = p / (2 * Math.PI) * Math.asin(c / a);      }      return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;    },    easeOut: function(t, b, c, d, a, p) { //减速      var s;      if (t==0) return b;      if ((t /= d) == 1) return b + c;      if (typeof p == "undefined") p = d * .3;      if (!a || a < Math.abs(c)) {        a = c;         s = p / 4;      } else {        s = p/(2*Math.PI) * Math.asin(c/a);      }      return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);    },    easeInOut: function(t, b, c, d, a, p) { //先加速后减速      var s;      if (t==0) return b;      if ((t /= d / 2) == 2) return b+c;      if (typeof p == "undefined") p = d * (.3 * 1.5);      if (!a || a < Math.abs(c)) {        a = c;         s = p / 4;      } else {        s = p / (2 *Math.PI) * Math.asin(c / a);      }      if (t < 1) return -.5 * (a * Math.pow(2, 10* (t -=1 )) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;      return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p ) * .5 + c + b;    }  },  Back: { //超过范围的三次方的缓动函数    easeIn: function(t, b, c, d, s) {      if (typeof s == "undefined") s = 1.70158;      return c * (t /= d) * t * ((s + 1) * t - s) + b;    },    easeOut: function(t, b, c, d, s) {      if (typeof s == "undefined") s = 1.70158;      return c * ((t = t/d - 1) * t * ((s + 1) * t + s) + 1) + b;    },    easeInOut: function(t, b, c, d, s) {      if (typeof s == "undefined") s = 1.70158;       if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;      return c / 2*((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;    }  },  Bounce: { //指数衰减的反弹曲线缓动函数    easeIn: function(t, b, c, d) {      return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b;    },    easeOut: function(t, b, c, d) {      if ((t /= d) < (1 / 2.75)) {        return c * (7.5625 * t * t) + b;      } else if (t < (2 / 2.75)) {        return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;      } else if (t < (2.5 / 2.75)) {        return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;      } else {        return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;      }    },    easeInOut: function(t, b, c, d) {      if (t < d / 2) {        return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b;      } else {        return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;      }    }  }}Math.tween = Tween;

登录后复制

四、举个栗子

                            *{margin: 0;padding: 0;}      .out{width: 800px;height: 500px;background: #e5e5e5;position: relative;padding: 20px;text-align: center;}      .inner{width: 50px;height: 50px;border-radius: 50%;background: #FF0000; position: absolute;left: 50px;top: 50px;}            

var app = new Vue({ el: '#app', data: { t: 0, b: 50, c: 500, d: 1500, }, methods:{ start(){ var t = this.t; const b = this.b; const c = this.c; const d = this.d; const setInt = setInterval(()=>{ t++; console.log(t) if(t==300){clearInterval(setInt)} console.log(t); const ballLeft = Tween.Linear(t,b,c,d)+"px"; ball.style.left = ballLeft; },20) } } })

登录后复制

五、个人体会

tween的优势在于tween实现效果是依据算法,不是某种语言的语法,因此可以运用的地方很广泛,一次学习终身受益。

相关推荐:

tween.js的使用实例详解

简单的动画库封装tween.js实例教程

Tween.js动画详细介绍

以上就是tween.js缓动补间动画算法详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786385.html

(0)
上一篇 2025年3月8日 17:43:20
下一篇 2025年3月8日 17:44:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • nodejs和express搭建多人聊天室

    准备工作:新建一个文件夹 chatroom在终端输入以下命令,按照步骤npm(没装过的去官网安装下node和npm)会自动给你生成一个package.json文件 安装express和socket.io package.json文件如下: …

    2025年3月8日 编程技术
    200
  • NodeJS爬虫详解

    一、爬虫流程 我们最终的目标是实现爬取立马理财每日的销售额,并知道卖了哪些产品,每个产品又被哪些用户在什么时间点买的。首先,介绍下爬虫爬取的主要步骤: 1. 结构分析 我们要爬取页面的数据,第一步当然是要先分析清楚页面结构,要爬哪些页面,页…

    2025年3月8日
    200
  • 页面跳转小结详解

    本文主要和大家分享页面跳转小结详解,希望能帮助大家更好掌握页面跳转知识。 HTML标签 一般形式上可以用、、: GOGO 登录后复制 JS跳转页面代码 本页跳转 window.location.href = ‘https://www.php…

    编程技术 2025年3月8日
    200
  • js代理设计模式详解

    代理模式是常见的设计模式之一,是指不直接调用实际的对象,而是通过代理对象,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的…

    2025年3月8日
    200
  • React拖拽排序组件Dragact详解

    先来一张图看看: Typescript(TS) 最近一直在使用TS进行开发,Eggjs的Ts实践也写了一半。这玩意儿,真的是有毒的,因为能让你上瘾。 随便将一个项目迁移到TS之上,在强大的静态类型检测下,你就能轻松的发现一堆逻辑和边界错误。…

    2025年3月8日
    200
  • 博客内容管理系统详解

    一、更新内容 数据库重新设计,改成以用户分组的subDocs数据库结构 应数据库改动,所有接口重新设计,并统一采用和立马理财一致的接口风格 删除原来游客模式,增加登录注册功能,支持弹窗登录。 增加首页,展示最新发布文章和注册用户 增加修改密…

    编程技术 2025年3月8日
    200
  • JS内存管理实例讲解

    js有完善的内存处理机制,所以之前我们不用特别的去关注这块的实现。页面不快了,刷新一下就好了;浏览器卡顿,重启一下就ok。但是随着spa和移动app的流行,以及未来可能存在的pwa的实现,js内存可能成为新的内存瓶颈。 1.什么是内存泄漏 …

    2025年3月8日 编程技术
    200
  • 10个js常用函数

    1,对于cookie的操作,其中包括了设置、获取、删除cookie的操作。下面这个是我在公司的项目里面使用的工具库里的方法,测试就不测试了 // setCookie()// @About 设置cookiefunction setCookie…

    2025年3月8日
    200
  • JavaScript中循环类型总结分析

    在英语中,loop这个词指的是由弯曲的曲线所产生的形状。类似的概念,loop这个词已经被用于编程中。如果你看到下图,你就会清楚的知道指令的流动是如何在一个循环的动作中不断重复的。在编程中,循环的概念并不是什么新概念,它们常常在编码时使用。虽…

    2025年3月8日 编程技术
    200
  • JS/jQuery实现DIV延时几秒后消失或显示

    本文主要和大家介绍了js/jquery实现p延时几秒后消失或显示的方法,结合实例形式分析了javascript使用settimeout及jquery使用delay方法实现延迟显示功能的相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。 …

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论