博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JQUEY FX源码解析
阅读量:4920 次
发布时间:2019-06-11

本文共 2803 字,大约阅读时间需要 9 分钟。

相对于 , Jquery Fx 的处理显得紧凑,灵活,不像 Extjs 严格的分层,将基础操作,中央定时队列抽象出来,然后再对具体元素,具体属性进行动画效果,Jquery 不严格区分,将对元素属性的操作以及定时队列管理糅合在一起,代码显得更精悍。

DOM动画处理的关键是对目标元素得目标 css 属性进行随时间设置不同的值,造成动画的效果,具体设计包括两个方面:

1。中央定时队列引入,将所有元素的所有不同属性变化导入中央队列,避免定时器分散设置与不同元素,性能提高

2。抽象出不同 css 属性随时间变化得公共计算,css 属性以及变化值做为变量处理。

 

 

Jquery 实践:

关建为 animate 方法

 

Js代码  
  1. animate: function( prop, speed, easing, callback )  

 

其他定义好的操作 

 

Js代码  
  1. slideDown,slideUp,slideToggle,fadeIn,fadeOut,show,hide  

 

都是对于 animate 函数的具体变量设置调用。

animate 参数的 prop 为 属性的结合,形式为 :

 

Js代码  
  1. [{  
  2. height:endValue  
  3. },  
  4. {  
  5. width:endValue  
  6. }]  

 

其中 endValue 为动画结束的结果数字或者 jquery 预定义的一些常量 show ,hide ,toogle ...

在animate 函数中,对参数prop中的每个 css 属性计算开始,结束以及持续时间,对应每个元素以及元素的每个变化css属性构造出 jquery.fx类型 对象 ,由该对象调用其 custom 方面来具体实施动画效果。

 

Js代码  
  1. fx: function( elem, options, prop ){  
  2.         this.options = options;  
  3.         this.elem = elem;  
  4.         this.prop = prop;  
  5.   
  6.         if ( !options.orig )  
  7.             options.orig = {};  
  8.     }  

 

框架图:

 

custom 方法 就如同之前分析,构造出回调函数,放入中央队列等待处理,关键点 :

1:利用闭包,创造出内部函数,可以由中央计时器调用修改其特定元素特定css属性对应的jquery.fx的内部状态

Js代码  
  1. //内部函数,由中央计时控制调用更新内部状态    
  2. function t(gotoEnd){  
  3.             return self.step(gotoEnd);  
  4.         }  
  5.   
  6.         t.elem = this.elem;  

 

2:维护中央队列定时器,需要时才创建 timer。(与extjs 不同,中央队列耦合于动画操作)

Js代码  
  1. if ( t() && jQuery.timers.push(t) && !timerId ) {  
  2.             timerId = setInterval(function(){  
  3.                 var timers = jQuery.timers;  
  4.   
  5.                 for ( var i = 0; i < timers.length; i++ )  
  6.                     if ( !timers[i]() )  
  7.                         timers.splice(i--, 1);  
  8.   
  9.                 if ( !timers.length ) {  
  10.                     clearInterval( timerId );  
  11.                     timerId = undefined;  
  12.                 }  
  13.             }, 13);  

 

3:  根据当前时间与结束时间(由speed可得)的比例,以及用户设置的css属性值的最终结果来计算当前css属性的具体值

       3.1  两种比例计算方法, linear 与 swing

Js代码  
  1. easing: {  
  2.         linear: function( p, n, firstNum, diff ) {  
  3.             return firstNum + diff * p;  
  4.         },  
  5.         swing: function( p, n, firstNum, diff ) {  
  6.             return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;  
  7.         }  
  8.     },  

 

       3.2  css 属性值的更新注意 opacity ,

 

Js代码  
  1. step: {  
  2.   
  3.         opacity: function(fx){  
  4.             jQuery.attr(fx.elem.style, "opacity", fx.now);  
  5.         },  
  6.   
  7.         _default: function(fx){  
  8.             if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )  
  9.                 fx.elem.style[ fx.prop ] = fx.now + fx.unit;  
  10.             else  
  11.                 fx.elem[ fx.prop ] = fx.now;  
  12.         }  
  13.     }  

 

4.easing 的插件扩展方式

jquery自带了两种easing (即为如何从初值随着时间变化过度到终值的过程):

 

Js代码  
  1. easing: {  
  2.         linear: function( p, n, firstNum, diff ) {  
  3.             return firstNum + diff * p;  
  4.         },  
  5.         swing: function( p, n, firstNum, diff ) {  
  6.             return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;  
  7.         }  

 

如果要自定义easing,则实现一个函数(接口),参数解释:

p : 当前动画进行到的进度,范围为0 ~ 1

n : 动画从开始已经逝去的时间 (很少使用)

firstNum: 动画属性值的初始值

diff: 当前动画时刻属性值和属性终值的差值

另外还有第五个参数

duration: 设置的动画的持续时间

一般只要使用 p,firstNum,diff 参数即可。

关键是要保证返回值当 p=0 时返回 firstNum 即为初值,当 p=1 时返回 firstNum+diff 即为终值

比如 二次函数,越往后变化越剧烈:

 

Js代码  
  1. jQuery.extend(jQuery.easing, {   
  2.   'quadratic'function(p,n,firstNum,diff,duration) {  
  3.     return p* p* diff + firstNum;  
  4.   }  
  5. });  

 

使用:

 

Js代码  
  1. animate: function( prop, speed, easing, callback )   

 中的 easing 参数中填入 quadratic 即可。

 

非原创,出自网址:http://yiminghe.iteye.com/blog/512988

转载于:https://www.cnblogs.com/natureclove/archive/2013/03/28/JQUEY_Fx.html

你可能感兴趣的文章
应用程序-特定 权限设置并未向在应用程序容器 不可用SID
查看>>
Matlab图像处理工具箱用户指南——裁剪图像及空间变换部分翻译
查看>>
Cookie and Session的介绍
查看>>
MySQL架构
查看>>
斯坦福机器学习-第三周(分类,逻辑回归,过度拟合及解决方法) ...
查看>>
Python 三级菜单
查看>>
《城盐州》:诗与史
查看>>
jquery 源码分析七 - Sizzle
查看>>
素数的另一编法
查看>>
写一个 sum方法,在使用下面任一语法调用时,都可以正常工作
查看>>
【VBA编程】10.自定义集合
查看>>
sharepoint 2010 培训公司课程内容
查看>>
GUN.TROVE 集合框架
查看>>
python 中的input()和raw_input()功能与使用区别
查看>>
如何正确配置客户端tnsname.ora文件
查看>>
当用户输入网址到页面展现,发生了什么?
查看>>
Linux运维:安装CentOS7图解
查看>>
CSS隐藏页面元素的方法
查看>>
B. Mike and Feet Codeforces Round #305 (Div. 1) (并查集)
查看>>
学习Python遇到的那些坑
查看>>