五、动画效果Animated Effects

jQuery的动画效果框架定义了一些简单的动画效果方法,如fadeIn(),fadeOut,也定义了更通用更复杂的动画方法animate。首先了解下jQuery框架动画效果框架的一些通过特性:

a. 效果有一个持续时间,可以是一个毫秒为单位的数值,也可以是一个字符串,如"fast"表示200ms,"slow"表示600ms,如果使用的字符串jQuery不识别,使用默认的400ms;我们可以定义自己的字符串表示不同的持续时间,方法是:jQuery.fx.speeds["yourname"]=number; 如jQuery.fx.speeds["medium-fast"]=300;jQuery.fx.speeds["medium-slow"]=500;

jQuery的效果方法,一般第一个参数就是持续时间,如果漏写,使用默认的400ms

b. jQuery效果方法的执行时异步的,jQuery效果方法的第二个参数是一个回调函数,效果执行结束时被调用,如:$("mymsg").fadeIn("slow",function(){$(this).text("hello world!");});

c. 默认情况下,jQuery的效果的是排队执行的,前一个执行完,后一个才执行,如先闪烁再显示的效果:$("blink").fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn();

d. 效果方法接受可选的持续时间和回调函数参数,也可以接受一个包含这些属性的对象作为参数,如:$("#msg").fadeIn({duration:"slow",complete:function(){$(this).text("hello world!");}});

1、简单效果

jQuery定义了9个简答效果方法来控制元素的显示与隐藏,可以分为3组:

(1)fadeIn,fadeOut,fadeTo    实际上是通过CSS的opacity来实现的,元素本来还是在文档中。

(2)show,hide,toggle        实际上是通过CSS的display来实现的,如果隐藏,元素是从文档中移除了的。

(3)slideDown,slideUp,slideToggle     通过改变元素的height以及CSS属性display来实现卷帘的滑动效果。

不同的jQuery插件为该库添加了额外的UI效果方法,其中jQueryUI库包括了丰富的效果方法。

2、自定义效果animate方法

使用animate()方法可以自定义更通用的效果。

animate的第一个参数是一个对象,表示效果执行的目标。该对象的属性为元素的CSS属性,值为该CSS属性的目标值。表示的效果为,元素的CSS属性从其当前值过渡到目标值

如:$("img").animate({height:0});把所有图片的高度缩小到0.

第二个参数,可以是一个选项对象,如:$("img").animate({height:0},{duration:300,complete:funciton(){...}});

第二个参数可以直接是持续时间,此时第三个参数为缓动函数easing function,第四个参数为回调函数。

最通用的情况是,animate接受两个对象参数,第一个表示要对什么进行动画,第二个表示怎么动画。

(1)对什么进行动画?

作为animate的第一个参数,必须是一个对象,该对象的属性名是CSS属性名,值为这些属性在执行动画后到达的目标值。只有数值类的属性可以对其进行动画操作,color,font以及枚举类如display等非数值类的属性不能对其进行动画操作。在表示值的字符串前面加上+=或者-=表示相对值,如:$("p").animate({"margin-left":"+=.5in",opacity:"-=.1"});

表示值的字符串除了可以是数值(+=,-=前缀,数值,单位后缀)以外,还有其他3个值可以使用:"hide","show","toggle"

(2)怎么样动画?

animate的第二个可选参数对象,是用来表示动画如何执行的。该对象的属性有:

duration:  表示持续时间,可以是数值,或者预定义的字符串,如:"fast"

complete: 表示动画结束时的回调函数。

step: 动画没执行一步时的回调函数,元素本身用this变量表示,元素动画的目标属性的当前值作为第一个参数传到step函数

queue: ture/false  表示该动画是否排队。默认都是需要排队的,不排队的动画是立即执行的,不需要等上一个动画结束后再执行。

           如:$("img").fadeIn(500).animate({width:"+=100"},{queue:false,duration:1000}).fadeOut(500);

