JavaScript实现的Tween算法及缓冲特效实例代码


Posted in Javascript onNovember 03, 2015

本文实例讲述了JavaScript实现的Tween算法及缓冲特效。分享给大家供大家参考,具体如下:

这里演示Tween 算法及缓冲特效的JavaScript代码,利用它可以做缓动、弹簧等很多动画效果,怎么利用flash的Tween类的算法,来做js的Tween算法,并利用它做一些简单的缓动效果呢,看懂了本代码你就明白了。

运行效果截图如下:

JavaScript实现的Tween算法及缓冲特效实例代码

在线演示地址如下:

具体代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Tween</title>
</head>
<body>
<div style="padding-left:50px;">
 <div style="position:relative; border:1px solid #000000; width:550px; height:50px;">
  <div id="idMove" style="width:50px; height:50px; background:#930; position:absolute;"></div>
 </div>
 <div style="position:relative;width:550px;height:200px; margin-top:50px;">
  <div id="idChart" style="border:1px solid #000;height:200px;"> </div>
  <div id="idLine" style="position:absolute;top:0;left:0;height:200px;width:1px;background:#000;"></div>
 </div>
</div>
<div>
 <p> Tween类型: <br />
  <label>
   <input name="vTween" type="radio" value="Linear" checked="checked" />
   Linear </label>
  <label>
   <input name="vTween" type="radio" value="Quad" />
   Quadratic </label>
  <label>
   <input name="vTween" type="radio" value="Cubic" />
   Cubic </label>
  <label>
   <input name="vTween" type="radio" value="Quart" />
   Quartic </label>
  <label>
   <input name="vTween" type="radio" value="Quint" />
   Quintic </label>
  <label>
   <input name="vTween" type="radio" value="Sine" />
   Sinusoidal </label>
  <br />
  <label>
   <input name="vTween" type="radio" value="Expo" />
   Exponential </label>
  <label>
   <input name="vTween" type="radio" value="Circ" />
   Circular </label>
  <label>
   <input name="vTween" type="radio" value="Elastic" />
   Elastic </label>
  <label>
   <input name="vTween" type="radio" value="Back" />
   Back </label>
  <label>
   <input name="vTween" type="radio" value="Bounce" />
   Bounce </label>
 </p>
 <p> ease类型: <br />
  <label>
   <input name="vEase" type="radio" value="easeIn" checked="checked" />
   easeIn </label>
  <label>
   <input name="vEase" type="radio" value="easeOut" />
   easeOut </label>
  <label>
   <input name="vEase" type="radio" value="easeInOut" />
   easeInOut </label>
 </p>
 <input id="idSpeed" type="button" value="减慢速度" />
 <input id="idRun" type="button" value=" Run " />
</div>
<script>
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){
  if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  else var 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){
  if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  else var 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){
  if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
  if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  else var 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 (s == undefined) s = 1.70158;
  return c*(t/=d)*t*((s+1)*t - s) + b;
 },
 easeOut: function(t,b,c,d,s){
  if (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 (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;
 }
 }
}
var $ = function (id) {
 return "string" == typeof id ? document.getElementById(id) : id;
};
var Each = function(list, fun){
 for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
};
var fun, iChart = 550, iDuration = 100;
function Move(){
 var oM = $("idMove").style, oL = $("idLine").style, t=0, c=500, d=iDuration;
 oM.left=oL.left="0px"; clearTimeout(Move._t);
 function _run(){
 if(t<d){
  t++;
  oM.left = Math.ceil(fun(t,0,c,d)) + "px";
  oL.left = Math.ceil(Tween.Linear(t,0,iChart,d)) + "px";
  Move._t = setTimeout(_run, 10);
 }else{
  oM.left = c + "px";
  oL.left = iChart + "px";
 }
 }
 _run();
}
function Chart(){
 var a = [];
 for (var i = 0; i < iChart; i++) {
 a.push('<div style="background-color:#f60;font-size:0;width:3px;height:3px;position:absolute;left:' + (i-1) + 'px;top:' + (Math.ceil(fun(i,200,-200,iChart))) + 'px;"><\/div>');
 }
 $("idChart").innerHTML = a.join("");
}
var arrTween = document.getElementsByName("vTween");
var arrEase = document.getElementsByName("vEase");
Each(arrTween, function(o){ o.onclick = function(){ SetFun(); Chart(); } })
Each(arrEase, function(o){ o.onclick = function(){ SetFun(); Chart(); } })
function SetFun(){
 var sTween, sEase;
 Each(arrTween, function(o){ if(o.checked){ sTween = o.value; } })
 Each(arrEase, function(o){ if(o.checked){ sEase = o.value; } })
 fun = sTween == "Linear" ? Tween.Linear : Tween[sTween][sEase];
}
$("idRun").onclick = function(){ SetFun(); Chart(); Move(); }
$("idSpeed").onclick = function(){
 if(iDuration == 100){
 iDuration = 500; this.value = "加快速度";
 }else{
 iDuration = 100; this.value = "减慢速度";
 }
}
</script>
</body>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
Apr 02 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
jQuery DOM插入节点操作指南
Mar 03 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
bootstrap滚动监控器使用方法解析
Jan 13 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
原生js实现3D轮播图
Mar 21 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 #Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
Nov 03 #Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 #Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 #Javascript
Javascript设计模式理论与编程实战之简单工厂模式
Nov 03 #Javascript
JS实现网页标题随机显示名人名言的方法
Nov 03 #Javascript
jQuery实用技巧必备(中)
Nov 03 #Javascript
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
WHOIS类的修改版
2006/10/09 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
javascript制作2048游戏
2015/03/30 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
python矩阵转换为一维数组的实例
2018/06/05 Python
python获取代码运行时间的实例代码
2018/06/11 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
大学生就业自荐信
2013/10/26 职场文书
工地资料员岗位职责
2013/12/31 职场文书
节水标语大全
2014/06/11 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL