jQuery动画效果

现在在页面中使用动画效果来提高用户体验,已经很常用了,最近弄了一个项目也运用了不少的动画效果,拿其中一个来说下吧。使用jQuery使用Animate和scrollTop实现页面滑动效果,以往常用的写法是:

学习要点:

$.animate({

1.显示、隐藏

scrollTop:’0px’,’fast’,function;

2.滑动、卷动

前几天在写页面滑动插件的时候,需要在animate后执行回调。如下:

3.淡入、淡出

$.animate({

4.自定义动画

scrollTop:’0px’,’fast’,function(){

5.列队动画方法

//这里的代码执行了两次

6.动画相关方法

$.trigger;}

7.动画全局属性

于是发现,回调内执行了两次。之前一直都没注意到这个问题。

在以前非常长一段时间里,网页上的各种特效还需要採用 flash 在进行。但最近几年里, 我们已经非常少看到这样的情况了,绝大部分已经使用 JavaScript 动画效果来取代 flash。这里 说的代替是网页特效部分,而不是动画。

其原因主要是使用了$ 作为animate的dom,这样做的目的是为了兼容各浏览器。

网页特效比方:渐变菜单、渐进显示、图片轮播等; 而动画比方:故事情节广告、MV  等等。

webkit 内核的浏览器使用body
进行滑动,而其他浏览器则使用html进行滑动。

一.显示、隐藏

这里偷懒的使用了$,虽然解决了兼容性问题,但是却导致animate回调两次的问题。因此该方案并不完美。

jQuery 中显示方法为:.show()。隐藏方法为:.hide()。在无參数的时候。仅仅是硬性的显 示内容和隐藏内容。

于是,可以做下判断,解决兼容性及回调问题:

$(‘.show’).click(function () {             
                      //显示

$($.browser.webkit?”body”:”html”).animate({

$(‘#box’).show();

scrollTop:’0px’,’fast’,function(){

});

$.trigger;

$(‘.hide’).click(function () {             
                        //隐藏

在jquery
1.9版本后,已经不支持$.browser.webkit的方法进行浏览器类型检测了,需要的话,自己通过ua判断下即可。

$(‘#box’).hide();

});

注意:.hide()方法其实就是在行内设置 CSS 代码:display:none; 而.show()方法要根据原 来元素是区块还是内联来决定。假设是区块,则设置 CSS 代码:display:block; 如果是内联, 则设置 CSS 代码:display:inline;。

在.show()和.hide()方法可以传递一个參数,这个參数以毫秒(1000 毫秒等于 1 秒钟)来控 制速度。

而且里面富含了匀速变大变小,以及透明度变换。

$(‘.show’).click(function () {

$(‘#box’).show(1000);                    
                 //显示用了 1 秒

});

$(‘.hide’).click(function () {

$(‘#box’).hide(1000);                    
                   //隐藏用了 1 秒

});

除了直接使用毫秒来控制速度外。jQuery 还提供了三种预设速度參数字符串:slow、

normal 和 fast。分别对应 600 毫秒、400 毫秒和 200 毫秒。

$(‘.show’).click(function () {

$(‘#box’).show(‘fast’);                  
                   //200 毫秒

});

$(‘.hide’).click(function () {

$(‘#box’).hide(‘slow’);                  
                    //600 毫秒

});

注意:不管是传递毫秒数还是传递预设字符串,如果不小心传递错误或者传递空字符串。 那么它将採用默认值:400 毫秒。

$(‘.show’).click(function () {

$(‘#box’).show(”);                      
                     //默认 400 毫秒

});

//使用.show()和.hide()的回调函数,可以实现列队动画效果。

$(‘.show’).click(function () {

$(‘#box’).show(‘slow’, function () {

alert(‘动画持续完毕后。执行我!

‘);

});

});

//列队动画。使用函数名调用自身

$(‘.show’).click(function () {

$(‘div’).first().show(‘fast’,
function showSpan() {

$(this).next().show(‘fast’, showSpan);

});

});

//列队动画。使用 arguments.callee 匿名函数自调用

$(‘.hide’).click(function () {

$(‘div’).last().hide(‘fast’, function() {

$(this).prev().hide(‘fast’, arguments.callee);

});

});

我们在使用.show()和.hide()的时候,如果需要一个按钮切换操作。需要进行一些条件判

断。而 jQuery 提供给我们一个类似功能的独立方法:.toggle()。

$(‘.toggle’).click(function () {

$(this).toggle(‘slow’);

});

二.滑动、卷动

jQuery 提供了一组改变元素高度的方法:.slideUp()、.slideDown()和.slideToggle()。顾名 思义,向上收缩(卷动)和向下展开(滑动)。

$(‘.down’).click(function () {

$(‘#box’).slideDown();

});

$(‘.up’).click(function () {

$(‘#box’).slideUp();

});

$(‘.toggle’).click(function () {

$(‘#box’).slideToggle();

});

注意:滑动、卷动效果和显示、隐藏效果一样,具有相同的參数。 三.淡入、淡出

jQuery 提供了一组专门用于透明度变化的方法:.fadeIn()和.fadeOut(),分别表示淡入、

淡出,当然还有一个自动切换的方法:.fadeToggle()。

$(‘.in’).click(function () {

$(‘#box’).fadeIn(‘slow’);

});

$(‘.out’).click(function () {

$(‘#box’).fadeOut(‘slow’);

});

$(‘.toggle’).click(function () {

$(‘#box’).fadeToggle();

});

 上面三个透明度方法仅仅能是从 0 到 100,或者从 100 到 0。如果我们想设置指定值就没 有办法了。而 jQuery 为了解决这个问题提供了.fadeTo()方法。

$(‘.toggle’).click(function () {

$(‘#box’).fadeTo(‘slow’, 0.33);          
         //0.33 表示值为 33

});

注意:淡入、淡出效果和显示、隐藏效果一样,具有相同的參数。

对于.fadeTo()方法。 如果本身透明度大于指定值,会淡出,否则相反。

四.自己定义动画

jQuery 提供了几种简单常用的固定动画方面我们使用。但有些时候。这些简单动画无法 满足我们更加复杂的需求。这个时候,jQuery 提供了一个.animate()方法来创建我们的自定

义动画,满足更多复杂多变的要求。

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘width’ : ‘300px’,

‘height’ : ‘200px’,

‘fontSize’ : ’50px’,

‘opacity’ : 0.5

});

});

注意:一个 CSS 变化就是一个动画效果。上面的例子中,已经有四个 CSS 变化,已经

实现了多重动画同步运动的效果。

必传的參数仅仅有一个。就是一个键值对 CSS 变化样式的对象。

还有两个可选參数分别 为速度和回调函数。

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘width’ : ‘300px’,

‘height’ : ‘200px’

}, 1000, function () {

alert(‘动画执行完毕执行我!

‘); 

});

});

到目前位置,我们都是创建的固定位置不动的动画。如果想要实现运动状态的位移动画,

那就必须使用自定义动画,并且结合 CSS 的绝对定位功能。

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘top’ : ‘300px’,                             
             //先必须设置 CSS 绝对定位

‘left’ : ‘200px’

});

});

自定义动画中,每次开始运动都必须是初始位置或初始状态,而有时我们想通过当前位

置或状态下再进行动画。jQuery 提供了自定义动画的累加、累减功能。

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘left’ : ‘+=100px’,

});

}); 

自定义实现列队动画的方式,有两种:1.在回调函数中再执行一个动画。2.通过连缀或

顺序来实现列队动画。

//通过依次顺序实现列队动画

$(‘.animate’).click(function () {

$(‘#box’).animate({‘left’ : ‘100px’});

$(‘#box’).animate({‘top’ : ‘100px’});

$(‘#box’).animate({‘width’ : ‘300px’});

});

注意:如果不是同一个元素,就会实现同步动画

//通过连缀实现列队动画

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘left’ : ‘100px’

}).animate({

‘top’ : ‘100px’

}).animate({

‘width’ : ‘300px’

});

}); 

//通过回调函数实现列队动画

塞班岛贵宾会,$(‘.animate’).click(function () {

$(‘#box’).animate({

‘left’ : ‘100px’

}, function () {

$(‘#box’).animate({

‘top’ : ‘100px’

}, function () {

$(‘#box’).animate({

‘width’ : ‘300px’ 

});

}); 

});

});