easing: 表示缓动函数的字符串,如:$("img").animate({width:"+=100"},100,"linear");

specialEasing:  表示自定义的缓动函数,如:$("img").animate({width:"hide",height:"hide",opacity:"hide"},{specialEasing:{width:"linear",height:"linear"}});

上例为不同的CSS属性设置了不同的缓动函数,达到这一功能的另一个写法是:$("img").animate({width:["hide","linear"],height:["hide","linear"],opacity:"hide"});

什么是缓动函数?

比如一个动画$("img").animate({opacity:"hide"},{duration:400});该动画是在400ms内把图片的透明度从1减少到0,那么在100ms的时候,应该设置图片的透明度为多少?

最直接和最天真的方法就是线性计算,100ms是400ms的1/4,那么opacity应该设置为0.75. 然而实践证明这种方式产生的动画视觉效果不是很好,非线性可能更好。

基于此,jQuery引入了缓动函数,缓动函数把动画已完成时间的百分比映射到动画属性的目标值。

jQuery默认的缓动函数是一个正弦曲线,先慢,再快,最后慢。jQuery给每个缓动函数一个名字,默认缓动函数的名字为"swing",jQuery也定义了一个线性的缓动函数,名字为"linear"。

我们可以定义自己的缓动函数并命名,方法是:jQuery.easing["name"]=f;  如:jQuery.easing["squareroot"]=Math.sqrt;

jQueryUI库及jQuery缓动插件定义了丰富的缓动函数。

3、动画的取消,延迟以及动画队列

(1)stop,停止当前正在执行的动画。接受两个boolean参数。第一个表示是否清除存在的动画队列,缺失或者为false的时候表示不清除;第二个表示元素的动画属性是设置成目标值还是当前值,确实或者为false时表示设置为当前值。如:$("img").bind({"mouseover":function{$(this).stop().fadeTo(300,1.0);},"mouseout":function{$(this).stop().fadeTo(300,0.5);}});

(2)delay,延迟动画队列指定的时间。接受两个参数,第一个为延迟时间,单位毫秒,第二个为可选参数,指定延迟队列的名字。如:$("img").fadeTo(100,.5).delay(200).slideUp();

(3)jQuery动画队列是按顺序执行的函数列表,每个队列和一个文档元素关联,不同元素的队列之间相互独立。

       queue()  --添加一个函数到队列中,当一个函数到达队列的头部时,该函数出列,并且被调用,this表示队列所关联的元素。你的函数被调用时,jQuery会传递一个函数参数,该函数参数在你的函数执行结束时必须被调用,其功能是在队列上执行next的操作(出列),如果你不调用该函数,那么队列会被阻止以至于队列中的其他函数不能执行。如:

       $("#msg").fadeIn().delay(200).queue(function(next){$(this).text("hello,world");next();}).animate({border-width:"+=10px;"});//next是函数,必须调用

    dequeue() --从队列中出列一个函数,并执行。队列函数参数特性是jQuery1.4的新特性,1.4之前使用dequeue()来出列,如上面的例子1.4前应该为:$("#msg").fadeIn().delay(200).queue(function(){$(this).text("hello,world");$(this).dequeue();}).animate({border-width:"+=10px;"});

       clearQueue()  --清除一个元素上的队列。

       给queue()方法传入一个函数,表示把函数添加到队列,如果传入一个函数的数组,表示用该函数数组替换原来的队列。并且这两种方法都是把当前队列作为数组返回。

       queue,dequeue方法,也定义了jQuery的功能函数,如:$(e).queue(f)等同于jQuery.queue(e,f);   e为元素,f为函数

      queue,dequeue,clearQueue都使用可选的队列名作为第一个参数,如果没有指定,jQuery默认队列名为"fx"。

  jQuery的队列在异步执行一系列有序操作是非常有用,我们只需把操作置入队列中,并且传入一个非"fx"的队列名称,队列中的函数不会自动执行,我们必须显示的调用dequeue使队列中的函数出列,然后函数才会被调用。