jquery自定義動畫animate()

在以前很長一段時間裏,網頁上的各種特效還需要採用flash 在進行。但最近幾年裏,我們已經很少看到這種情況了,絕大部分已經使用JavaScript 動畫效果來取代flash。這裏
說的取代是網頁特效部分,而不是動畫。網頁特效比如:漸變菜單、漸進顯示、圖片輪播等;而動畫比如:故事情節廣告、MV 等等。


如果複製當前代碼進行在本地測試的時候,請注意把不需要(其他功能展示)的代碼註釋掉。

[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <!DOCTYPE html>  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.     <title></title>  
  6.     <script src="jquery-1.11.2.js"></script>  
  7.     <style type="text/css">  
  8.         #box {  
  9.             width: 100px;  
  10.             height: 100px;  
  11.             background-color: red;  
  12.   
  13.             position:absolute;  
  14.         }  
  15.  
  16.         #pox {  
  17.             width: 100px;  
  18.             height: 100px;  
  19.             background-color: green;  
  20.             position: absolute;  
  21.             top: 200px;  
  22.         }  
  23.     </style>  
  24. </head>  
  25. <body>  
  26.     <input type="button" class="button" value="開始" /><input type="button" class="stop" value="停止" />  
  27.     <input type="button" class="ani" value="查找運動中的動畫" />  
  28.       
  29.     <div id="box">box</div>  
  30.     <div id="pox">pox</div>  
  31. </body>  
  32. </html>  
  33. <script type="text/javascript">  
  34.     $(function () {  
  35.           
  36.         $(".button").click(function () {  
  37.             $("#box").animate({  
  38.                 left: "300px"    //要想使用left top bottom  right這種方向性的屬性 先必須對"#box元素設置CSS 絕對定位  
  39.             })  
  40.         })  
  41.   
  42.   
  43.         //自定義動畫中,每次開始運動都必須是初始位置或初始狀態,而有時我們想通過當前位置或狀態下再進行動畫。jQuery 提供了自定義動畫的累加、累減功能。  
  44.         $(".button").click(function () {  
  45.             $("#box").animate({  
  46.                 left: "+=50px"  //每點擊一次.button按鈕,#box元素就往左移動50px  
  47.             })  
  48.         })  
  49.           
  50.   
  51.         //-------------------------------------同步動畫   
  52.   
  53.   
  54.   
  55.   
  56.         //一個CSS 變化就是一個動畫效果,下面的例子中,已經有四個CSS 變化(分別是width,height,opacity,fontSize的變化)實現了多重動畫同步運動的效果。(所謂多重同步運動的效果就是,這四個css屬性的值在同一時間,同時變化)  
  57.           
  58.         $(".button").click(function () {  
  59.             $("#box").animate({  
  60.                 width: "300px",  
  61.                 height: "200px",  
  62.                 opacity:0.5, //透明度爲0.5  注:透明度的值在0-1之間  
  63.                 fontSize:"200px"//字體大小設爲30px  
  64.             }) //第一個參數:是一個對象,他是鍵值對的css  
  65.         })  
  66.   
  67.   
  68.   
  69.         //--------------------------------------列隊動畫   
  70.   
  71.   
  72.   
  73.         //通過回調函數現實隊列動畫。(效果就是:首先#box的寬度變爲300px 然後高度變爲200px,然後透明度變爲50%,字體大小變爲150px 最後彈出一個“完畢”)  
  74.         $(".button").click(function () {  
  75.             $("#box").animate({ width: "300px"}, 1000, function(){  
  76.                 $("#box").animate({height:"200px"},1000,function(){  
  77.                     $("#box").animate({opacity:0.5},1000,function(){  
  78.                         $("#box").animate({fontSize:"150px"},1000,function(){alert("完畢")})  
  79.                     });  
  80.                 });  
  81.             });  
  82.         })  
  83.   
  84.         //在同一個元素的基礎上,使用鏈式調用也可以實現列隊動畫  
  85.         $(".button").click(function () {  
  86.             $("#box")  
  87.                 .animate({ width: "300px" }, 1000)  
  88.                 .animate({ height: "200px" }, 1000)  
  89.                 .animate({ opacity: 0.5 }, 1000)  
  90.                 .animate({ fontSize: "150px" }, 1000, function () { alert("列隊動畫執行完畢")})  
  91.         });  
  92.   
  93.         //在同一個元素的基礎上,通過依次順序實現列隊動畫 (如果有多個元素則不能實現,兩個元素之間的動畫是同步的。)  
  94.         $(".button").click(function () {  
  95.             $("#box").animate({ width: "300px" }, 1000);  
  96.             $("#box").animate({ height: "200px" }, 1000);  
  97.             $("#box").animate({ opacity: 0.5 }, 1000);  
  98.             $("#box").animate({ fontSize: "150px" }, 1000, function () { alert("列隊動畫執行完畢")});  
  99.   
  100.         })  
  101.   
  102.         //如果有多個元素則不能實現 不信請看下面代碼  (通過執行下面這段代碼,我們發現#box 與#pox這兩個元素的動畫是同時執行的,屬於#box的那兩段動畫是先執行 $("#box").animate({ width: "300px" }, 1000)然後再執行("#box").animate({ opacity: 0.5 }, 1000); 他們兩個有列隊動畫的效果) 而屬於#pox的兩段動畫是先執行 $("#pox").animate({ height: "200px" }, 1000)然後再執行 $("#pox").animate({ fontSize: "150px" }, 1000)他們兩個有列隊動畫的效果。 但是 $("#box").animate({ width: "300px" }, 1000)與$("#pox").animate({ height: "200px" }, 1000); 同時執行的。 $("#box").animate({ opacity: 0.5 }, 1000)與$("#pox").animate({ fontSize: "150px" }, 1000)是同時執行的。  
  103.         //前面說了這麼一大堆 其實就是:  
  104.         //#box的第一條和第三條是列隊動畫  
  105.         //#pox的第二條和第四條是列隊動畫  
  106.   
  107.         //#box的第一條和#pox的第二條是同步動畫  
  108.         //#box的第三條和#pox的第四條是同步動畫  
  109.   
  110.         $(".button").click(function () {  
  111.             $("#box").animate({ width: "300px" }, 1000);  
  112.             $("#pox").animate({ height: "200px" }, 1000);  
  113.             $("#box").animate({ opacity: 0.5 }, 1000);  
  114.             $("#pox").animate({ fontSize: "150px" }, 1000, function () { alert("列隊動畫執行完畢")});  
  115.         })  
  116.   
  117.   
  118.         //那我們現在的需求是:不管你有幾個元素,我都要他們依次實現列隊動畫效果。(測試了一下,只能用這種回調函數嵌套的方式來實現了)  
  119.   
  120.         $(".button").click(function () {  
  121.             $("#box").animate({ width: "300px" }, 1000, function () {  
  122.                 $("#pox").animate({ height: "200px" }, 1000, function () {  
  123.                     $("#box").animate({ height: "200px"}, 1000, function () {  
  124.                         $("#pox").animate({ fontSize: "150px" }, 1000, function () { alert("列隊動畫執行完畢") });  
  125.                     })  
  126.                 })  
  127.             })  
  128.         })  
  129.   
  130.   
  131.   
  132.         // ---------------------------------動畫與非動畫 進行隊列 【queue()】  
  133.   
  134.   
  135.   
  136.   
  137.         //我們知道動畫可以有列隊效果。但是一個普通的css(比如改變背景顏色)如果實現與動畫進行列隊呢?  
  138.         $(".button").click(function () {  
  139.             $("#box").slideUp(1000).slideDown(1000).css("background""yellow")  
  140.         })  
  141.   
  142.         //本來我們是想要實現隊列動畫的,也就是先讓#box滑動隱藏,然後再讓它滑動顯示,最後讓它改變顏色。可是我們運行這段呢代碼,我們看到第一時間就執行了css("background","yellow")這段代碼。  
  143.         //通過上面的代碼我們瞭解到 css()方法不是動畫方法,會和第一個動畫同時執行。也就是說非動畫不能列隊。  
  144.   
  145.         //現在問題又來了。我現在想要實現列隊動畫,也想非動畫和動畫一起列隊怎麼辦呢? 其實我們可以使用回調函數實現的。請看下面的代碼  
  146.   
  147.         $(".button").click(function () {  
  148.             $("#box")  
  149.                 .slideUp(1000)  
  150.                 .slideDown(1000, function () { $(this).css("background""yellow") })  
  151.                 .hide(3000);  
  152.         })  
  153.   
  154.         //但如果上面這樣的話,當列隊動畫繁多的時候,可讀性不但下降,而原本的動畫方法不夠清晰。所以,我們的想法是每個操作都是自己獨立的方法。那麼jQuery 提供了一個類似於回調函數的方法:.queue()  
  155.   
  156.         $(".button").click(function () {   //三個動畫。  
  157.             $("#box")  
  158.                 .slideUp(1000)  
  159.                 .slideDown(1000)  
  160.                 .queue(function () { $(this).css("background""yellow");})  
  161.         })  
  162.   
  163.         //現在,我們想繼續在.queue()方法後面再增加一個隱藏動畫,這時發現居然無法實現。這是.queue()特性導致的。有兩種方法可以解決這個問題,jQuery 的.queue()的回調函數可以傳遞一個參數,這個參數是next 函數,在結尾處調用這個next()方法即可再鏈式執行列隊動畫。  
  164.   
  165.         //鏈式編程實現隊列動畫  
  166.         $(".button").click(function () {  //四個動畫  
  167.             $("#box")  
  168.                 .slideUp(1000)  
  169.                 .slideDown(1000)  
  170.                 .queue(function (next) { //這個next是一個函數  
  171.                     $(this).css("background""yellow");  
  172.                     next();})  
  173.                 .hide(1000);  
  174.         });  
  175.   
  176.         //順序編程實現隊列動畫  我們看到使用順序調用的列隊,逐個執行,非常清晰  
  177.         $(".button").click(function () {  
  178.             $("#box").slideUp(1000);  
  179.             $("#box").slideDown(1000);  
  180.             $("#box").queue(function (next) {  
  181.                 $(this).css("background""yellow");  
  182.                 next(); });  
  183.             $("#box").hide(1000);  
  184.         });  
  185.   
  186.           
  187.   
  188.         //因爲next 函數是jQuery1.4 版本以後纔出現的,而之前我們普遍使用的是.dequeue()方法。意思爲執行下一個元素列隊中的函數。  
  189.         //使用.dequeue()方法執行下一個函數動畫  
  190.         //$(".button").click(function () {  
  191.         //    $('#box').slideUp('slow').slideDown('slow').queue(function () {  
  192.         //        $(this).css('background', 'orange');  
  193.         //        $(this).dequeue(); //相當於上面的那句next() 只是這裏的function()括號裏不像上面那樣需要傳遞一個next函數  
  194.         //    }).hide(1000)  
  195.         //});  
  196.   
  197.   
  198.         //-----------------------------動畫的清除 【clearQueue()】  
  199.   
  200.   
  201.   
  202.         //jQuery 還提供了一個清理列隊的功能方法:.clearQueue()。把它放入一個列隊的回調函 數或.queue()方法裏,就可以把剩下爲執行的列隊給移除。  
  203.   
  204.         //清理動畫列隊  
  205.   
  206.         //假如我想在執行完第二個動畫那就就不再執行了。那麼只要在第二個動畫的回調函數哪裏添加一句$(this).clearQueue()就可以停止後面的列隊動畫了  
  207.         $(".button").click(function () {  
  208.               
  209.             $("#box")  
  210.                 .slideUp(1000)  
  211.                 .slideDown(1000, function () { $(this).clearQueue() })  
  212.                 .queue(function (next) { $(this).css("background""yellow"); next() })  
  213.                 .hide(1000);  
  214.         })  
  215.   
  216.         //那麼如果獲取列隊動畫的長度呢?    
  217.   
  218.         function getQueueCount() {  
  219.             return $("#box").queue("fx").length;  //獲取當前列隊的長度,fx 是默認列隊的參數  
  220.         }  
  221.           
  222.         //用法  
  223.         $(".button").click(function () {  
  224.   
  225.             //下面這段代碼總共有slideUp,slideDown,queue,hide這四個動畫  
  226.             $("#box")  
  227.                 .slideUp(1000, function () { alert(getQueueCount()) }) //執行到這一步的時候會打印出:4  它後面還有三個動畫,所以下一步的時候會打印出3  
  228.                 .slideDown(1000, function () { alert(getQueueCount()) }) //執行到這一步的時候會打印出:3  
  229.                 .queue(function (next) { alert(getQueueCount()); $(this).css("background""yellow"); next() })  //執行到這一步的時候會打印出:2  
  230.                 .hide(1000, function () { alert(getQueueCount()) }); //執行到這一步的時候會打印出:1  
  231.   
  232.         });  
  233.   
  234.   
  235.      
  236.   
  237.         //---------------------------------動畫的停止【stop()】  
  238.   
  239.   
  240.   
  241.         //很多時候需要停止正在運行中的動畫,jQuery 爲此提供了一個.stop()方法。它有兩個可選參數:.stop(clearQueue, gotoEnd);clearQueue 傳遞一個布爾值,代表是否清空未執行完的動畫列隊,gotoEnd 代表是否直接將正在執行的動畫跳轉到末狀態。  
  242.   
  243.         $(".button").click(function () {  
  244.             $("#box")  
  245.                 .animate({left:"1000px"} ,3000)  
  246.         })  
  247.   
  248.         $(".stop").click(function () {  
  249.             $("#box").stop();  //將#box這個元素的動畫停止掉。沒有參數的stop()方法只是單純的停止動畫  
  250.         })  
  251.    
  252.         //那下面再來了解下,列隊動畫的停止  
  253.          
  254.         $(".button").click(function () {  
  255.             $("#box").animate({ left: "300px" },1000)  
  256.                      .animate({ bottom: "300px" }, 1000)  
  257.                      .animate({ width: "300px" }, 1000)  
  258.                      .animate({ height: "300px" }, 1000)                                     
  259.         })  
  260.   
  261.         //$(".stop").click(function () {  
  262.         //    $("#box").stop();  // 如果用沒有參數的stop()方法去停止有列隊動畫,那麼只會停止掉第一個列隊動畫,後面的列隊動畫會繼續執行。  
  263.         //})  
  264.   
  265.         //那麼現在我想當我點擊停止按鈕的時候,我就需要整個將列隊動畫停止下來,而不是僅僅停止第一個,怎麼辦呢? 答案是:我們可以給stop()方法加參數  
  266.         //stop()方法有兩個可選參數:  
  267.         //第一個可選參數,如果爲true,就代表停止並清除掉後面的隊列動畫。即:動畫完全停止(默認值爲false)  
  268.         //第二個可選參數,如果爲true,就代表停止並清除掉後面的隊列動畫,並且當前動畫會立刻跳轉到當前這條動畫執行完畢的末尾位置(默認爲false)  
  269.         $(".stop").click(function () { $("#box").stop(truetrue); })  
  270.   
  271.   
  272.       
  273.   
  274.         //--------------------------------動畫的延遲【delay()】  
  275.   
  276.   
  277.         $(".button").click(function () {  
  278.             $("#box").delay(2000)        //如果delay(2000) 直接寫在$("#box")元素後面,就表示延遲2秒再執行動畫  
  279.                 .animate({ left: "300px" }, 1000)  
  280.                 .animate({ bottom: "300px" }, 1000)  
  281.                 .animate({ width: "300px" }, 1000).delay(3000) // 寫在這裏表示等animate({ width: "300px" }, 1000)這段代碼執行完後,延遲3秒再執行下面的代碼  
  282.                 .animate({ height: "300px" }, 1000)  
  283.         })  
  284.   
  285.   
  286.   
  287.         //-----------------------------------獲取當前正在執行的動畫 【:animated 過濾器】  
  288.   
  289.   
  290.         $(".button").click(function () {  
  291.             //$("#box").slideUp(1000, function abc() {  
  292.             //    $(this).slideToggle(1000, abc); //無限循環的調用自己。實現動畫不停的執行。  
  293.             //})  
  294.             //或者用這以下這種方式也可以實現 動畫不停的自執行  
  295.             $("#box").slideToggle(1000, function () {  
  296.                 $(this).slideToggle(1000, arguments.callee); //arguments.callee表示調用自身。 和上面那一句是一樣的  
  297.             })  
  298.   
  299.         })  
  300.   
  301.         $(".ani").click(function () {  
  302.             $(":animated").css("background""blue").stop(true); //獲取當前正在執行的動畫,並將它的顏色改爲藍色後停止動畫的執行  
  303.         })  
  304.   
  305.   
  306.   
  307.         //---------------------動畫的全局屬性【$.fx.off屬性可以關閉頁面上所有的動畫】【$.fx.interval屬性可以調整動畫每秒運行的幀數】  
  308.   
  309.         
  310.         //$.fx.interval 屬性用於設置jQuery動畫每隔多少毫秒繪製一幀圖像 (默認爲13 毫秒) 數字越小越流暢,但可能影響瀏覽器性能。  
  311.           
  312.         //$.fx.interval = 100; // 設置動畫繪製一幀幀的時間爲100毫秒,(默認是13毫秒)  
  313.   
  314.         //$.fx.off = true; //關閉頁面上所有的動畫  
  315.          
  316.   
  317.   
  318.         //補充:在.animate()方法中,還有一個參數,easing 運動方式,這個參數,大部分參數值需要通過插件來使用,在後面的課程中,會詳細講解。自帶的參數有兩個:swing(緩動)、linear(勻速),默認爲swing。  
  319.         $('.button').click(function () {  
  320.   
  321.             $('#box').animate({ left: '800px' }, 1000, 'swing'); //swing 表示緩動運行,緩速運動有個特點,就是剛開始運行的慢,到了中間就比較快,最後又慢下來(中間快,兩頭慢)  整段代碼的意思就是在1秒鐘內 以緩動方式運行動畫  
  322.   
  323.             $('#pox').animate({ left: '800px' }, 1000, 'linear'); //linear表示勻速運行,速度一直不變  整段代碼的意思就是在1秒鐘內 以勻速方式運行動畫  
  324.         });  
  325.     });  
  326. </script>  

感謝原作者分享:http://blog.csdn.net/fanbin168/article/details/45062271
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章