tweenjs缓动算法使用小实例
这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合。因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在。tweenjs代码详情:
/*
* Tween.js
* t: current time(当前时间);
* b: beginning value(初始值);
* c: change in value(变化量);
* d: duration(持续时间)。
* you can visit 'http://easings.net/zh-cn' to get effect
*/
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-) + b;
},
easeInOut: function(t, b, c, d) {
if ((t /= d / ) < ) return c / * t * t + b;
return -c / * ((--t) * (t-) - ) + 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 - ) * t * t + ) + b;
},
easeInOut: function(t, b, c, d) {
if ((t /= d / ) < ) return c / * t * t*t + b;
return c / *((t -= ) * t * t + ) + 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 - ) * t * t*t - ) + b;
},
easeInOut: function(t, b, c, d) {
if ((t /= d / ) < ) return c / * t * t * t * t + b;
return -c / * ((t -= ) * t * t*t - ) + 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 - ) * t * t * t * t + ) + b;
},
easeInOut: function(t, b, c, d) {
if ((t /= d / ) < ) return c / * t * t * t * t * t + b;
return c / *((t -= ) * t * t * t * t + ) + b;
}
},
Sine: {
easeIn: function(t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/)) + c + b;
},
easeOut: function(t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/)) + b;
},
easeInOut: function(t, b, c, d) {
return -c / * (Math.cos(Math.PI * t/d) - ) + b;
}
},
Expo: {
easeIn: function(t, b, c, d) {
return (t==) ? b : c * Math.pow(, * (t/d - )) + b;
},
easeOut: function(t, b, c, d) {
return (t==d) ? b + c : c * (-Math.pow(, - * t/d) + ) + b;
},
easeInOut: function(t, b, c, d) {
if (t==) return b;
if (t==d) return b+c;
if ((t /= d / ) < ) return c / * Math.pow(, * (t - )) + b;
return c / * (-Math.pow(, - * --t) + ) + b;
}
},
Circ: {
easeIn: function(t, b, c, d) {
return -c * (Math.sqrt( - (t /= d) * t) - ) + b;
},
easeOut: function(t, b, c, d) {
return c * Math.sqrt( - (t = t/d - ) * t) + b;
},
easeInOut: function(t, b, c, d) {
if ((t /= d / ) < ) return -c / * (Math.sqrt( - t * t) - ) + b;
return c / * (Math.sqrt( - (t -= ) * t) + ) + b;
}
},
Elastic: {
easeIn: function(t, b, c, d, a, p) {
var s;
if (t==) return b;
if ((t /= d) == ) return b + c;
if (typeof p == "undefined") p = d * .;
if (!a || a < Math.abs(c)) {
s = p / ;
a = c;
} else {
s = p / ( * Math.PI) * Math.asin(c / a);
}
return -(a * Math.pow(, * (t -= )) * Math.sin((t * d - s) * ( * Math.PI) / p)) + b;
},
easeOut: function(t, b, c, d, a, p) {
var s;
if (t==) return b;
if ((t /= d) == ) return b + c;
if (typeof p == "undefined") p = d * .;
if (!a || a < Math.abs(c)) {
a = c;
s = p / ;
} else {
s = p/(*Math.PI) * Math.asin(c/a);
}
return (a * Math.pow(, - * t) * Math.sin((t * d - s) * ( * Math.PI) / p) + c + b);
},
easeInOut: function(t, b, c, d, a, p) {
var s;
if (t==) return b;
if ((t /= d / ) == ) return b+c;
if (typeof p == "undefined") p = d * (. * 1.5);
if (!a || a < Math.abs(c)) {
a = c;
s = p / ;
} else {
s = p / ( *Math.PI) * Math.asin(c / a);
}
if (t < ) return -. * (a * Math.pow(, * (t -= )) * Math.sin((t * d - s) * ( * Math.PI) / p)) + b;
return a * Math.pow(, - * (t -= )) * Math.sin((t * d - s) * ( * Math.PI) / p ) * . + c + b;
}
},
Back: {
easeIn: function(t, b, c, d, s) {
if (typeof s == "undefined") s = 1.70158;
return c * (t /= d) * t * ((s + ) * t - s) + b;
},
easeOut: function(t, b, c, d, s) {
if (typeof s == "undefined") s = 1.70158;
return c * ((t = t/d - ) * t * ((s + ) * t + s) + ) + b;
},
easeInOut: function(t, b, c, d, s) {
if (typeof s == "undefined") s = 1.70158;
if ((t /= d / ) < ) return c / * (t * t * (((s *= (1.525)) + ) * t - s)) + b;
return c / *((t -= ) * t * (((s *= (1.525)) + ) * t + s) + ) + b;
}
},
Bounce: {
easeIn: function(t, b, c, d) {
return c - Tween.Bounce.easeOut(d-t, , c, d) + b;
},
easeOut: function(t, b, c, d) {
if ((t /= d) < ( / 2.75)) {
return c * (7.5625 * t * t) + b;
} else if (t < ( / 2.75)) {
return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .) + b;
} else if (t < (2.5 / 2.75)) {
return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .) + b;
} else {
return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .) + b;
}
},
easeInOut: function(t, b, c, d) {
if (t < d / ) {
return Tween.Bounce.easeIn(t * , , c, d) * . + b;
} else {
return Tween.Bounce.easeOut(t * - d, , c, d) * . + c * . + b;
}
}
}
}
Math.tween = Tween;
具体每种算法的操作实例,可以看大神张鑫旭的博客实例:http://www.zhangxinxu.com/study/201612/how-to-use-tween-js.html
当然,以上这些算法仅仅是一个状态,需要配合时间上的变化,才能实现缓动,这里使用的是requestAnimationFrame,具体代码好吧,也是拿来主义
(function() {
var lastTime = ;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = ; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
} if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(, - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
}; if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
最后是简单的实例应用,很简单,
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>使用tweenjs</title>
<style type="text/css">
div {
width: 100px;
height: 100px;
border: 1px solid red;
text-align: center;
line-height: 100px;
position: absolute;
}
</style>
</head> <body>
<div id="test">
这是测试
</div>
<script type="text/javascript" src="RequestAnimationFrame.js"></script>
<script type="text/javascript" src="tween.js"></script>
<script type="text/javascript">
var DOM=document.getElementById("test");
var t = ,//开始时间
b = ,//开始位置
c = ,//变化值
d = ;//持续时间
var step = function() {
var value = Tween.Bounce.easeOut(t, b, c, d);
DOM.style.left = value + 'px'; t++;
if (t <= d) {
// 继续运动
requestAnimationFrame(step);
} else {
// 动画结束
}
};
step();
</script>
</body> </html>
具体使用中,需要参数以及控制好结束条件即可。
tweenjs缓动算法使用小实例的更多相关文章
- 做h5动画会用到的一个很好的缓动算法库
http://www.zhangxinxu.com/wordpress/2016/12/how-use-tween-js-animation-easing/
- window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
window.requestAnimationFrame 概述 window.requestAnimationFrame()这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作 ...
- 《JavaScript 实战》:Tween 算法及缓动效果
Flash 做动画时会用到 Tween 类,利用它可以做很多动画效果,例如缓动.弹簧等等.我这里要教大家的是怎么利用 Flash 的 Tween 类的算法,来做js的Tween算法,并利用它做一些简单 ...
- 软件项目技术点(1)——Tween算法及缓动效果
AxeSlide软件项目梳理 canvas绘图系列知识点整理 Tween算法及缓动效果 软件里在切换步序时需要有过渡动画效果,从当前位置的画面缓动到目标位置的画面.动画效果可重新查看文章系列第一篇 ...
- 利用tween.js算法生成缓动效果
在讲tween类之前,不得不提的是贝塞尔曲线了.首先,贝塞尔曲线是指依据四个位置任意的点坐标绘制出的一条光滑曲线.它在作图工具或动画中中运用得比较多,例如PS中的钢笔工具,firework中的画笔等等 ...
- 网站建设中前端常用的jQuery+easing缓动的动画
网站建设中前端人员利用jQuery实现动画再简单不过了,只是要实现更酷的效果还需要插件来帮忙,easing就是一款帮助jQuery实现缓动动画的插件,经过试用,效果很不错! 下载该插件:jquery. ...
- 回到顶部缓动效果代码 --- tween动画函数库
function animateGoTop() { var top = $(document).scrollTop(); var end = 0; var dur = 500; var t = 0; ...
- Windows Phone开发(42):缓动动画
原文:Windows Phone开发(42):缓动动画 前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame.EasingDoubleKeyF ...
- JS实现缓动动画效果
原理如下: 假设要从数值A变化到数值B,如果是线性运动,则每次移动距离是一样:如果是缓动,每次移动距离不一样.那如何才能不一样呢?很简单,按比例移动就可以. 例如:每次移动剩余距离的一半. 对吧,超容 ...
随机推荐
- scala 实现日期运算
在scala程序中,有时我们需要对日期进行运算,比如一天之前,两天之前,一个月之前等等,本博文给出了简单的实现方式 val cal = Calendar.getInstance cal.add(Cal ...
- Django学习之mysql结果显示
背景:向数据库添加相同名字的用户 上节可知,在查询某个用户信息时,只能查看到行数但不能查看结构性信息. fetchone()函数可以但仅可逐个查看结构性信息.查不到信息将以None替补. fetchA ...
- Excelファイルを扱う方法
概要 データをローカルに落としたいという要件がある場合.ユーザーはExcelを希望するケースが多いだろう.そんな時は以下の汎用モジュールを使用して簡単に作る事ができます.使用方法は.GUI_UPLOA ...
- JSON解析工具——fastjson的简单使用
从官方文档入手: 常见问题与快速上手:https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 各种使 ...
- 上海Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 3680: 吊打XXX
3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...
- libevent学习一
常见的异步IO存在的问题: 1.使用 fcntl(fd, F_SETFL, O_NONBLOCK);,为什么在处理上效率不好. a.在没有数据可读写的时候,循环会不停执行,浪费掉大部分 ...
- 容器云技术:容器化微服务,Istio占C位出道
在精彩的软件容器世界中,当新项目涌现并解决你认为早已解决的问题时,这感觉就像地面在你的脚下不断地移动.在许多情况下,这些问题很久以前被解决,但现在的云原生架构正在推动着更大规模的应用程序部署,这就需要 ...
- logstash-input-jdbc and logstash-ouput-jdbc
要求通过logstash从oracle中获取数据,然后相应的直接传入mysql中去. 基本测试成功的配置文件如下: input { stdin { } jdbc { jdbc_connection_s ...
- jmeter获取cookies
使用场景:登录后,后续的请求操作需获取到JSESSIONID才可进行 1.将jmeter的bin目录下的jmeter.properties文件中的CookieManager.save.cookies= ...