jQuery自定义动画函数实例详解(附demo源码)


Posted in Javascript onDecember 10, 2015

本文实例讲述了jQuery自定义动画函数完整实现技巧。分享给大家供大家参考,具体如下:

运行效果截图如下:

jQuery自定义动画函数实例详解(附demo源码)

在线演示地址如下:

具体代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>自定义动画DEMO</title>
<script src="jquery-1.4.4.js"></script>
<script src="jquery.easing.1.3.js"></script>
<script>
var Tween = {
 Linear:function (start,alter,curTime,dur) {return start+curTime/dur*alter;},//最简单的线性变化,即匀速运动
 Quad:{//二次方缓动
 easeIn:function (start,alter,curTime,dur) {
  return start+Math.pow(curTime/dur,2)*alter;
 },
 easeOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur;
  return start-(Math.pow(progress,2)-2*progress)*alter;
 },
 easeInOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur*2;
  return (progress<1?Math.pow(progress,2):-((--progress)*(progress-2) - 1))*alter/2+start;
 }
 },
 Cubic:{//三次方缓动
 easeIn:function (start,alter,curTime,dur) {
  return start+Math.pow(curTime/dur,3)*alter;
 },
 easeOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur;
  return start-(Math.pow(progress,3)-Math.pow(progress,2)+1)*alter;
 },
 easeInOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur*2;
  return (progress<1?Math.pow(progress,3):((progress-=2)*Math.pow(progress,2) + 2))*alter/2+start;
 }
 },
 Quart:{//四次方缓动
 easeIn:function (start,alter,curTime,dur) {
  return start+Math.pow(curTime/dur,4)*alter;
 },
 easeOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur;
  return start-(Math.pow(progress,4)-Math.pow(progress,3)-1)*alter;
 },
 easeInOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur*2;
  return (progress<1?Math.pow(progress,4):-((progress-=2)*Math.pow(progress,3) - 2))*alter/2+start;
 }
 },
 Quint:{//五次方缓动
 easeIn:function (start,alter,curTime,dur) {
  return start+Math.pow(curTime/dur,5)*alter;
 },
 easeOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur;
  return start-(Math.pow(progress,5)-Math.pow(progress,4)+1)*alter;
 },
 easeInOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur*2;
  return (progress<1?Math.pow(progress,5):((progress-=2)*Math.pow(progress,4) +2))*alter/2+start;
 }
 },
 Sine :{//正弦曲线缓动
 easeIn:function (start,alter,curTime,dur) {
  return start-(Math.cos(curTime/dur*Math.PI/2)-1)*alter;
 },
 easeOut:function (start,alter,curTime,dur) {
  return start+Math.sin(curTime/dur*Math.PI/2)*alter;
 },
 easeInOut:function (start,alter,curTime,dur) {
  return start-(Math.cos(curTime/dur*Math.PI/2)-1)*alter/2;
 }
 },
 Expo: {//指数曲线缓动
 easeIn:function (start,alter,curTime,dur) {
  return curTime?(start+alter*Math.pow(2,10*(curTime/dur-1))):start;
 },
 easeOut:function (start,alter,curTime,dur) {
  return (curTime==dur)?(start+alter):(start-(Math.pow(2,-10*curTime/dur)+1)*alter);
 },
 easeInOut:function (start,alter,curTime,dur) {
  if (!curTime) {return start;}
  if (curTime==dur) {return start+alter;}
  var progress =curTime/dur*2;
  if (progress < 1) {
  return alter/2*Math.pow(2,10* (progress-1))+start;
  } else {
  return alter/2* (-Math.pow(2, -10*--progress) + 2) +start;
  }
 }
 },
 Circ :{//圆形曲线缓动
 easeIn:function (start,alter,curTime,dur) {
  return start-alter*Math.sqrt(-Math.pow(curTime/dur,2));
 },
 easeOut:function (start,alter,curTime,dur) {
  return start+alter*Math.sqrt(1-Math.pow(curTime/dur-1));
 },
 easeInOut:function (start,alter,curTime,dur) {
  var progress =curTime/dur*2;
  return (progress<1?1-Math.sqrt(1-Math.pow(progress,2)):(Math.sqrt(1 - Math.pow(progress-2,2)) + 1))*alter/2+start;
 }
 },
 Elastic: {//指数衰减的正弦曲线缓动
 easeIn:function (start,alter,curTime,dur,extent,cycle) {
  if (!curTime) {return start;}
  if ((curTime==dur)==1) {return start+alter;}
  if (!cycle) {cycle=dur*0.3;}
  var s;
  if (!extent || extent< Math.abs(alter)) {
  extent=alter;
  s = cycle/4;
  } else {s=cycle/(Math.PI*2)*Math.asin(alter/extent);}
  return start-extent*Math.pow(2,10*(curTime/dur-1)) * Math.sin((curTime-dur-s)*(2*Math.PI)/cycle);
 },
 easeOut:function (start,alter,curTime,dur,extent,cycle) {
  if (!curTime) {return start;}
  if (curTime==dur) {return start+alter;}
  if (!cycle) {cycle=dur*0.3;}
  var s;
  if (!extent || extent< Math.abs(alter)) {
  extent=alter;
  s =cycle/4;
  } else {s=cycle/(Math.PI*2)*Math.asin(alter/extent);}
  return start+alter+extent*Math.pow(2,-curTime/dur*10)*Math.sin((curTime-s)*(2*Math.PI)/cycle);
 },
 easeInOut:function (start,alter,curTime,dur,extent,cycle) {
  if (!curTime) {return start;}
  if (curTime==dur) {return start+alter;}
  if (!cycle) {cycle=dur*0.45;}
  var s;
  if (!extent || extent< Math.abs(alter)) {
  extent=alter;
  s =cycle/4;
  } else {s=cycle/(Math.PI*2)*Math.asin(alter/extent);}
  var progress = curTime/dur*2;
  if (progress<1) {
  return start-0.5*extent*Math.pow(2,10*(progress-=1))*Math.sin( (progress*dur-s)*(2*Math.PI)/cycle);
  } else {
  return start+alter+0.5*extent*Math.pow(2,-10*(progress-=1)) * Math.sin( (progress*dur-s)*(2*Math.PI)/cycle);
  }
 }
 },
 Back:{
 easeIn: function (start,alter,curTime,dur,s){
  if (typeof s == "undefined") {s = 1.70158;}
  return start+alter*(curTime/=dur)*curTime*((s+1)*curTime - s);
 },
 easeOut: function (start,alter,curTime,dur,s) {
  if (typeof s == "undefined") {s = 1.70158;}
  return start+alter*((curTime=curTime/dur-1)*curTime*((s+1)*curTime + s) + 1);
 },
 easeInOut: function (start,alter,curTime,dur,s){
  if (typeof s == "undefined") {s = 1.70158;}
  if ((curTime/=dur/2) < 1) {
  return start+alter/2*(Math.pow(curTime,2)*(((s*=(1.525))+1)*curTime- s));
  }
  return start+alter/2*((curTime-=2)*curTime*(((s*=(1.525))+1)*curTime+ s)+2);
 }
 },
 Bounce:{
 easeIn: function(start,alter,curTime,dur){
  return start+alter-Tween.Bounce.easeOut(0,alter,dur-curTime,dur);
 },
 easeOut: function(start,alter,curTime,dur){
  if ((curTime/=dur) < (1/2.75)) {
  return alter*(7.5625*Math.pow(curTime,2))+start;
  } else if (curTime < (2/2.75)) {
  return alter*(7.5625*(curTime-=(1.5/2.75))*curTime + .75)+start;
  } else if (curTime< (2.5/2.75)) {
  return alter*(7.5625*(curTime-=(2.25/2.75))*curTime + .9375)+start;
  } else {
  return alter*(7.5625*(curTime-=(2.625/2.75))*curTime + .984375)+start;
  }
 },
 easeInOut: function (start,alter,curTime,dur){
  if (curTime< dur/2) {
  return Tween.Bounce.easeIn(0,alter,curTime*2,dur) *0.5+start;
  } else {
  return Tween.Bounce.easeOut(0,alter,curTime*2-dur,dur) *0.5 + alter*0.5 +start;
  }
 },
 easeOutBounce: function (b, c, t, 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;
  }
 }
 },
 //start,alter,curTime,dur
 easeOutBounce: function (b, c, t, 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;
 }
 }
};
jQuery(function($){
 //两种动画方式对比,在w3c浏览器中是一致的,在IE中有差异(即使用同算法)
 $("#start").click(function(){
 //自定义动画函数
 animate(Fid("song"), {opacity:0.3, left:400}, 2000, Tween.easeOutBounce);
 //jq动画效果
 $("#jian").animate( {opacity:0.3, left:400}, 2000, 'easeOutBounce')
 })
 /*
 参数说明
 o:要动画的对象
 end:元素最终的样式
 dur:动画持续多长时
 fx:效果插件
 */
 function animate(o ,end, dur, fx) {
 var curTime=0;
 var start = {};//元素的初始样式
 var alter = {};//元素的增量样式
 var t=setInterval(function () {
  if (curTime>=dur) clearTimeout(t);
  for (var i in end) {
  if(! (i in start))//注意加括号
  {
   //不能用 parseInt.有透明度时会出问题
   start[i] = parseFloat(getStyle(o, i));
  }
  if(! (i in alter))
  {
   alter[i] = end[i] - start[i];
  }
  var val = fx(start[i],alter[i],curTime,dur);
  if(i == 'opacity')
  {
   /**
   o.style.filter, o.style.opacity 火狐下都为空字符串
   只能用 o.style.opacity 检测 
   注意:ietester下无法测试透明度
   */
   if(typeof o.style.opacity == "undefined")
   {
   o.style.filter = "alpha(opacity="+val*100+")";   
   }else{
   o.style[i] = val;
   }
  }else{
   o.style[i] = val+'px'; 
  }
  }
  curTime+=13; //jquery 中也为 13
 },13);
 }
 /**
 获取元素样式
 处理透明度、元素浮动样式的获取 ,结果带有单位
 */
 function getStyle(elem, name) {
 var nameValue = null;
 if (document.defaultView) {
  var style = document.defaultView.getComputedStyle(elem, null);
  nameValue = name in style ? style[name] : style.getPropertyValue(name);
 } else {
  var style = elem.style,
  curStyle = elem.currentStyle;
  //透明度 from youa
  if (name == "opacity") {
  if (/alpha\(opacity=(.*)\)/i.test(curStyle.filter)) {
   var opacity = parseFloat(RegExp.$1);
   return opacity ? opacity / 100 : 0;
  }
  return 1;
  }
  if (name == "float") {
  name = "styleFloat";
  }
  var ret = curStyle[name] || curStyle[camelize(name)];
  //单位转换 from jqury
  if (!/^-?\d+(?:px)?$/i.test(ret) && /^\-?\d/.test(ret)) {
  var left = style.left,
  rtStyle = elem.runtimeStyle,
  rsLeft = rtStyle.left;
  rtStyle.left = curStyle.left;
  style.left = ret || 0;
  ret = style.pixelLeft + "px";
  style.left = left;
  rtStyle.left = rsLeft;
  }
  nameValue = ret;
 }
 return nameValue === 'auto' ? '0px' : nameValue;
 }
 function camelize(s) {//将CSS属性名转换成驼峰式
 return s.replace(/-[a-z]/gi,function (c) {
  return c.charAt(1).toUpperCase();
 });
 }
 function Fid(id)
 {
 return document.getElementById(id); 
 }
})
</script>
</head>
<style>
.main{ border:1px solid blue; height:350px;}
.pos {position:absolute; left:0px;top:50px; border:5px solid red; background:green;width:100px; height:100px;}
</style>
<body>
<div class="main">
 <div id="song" class="pos" style="display:block;">song</div>
 <div id="jian" class="pos" style="top:200px;">jian</div>
</div>
<button id="start">start</button>
</body>
</html>

完整实例代码点击此处本站下载。

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

Javascript 相关文章推荐
js模拟弹出效果代码修正版
Aug 07 Javascript
js下写一个事件队列操作函数
Jul 19 Javascript
JavaScript 产生不重复的随机数三种实现思路
Dec 13 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
JS对象转换为Jquery对象实现代码
Dec 29 Javascript
JavaScript的内存释放问题详解
Jan 21 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
js的三种继承方式详解
Jan 21 Javascript
jQuery EasyUI开发技巧总结
Sep 26 jQuery
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
javascript图片预加载完整实例
Dec 10 #Javascript
JavaScript动态插入CSS的方法
Dec 10 #Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 #Javascript
js表单提交和submit提交的区别实例分析
Dec 10 #Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 #Javascript
JS提交form表单实例分析
Dec 10 #Javascript
You might like
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
python创建子类的方法分析
2019/11/28 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
浅析python 字典嵌套
2020/09/29 Python
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
Golang 入门 之url 包
2022/05/04 Golang
python计算列表元素与乘积详情
2022/08/05 Python