學習要點:
1.顯示、隐藏
2.滑動、卷動
3.淡入、淡出
4.自定義動畫
5.列隊動畫方法
6.動畫相關方法
7.動畫全局屬性
在以前非常長一段時間裡,網頁上的各種特效還需要採用 flash 在進行。但最近幾年裡, 我們已經非常少看到這樣的情況了,絕大部分已經使用 javascript 動畫效果來取代 flash。這裡 說的代替是網頁特效部分,而不是動畫。
網頁特效比方:漸變菜單、漸進顯示、圖檔輪播等; 而動畫比方:故事情節廣告、mv 等等。
一.顯示、隐藏
jquery 中顯示方法為:.show()。隐藏方法為:.hide()。在無參數的時候。僅僅是硬性的顯 示内容和隐藏内容。
$('.show').click(function () { //顯示
$('#box').show();
});
$('.hide').click(function () { //隐藏
$('#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 毫秒。
$('#box').show('fast'); //200 毫秒
$('#box').hide('slow'); //600 毫秒
注意:不管是傳遞毫秒數還是傳遞預設字元串,如果不小心傳遞錯誤或者傳遞空字元串。 那麼它将採用預設值:400 毫秒。
$('#box').show(''); //預設 400 毫秒
//使用.show()和.hide()的回調函數,可以實作列隊動畫效果。
$('#box').show('slow', function () {
alert('動畫持續完畢後。執行我!
');
//列隊動畫。使用函數名調用自身
$('div').first().show('fast', function showspan() {
$(this).next().show('fast', showspan);
//列隊動畫。使用 arguments.callee 匿名函數自調用
$('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();
$('#box').slidetoggle();
注意:滑動、卷動效果和顯示、隐藏效果一樣,具有相同的參數。 三.淡入、淡出
jquery 提供了一組專門用于透明度變化的方法:.fadein()和.fadeout(),分别表示淡入、
淡出,當然還有一個自動切換的方法:.fadetoggle()。
$('.in').click(function () {
$('#box').fadein('slow');
$('.out').click(function () {
$('#box').fadeout('slow');
$('#box').fadetoggle();
上面三個透明度方法僅僅能是從 0 到 100,或者從 100 到 0。如果我們想設定指定值就沒 有辦法了。而 jquery 為了解決這個問題提供了.fadeto()方法。
$('#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 變化樣式的對象。
還有兩個可選參數分别 為速度和回調函數。
'height' : '200px'
}, 1000, function () {
alert('動畫執行完畢執行我!
');
到目前位置,我們都是建立的固定位置不動的動畫。如果想要實作運動狀态的位移動畫,
那就必須使用自定義動畫,并且結合 css 的絕對定位功能。
'top' : '300px', //先必須設定 css 絕對定位
'left' : '200px'
自定義動畫中,每次開始運動都必須是初始位置或初始狀态,而有時我們想通過目前位
置或狀态下再進行動畫。jquery 提供了自定義動畫的累加、累減功能。
'left' : '+=100px',
});
自定義實作列隊動畫的方式,有兩種:1.在回調函數中再執行一個動畫。2.通過連綴或
順序來實作列隊動畫。
//通過依次順序實作列隊動畫
$('#box').animate({'left' : '100px'});
$('#box').animate({'top' : '100px'});
$('#box').animate({'width' : '300px'});
注意:如果不是同一個元素,就會實作同步動畫
//通過連綴實作列隊動畫
'left' : '100px'
}).animate({
'top' : '100px'
'width' : '300px'
//通過回調函數實作列隊動畫
}, function () {
'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 () {
現在,我們想繼續在.queue()方法後面再增加一個隐藏動畫,這時發現居然無法實作。 這是.queue()特性導緻的。
有兩種方法可以解決這個問題,jquery 的.queue()的回調函數可以 傳遞一個參數。這個參數是 next 函數,在結尾處調用這個 next()方法即可再連綴執行列隊動 畫。
//使用 next 參數來實作繼續調用列隊動畫
$('#box').slideup('slow').slidedown('slow').queue(function (next) {
next();
}).hide('slow');
因為 next 函數是 jquery1.4 版本以後才出現的,而之前我們普遍使用的是.dequeue()方法。 意思為運作下一個元素列隊中的函數。
//使用.dequeue()方法執行下一個函數動畫
$(this).dequeue();
如果採用順序調用,那麼使用列隊動畫方法,就非常清晰了,每一段代表一個列隊,而 回調函數的嵌套就會雜亂無章。
//使用順序調用的列隊,逐個執行,非常清晰
$('#box').slideup('slow');
$('#box').slidedown('slow');
$('#box').queue(function () {
})
$('#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();
//帶參數的強制運作
'left' : '300px'
}, 1000);
'bottom' : '300px'
'height' : '300px'
$('#box').stop(true ,true);
注意:第一個參數表示是否取消列隊動畫,預設為 false。
如果參數為 true,當有列隊動 畫的時候。會取消後面的列隊動畫。第二參數表示是否到達目前動畫結尾,默覺得 false。 如果參數為 true,則停止後立即到達末尾處。
有時在執行動畫或列隊動畫時。需要在運動之前有延遲執行,jquery 為此提供了.delay()
方法。
這個方法可以在動畫之前設定延遲,也可以在列隊動畫中間加上。
//開始延遲 1 秒鐘,中間延遲 1 秒
$('#box').delay(1000).animate({
在選擇器的基礎章節中,我們提到過一個過濾器: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。
left : '800px'
}, 'slow', 'swing');
$('#pox').animate({
}, 'slow', 'linear');