五.列队动画方法

之前我们已经可以实现列队动画了,如果是同一个元素,可以依次顺序或连缀调用。如 果是不同元素,能够使用回调函数。但有时列队动画太多,回调函数的可读性大大减少。为 此。jQuery 提供了一组专门用于列队动画的方法。

//连缀无法实现按顺序列队

$(‘#box’).slideUp(‘slow’).slideDown(‘slow’).css(‘background’, ‘orange’);

注意:如果动画方法,连缀可以实依次列队。而.css()方法不是动画方法。会在一开始 传入列队之前。

那么,能够採用动画方法的回调函数来解决。

//使用回调函数。强行将.css()方法排队到.slideDown()之后

$(‘#box’).slideUp(‘slow’).slideDown(‘slow’, function ()
{

$(this).css(‘background’, ‘orange’);

});

但如果这样的话。当列队动画繁多的时候。可读性不但下降,而原本的动画方法不够清 晰。所以,我们的想法是每一个操作都是自己独立的方法。那么 jQuery 提供了一个类似于回 调函数的方法:.queue()。

//使用.queue()方法模拟动画方法跟随动画方法之后

$(‘#box’).slideUp(‘slow’).slideDown(‘slow’).queue(function ()
{

$(this).css(‘background’, ‘orange’);

}); 

现在,我们想继续在.queue()方法后面再增加一个隐藏动画,这时发现居然无法实现。 这是.queue()特性导致的。

有两种方法可以解决这个问题,jQuery 的.queue()的回调函数可以 传递一个參数。这个參数是 next 函数,在结尾处调用这个 next()方法即可再连缀执行列队动 画。

//使用 next 參数来实现继续调用列队动画

$(‘#box’).slideUp(‘slow’).slideDown(‘slow’).queue(function (next) {

$(this).css(‘background’, ‘orange’);

next();

}).hide(‘slow’);

 因为 next 函数是 jQuery1.4 版本以后才出现的,而之前我们普遍使用的是.dequeue()方法。 意思为运行下一个元素列队中的函数。

