DIV CSS 佈局教程網

8.5 自定義動畫
編輯:jQuery基礎知識     

在前幾節,我們接觸了以下3種動畫:

  • (1)顯示和隱藏;
  • (2)淡入和淡出;
  • (3)滑上和滑下;

但是我們在浏覽網頁中經常還看到其他動畫形式,例如層不斷移動、層不斷擴大等。這些各種各樣的動畫,如果單純地用上面這3種動畫形式就無法實現了。

由於這3種動畫的形式是固定的,很多情況下無法滿足開發者對動畫設計的各種需求。在jQuery中,還提供了一種“自定義動畫”來幫助我們設計各種各樣的動畫。

一、簡單動畫

在jQuery中,對於自定義動畫,我們可以使用animate()方法來實現。

jQuery動畫其實就是通過將元素的某一個屬性從“一個屬性值”在指定時間內平滑地過渡到“另外一個屬性值”來實現動畫效果(大家仔細理解這句話,就能很深刻地理解jQuery動畫的本質,非常重要)。jQuery動畫原理跟CSS3動畫原理是一樣的。對於CSS3動畫,可以關注我們的CSS3教程。

語法:

 
$().animate(params , speed , callback)

說明:

params,必選參數,表示“屬性:值”列表,也就是元素在動畫中變化的屬性列表(具體形式,參考下面幾個例子);

speed,可選參數,表示動畫的速度,單位為毫秒,默認值為200毫秒。如果參數省略,則采用默認速度;

callback,可選參數,表示動畫完成之後執行的函數(即回調函數)。

舉例:

在線測試
 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        #lvye
        {
            display:inline-block;   /*將塊元素轉換為行內塊元素*/
            width:30px;
            height:30px;
            border:1px solid orange;
            background-color:#FFE7B7;
        }
    </style>
    <script type="text/javascript" src="../App_js/jquery-1.12.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#lvye").click(function () {
                $(this).animate({ "width": "100px","height":"100px"}, 1000);
            })
        })
    </script>
</head>
<body>
    <div id="lvye"></div>
</body>
</html>

默認情況下,在浏覽器預覽效果如下:

當我們點擊div元素後,在浏覽器預覽效果如下:

分析:

從例子可以看出,animate()方法的params參數是以鍵值對的形式存在,語法如下:

 
{"屬性1":"屬性值1","屬性2":"屬性值2",……, "屬性n":"屬性值n"}

這種鍵值對的形式非常的簡單,也非常有用,在我們以後編程生涯中也會大量接觸到,例如JSON對象、JavaScript對象、Session、cookie等地方都會涉及,建議大家要認真體會一下這種數據格式。

在上面例子的基礎上,如果我們還想同時將背景顏色改變為紅色,很自然我們寫下了如下jQuery代碼:

 
$("#lvye").click(function () {
    $(this).animate({ "width": "100px","height":"100px","background-color":"red"}, 1000);
})

納尼?當我們測試的時候,居然背景顏色沒有改變?再審查一遍也沒有發現什麼錯誤啊,那究竟是什麼回事呢?其實像這種bug,新人是很難找到答案。

你沒錯,是jquery錯了!oh,shit,jquery自己都有錯?站長你逗我?

沒逗大家,jquery庫源碼本身有一個缺陷,就是在調用animate()方法的時候無法識別color、background-color和border-color這些顏色屬性。因此我們還需要引入一個jquery.color.js(本文底部提供下載)來修復這個bug。最終代碼如下:

在線測試
 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        #lvye
        {
            display:inline-block;   /*將塊元素轉換為行內塊元素*/
            width:30px;
            height:30px;
            border:1px solid orange;
            background-color:#FFE7B7;
        }
    </style>
    <script type="text/javascript" src="../App_js/jquery-1.12.0.min.js"></script>
    <script type="text/javascript" src="../App_js/jquery.color.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#lvye").click(function () {
                $(this).animate({ "width": "100px", "height": "100px" ,"background-color":"red"}, 1000)
            })
        })
    </script>
</head>
<body>
    <div id="lvye"></div>
</body>
</html>

默認情況下,在浏覽器預覽效果如下:

當我們點擊div元素後,在浏覽器預覽效果如下:

分析:

使用jquery.color.js這個文件就可以完美解決animate()方法無法識別color和background-color、border-color等顏色屬性值的問題。

此外,讀者朋友們還需要注意一點:由於jquery.color.js是依賴jQuery庫而存在的,因此jquery.color.js文件必須放在jquery.1.12.0.min.js(jQuery庫文件)後面引入,不然同樣無效。

二、累積動畫