//使用.dequeue()方法执行下一个函数动画

$(‘#box’).slideUp(‘slow’).slideDown(‘slow’).queue(function ()
{

$(this).css(‘background’, ‘orange’);

$(this).dequeue();

}).hide(‘slow’);

如果採用顺序调用,那么使用列队动画方法,就非常清晰了,每一段代表一个列队,而 回调函数的嵌套就会杂乱无章。

//使用顺序调用的列队,逐个执行,非常清晰

$(‘#box’).slideUp(‘slow’);

$(‘#box’).slideDown(‘slow’);

$(‘#box’).queue(function () {

$(this).css(‘background’, ‘orange’);

$(this).dequeue();

})

$(‘#box’).hide(‘slow’);

.queue()方法还有一个功能,就是可以得到当前动画个列队的长度。

当然。这个用法在 普通 Web开发中用的比较少,我们这里不做详细探讨。

//获取当前列队的长度。fx 是默认列队的參数

function count() {

return $(“#box”).queue(‘fx’).length;

}

//在某个动画处调用

$(‘#box’).slideDown(‘slow’, function ()
{alert(count());});

jQuery 还提供了一个清理列队的功能方法:.clearQueue()。

把它放入一个列队的回调函 数或.queue()方法里,就可以把剩下为执行的列队给移除。

//清理动画列队

$(‘#box’).slideDown(‘slow’, function ()
{$(this).clearQueue()});

六.动画相关方法

非常多时候需要停止正在运行中的动画。jQuery 为此提供了一个.stop()方法。它有两个可 选參数:.stop(clearQueue, gotoEnd);clearQueue 传递一个布尔值,代表是否清空未执行完的 动画列队,gotoEnd 代表是否直接将正在执行的动画跳转到末状态。

//强制停止运行中的

$(‘.stop’).click(function () {

$(‘#box’).stop();

});

//带參数的强制运行

$(‘.animate’).click(function () {

$(‘#box’).animate({

‘left’ : ‘300px’

}, 1000);

$(‘#box’).animate({

‘bottom’ : ‘300px’

}, 1000);

$(‘#box’).animate({

‘width’ : ‘300px’

}, 1000);

$(‘#box’).animate({

‘height’ : ‘300px’

}, 1000);

}); 

$(‘.stop’).click(function () {

$(‘#box’).stop(true ,true);

});

注意:第一个參数表示是否取消列队动画,默认为 false。

如果參数为 true,当有列队动 画的时候。会取消后面的列队动画。第二參数表示是否到达当前动画结尾,默觉得 false。 如果參数为 true,则停止后立即到达末尾处。

 

有时在执行动画或列队动画时。需要在运动之前有延迟执行,jQuery 为此提供了.delay()

方法。

这个方法可以在动画之前设置延迟,也可以在列队动画中间加上。

//开始延迟 1 秒钟,中间延迟 1 秒

$(‘.animate’).click(function () {

$(‘#box’).delay(1000).animate({

‘left’ : ‘300px’

}, 1000);

$(‘#box’).animate({

‘bottom’ : ‘300px’

}, 1000);

$(‘#box’).delay(1000).animate({

‘width’ : ‘300px’

}, 1000);

$(‘#box’).animate({

‘height’ : ‘300px’

}, 1000);

}); 

在选择器的基础章节中,我们提到过一个过滤器:animated,这个过滤器可以判断出当前 运动的动画是哪个元素。通过这个特点,我们能够避免因为用户高速在某个元素运行动画时, 因为动画积累而导致的动画和用户的行为不一致。

//递归执行自我,无线循环播放

$(‘#box’).slideToggle(‘slow’, function ()
{

$(this).slideToggle(‘slow’, arguments.callee);

});

//停止正在运动的动画。并且设置红色背景

$(‘.button’).click(function(){

$(‘div:animated’).stop().css(‘background’, ‘red’);

});

六.动画全局属性

jQuery 提供了两种全局设置的属性。分别为:$.fx.interval,设置每秒运行的帧数;$.fx.off, 关闭页面上全部的动画。

$.fx.interval 属性可以调整动画每秒的运行帧数,默认为 13 毫秒。数字越小越流畅,但 可能影响浏览器性能。

//设置运行帧数为 1000 毫秒

$.fx.interval = 1000;                      
                         //默认为 13 

$(‘.button’).click(function () {

$(‘#box’).toggle(3000);

});

$.fx.off 属性可以关闭所有动画效果,在非常低端的浏览器。动画可能会出现各种异常

问题导致错误。而 jQuery 设置这个属性,就是用于关闭动画效果的。

//设置动画为关闭 true

$.fx.off = true;                          
                             //默认为 false

补充:在.animate()方法中,还有一个參数,easing 运动方式。这个參数。大部分參数值 需要通过插件来使用。在后面的课程中。会具体解说。自带的參数有两个:swing(缓动)、 linear(匀速),默认为swing。

$(‘.button’).click(function () {

$(‘#box’).animate({

left : ‘800px’

}, ‘slow’, ‘swing’);

$(‘#pox’).animate({

left : ‘800px’

}, ‘slow’, ‘linear’);

});

发表评论

电子邮件地址不会被公开。 必填项已用*标注