在上面的代碼中,我們設置了{"width":"100px"}作為動畫參數。如果我們在100px之前加上“+=”,這種形式則表示以元素本身的width為基點進行“累加”;如果我們在100px之前加上“-=”則表示以元素本身的width為基點進行“累減”。

舉例:

在線測試
 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        #simple,#sum
        {
            display:inline-block;   /*將塊元素轉換為行內塊元素*/
            width:30px;
            height:30px;
            border:1px solid orange;
            background-color:#FFE7B7;
        }
    </style>
    <script type="text/javascript" src="../App_js/jquery-1.12.0.min.js"></script>
    <script type="text/javascript" src="../App_js/jquery.color.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn-simple").click(function () {
                $("#simple").animate({ "width": "100px", "height": "100px" }, 1000);
            })
            $("#btn-sum").click(function () {
                $("#sum").animate({ "width": "+=100px", "height": "+=100px" }, 1000);
            })
        })
    </script>
</head>
<body>
    <div id="simple"></div>
    <input id="btn-simple" type="button" value="簡單動畫" /><br />
    <div id="sum"></div>
    <input id="btn-sum" type="button" value="累加動畫" />
</body>
</html>

默認情況下,在浏覽器預覽效果如下:

當我們點擊兩個按鈕之後,在浏覽器預覽效果如下:

分析:

animate({ "width": "100px", "height": "100px" }由於是簡單動畫,使得元素最終的width為100px,height為100px;

animate({ "width": "+=100px", "height": "+=100px" }由於是累加動畫,使得元素最終的width為130px,height為130px。

從上面這個例子,我們可以很直觀地看出了簡單動畫與累積動畫的不同。簡單動畫只是給定了元素屬性的最終值,而累積動畫是在元素屬性的基礎上的增加和減少。此外,如果我們多次點擊“累加動畫”按鈕之後,會發現這個動畫效果是不斷累加的,大家可以在測試工具裡面嘗試操作一下。

三、回調函數

在了解回調函數之前,我們先來看一個例子。如果我們想要在簡單動畫那個例子中,在動畫“執行完成之後”(看清楚)再調用CSS()方法來添加一個邊框,該如何實現呢?有些同學可能就會寫下如下代碼:

舉例:

在線測試
 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        #lvye
        {
            display:inline-block;   /*將塊元素轉換為行內塊元素*/
            width:30px;
            height:30px;
            border:1px solid orange;
            background-color:#FFE7B7;
        }
    </style>
    <script type="text/javascript" src="../App_js/jquery-1.12.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#lvye").click(function () {
                $(this).animate({ "width": "100px", "height": "100px" }, 1000).css("border", "5px solid red");
            })
        })
    </script>
</head>
<body>
    <div id="lvye"></div>
</body>
</html>

默認情況下,在浏覽器預覽效果如下:

當我們點擊div元素後,在浏覽器預覽效果如下:

分析:

我們會發現,當我們點擊的一瞬間,div元素就已經被添加了一個邊框。也就說,剛剛執行動畫的時候,css()方法就被執行了。這個跟我們預期效果完全不一樣!出現這個問題的原因是css()方法並不會加入到“動畫隊列”中,而是立即執行。

如果想要在動畫執行完成之後再實現某些操作,我們就需要用到了animate()方法中的回調函數。

舉例:固定欄目

在線測試
 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        #lvye
        {
            display:inline-block;   /*將塊元素轉換為行內塊元素*/
            width:30px;
            height:30px;
            border:1px solid orange;
            background-color:#FFE7B7;
        }
    </style>
    <script type="text/javascript" src="../App_js/jquery-1.12.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#lvye").click(function () {
                $(this).animate({ "width": "100px", "height": "100px" }, 1000, function () {
                    $(this).css("border", "5px solid red");
                });
            })
        })
    </script>
</head>
<body>
    <div id="lvye"></div>
</body>
</html>

默認情況下,在浏覽器預覽效果如下:

當我們點擊div元素後,在浏覽器預覽效果如下:

分析:

使用了回調函數,我們就實現了預期的效果:動畫“執行完成之後”再調用CSS()方法來添加一個邊框。

回調函數不僅適用於animate()方法,也適用於jQuery所有的動畫效果方法。回調函數在jQuery中大量存在,在之前我們也有過接觸。所謂的回調函數說白了,就是在某個方法執行完成之後的“附加操作”。當然在jQuery動畫中,回調函數用得不多,大家不必擔心。

不過呢,回調函數這個概念極其重要,大家要認真理解好,知道是怎麼一回事。在後面的課程例如ajax等也會經常接觸。

文件下載

jquery.color.js

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved