深入理解jquery自定義動(dòng)畫(huà)animate()
來(lái)源:易賢網(wǎng) 閱讀:1173 次 日期:2016-06-23 16:40:12
溫馨提示:易賢網(wǎng)小編為您整理了“深入理解jquery自定義動(dòng)畫(huà)animate()”,方便廣大網(wǎng)友查閱!

下面小編就為大家?guī)?lái)一篇深入理解jquery自定義動(dòng)畫(huà)animate()。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。

在以前很長(zhǎng)一段時(shí)間里,網(wǎng)頁(yè)上的各種特效還需要采用flash 在進(jìn)行。但最近幾年里,我們已經(jīng)很少看到這種情況了,絕大部分已經(jīng)使用JavaScript 動(dòng)畫(huà)效果來(lái)取代flash。

這里說(shuō)的取代是網(wǎng)頁(yè)特效部分,而不是動(dòng)畫(huà)。網(wǎng)頁(yè)特效比如:漸變菜單、漸進(jìn)顯示、圖片輪播等;而動(dòng)畫(huà)比如:故事情節(jié)廣告、MV 等等。 

如果復(fù)制當(dāng)前代碼進(jìn)行在本地測(cè)試的時(shí)候,請(qǐng)注意把不需要(其他功能展示)的代碼注釋掉。

代碼如下:

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

  <title></title> 

  <script src="jquery-1.11.2.js"></script> 

  <style type="text/css"> 

    #box { 

      width: 100px; 

      height: 100px; 

      background-color: red; 

      position:absolute; 

    } 

    #pox { 

      width: 100px; 

      height: 100px; 

      background-color: green; 

      position: absolute; 

      top: 200px; 

    } 

  </style> 

</head> 

<body> 

  <input type="button" class="button" value="開(kāi)始" /><input type="button" class="stop" value="停止" /> 

  <input type="button" class="ani" value="查找運(yùn)動(dòng)中的動(dòng)畫(huà)" /> 

  <div id="box">box</div> 

  <div id="pox">pox</div> 

</body> 

</html> 

<script type="text/javascript"> 

  $(function () { 

    $(".button").click(function () { 

      $("#box").animate({ 

        left: "300px"  //要想使用left top bottom right這種方向性的屬性 先必須對(duì)"#box元素設(shè)置CSS 絕對(duì)定位 

      }) 

    }) 

    //自定義動(dòng)畫(huà)中,每次開(kāi)始運(yùn)動(dòng)都必須是初始位置或初始狀態(tài),而有時(shí)我們想通過(guò)當(dāng)前位置或狀態(tài)下再進(jìn)行動(dòng)畫(huà)。jQuery 提供了自定義動(dòng)畫(huà)的累加、累減功能。 

    $(".button").click(function () { 

      $("#box").animate({ 

        left: "+=50px" //每點(diǎn)擊一次.button按鈕,#box元素就往左移動(dòng)50px 

      }) 

    }) 

    //-------------------------------------同步動(dòng)畫(huà)  

    //一個(gè)CSS 變化就是一個(gè)動(dòng)畫(huà)效果,下面的例子中,已經(jīng)有四個(gè)CSS 變化(分別是width,height,opacity,fontSize的變化)實(shí)現(xiàn)了多重動(dòng)畫(huà)同步運(yùn)動(dòng)的效果。(所謂多重同步運(yùn)動(dòng)的效果就是,這四個(gè)css屬性的值在同一時(shí)間,同時(shí)變化) 

    $(".button").click(function () { 

      $("#box").animate({ 

        width: "300px", 

        height: "200px", 

        opacity:0.5, //透明度為0.5 注:透明度的值在0-1之間 

        fontSize:"200px", //字體大小設(shè)為30px 

      }) //第一個(gè)參數(shù):是一個(gè)對(duì)象,他是鍵值對(duì)的css 

    }) 

    //--------------------------------------列隊(duì)動(dòng)畫(huà)  

    //通過(guò)回調(diào)函數(shù)現(xiàn)實(shí)隊(duì)列動(dòng)畫(huà)。(效果就是:首先#box的寬度變?yōu)?00px 然后高度變?yōu)?00px,然后透明度變?yōu)?0%,字體大小變?yōu)?50px 最后彈出一個(gè)“完畢”) 

    $(".button").click(function () { 

      $("#box").animate({ width: "300px"}, 1000, function(){ 

        $("#box").animate({height:"200px"},1000,function(){ 

          $("#box").animate({opacity:0.5},1000,function(){ 

            $("#box").animate({fontSize:"150px"},1000,function(){alert("完畢")}) 

          }); 

        }); 

      }); 

    }) 

    //在同一個(gè)元素的基礎(chǔ)上,使用鏈?zhǔn)秸{(diào)用也可以實(shí)現(xiàn)列隊(duì)動(dòng)畫(huà) 

    $(".button").click(function () { 

      $("#box") 

        .animate({ width: "300px" }, 1000) 

        .animate({ height: "200px" }, 1000) 

        .animate({ opacity: 0.5 }, 1000) 

        .animate({ fontSize: "150px" }, 1000, function () { alert("列隊(duì)動(dòng)畫(huà)執(zhí)行完畢")}) 

    }); 

    //在同一個(gè)元素的基礎(chǔ)上,通過(guò)依次順序?qū)崿F(xiàn)列隊(duì)動(dòng)畫(huà) (如果有多個(gè)元素則不能實(shí)現(xiàn),兩個(gè)元素之間的動(dòng)畫(huà)是同步的。) 

    $(".button").click(function () { 

      $("#box").animate({ width: "300px" }, 1000); 

      $("#box").animate({ height: "200px" }, 1000); 

      $("#box").animate({ opacity: 0.5 }, 1000); 

      $("#box").animate({ fontSize: "150px" }, 1000, function () { alert("列隊(duì)動(dòng)畫(huà)執(zhí)行完畢")}); 

    }) 

    //如果有多個(gè)元素則不能實(shí)現(xiàn) 不信請(qǐng)看下面代碼 (通過(guò)執(zhí)行下面這段代碼,我們發(fā)現(xiàn)#box 與#pox這兩個(gè)元素的動(dòng)畫(huà)是同時(shí)執(zhí)行的,屬于#box的那兩段動(dòng)畫(huà)是先執(zhí)行 $("#box").animate({ width: "300px" }, 1000)然后再執(zhí)行("#box").animate({ opacity: 0.5 }, 1000); 他們兩個(gè)有列隊(duì)動(dòng)畫(huà)的效果) 而屬于#pox的兩段動(dòng)畫(huà)是先執(zhí)行 $("#pox").animate({ height: "200px" }, 1000)然后再執(zhí)行 $("#pox").animate({ fontSize: "150px" }, 1000)他們兩個(gè)有列隊(duì)動(dòng)畫(huà)的效果。 但是 $("#box").animate({ width: "300px" }, 1000)與$("#pox").animate({ height: "200px" }, 1000); 同時(shí)執(zhí)行的。 $("#box").animate({ opacity: 0.5 }, 1000)與$("#pox").animate({ fontSize: "150px" }, 1000)是同時(shí)執(zhí)行的。 

    //前面說(shuō)了這么一大堆 其實(shí)就是: 

    //#box的第一條和第三條是列隊(duì)動(dòng)畫(huà) 

    //#pox的第二條和第四條是列隊(duì)動(dòng)畫(huà) 

    //#box的第一條和#pox的第二條是同步動(dòng)畫(huà) 

    //#box的第三條和#pox的第四條是同步動(dòng)畫(huà) 

    $(".button").click(function () { 

      $("#box").animate({ width: "300px" }, 1000); 

      $("#pox").animate({ height: "200px" }, 1000); 

      $("#box").animate({ opacity: 0.5 }, 1000); 

      $("#pox").animate({ fontSize: "150px" }, 1000, function () { alert("列隊(duì)動(dòng)畫(huà)執(zhí)行完畢")}); 

    }) 

    //那我們現(xiàn)在的需求是:不管你有幾個(gè)元素,我都要他們依次實(shí)現(xiàn)列隊(duì)動(dòng)畫(huà)效果。(測(cè)試了一下,只能用這種回調(diào)函數(shù)嵌套的方式來(lái)實(shí)現(xiàn)了) 

    $(".button").click(function () { 

      $("#box").animate({ width: "300px" }, 1000, function () { 

        $("#pox").animate({ height: "200px" }, 1000, function () { 

          $("#box").animate({ height: "200px"}, 1000, function () { 

            $("#pox").animate({ fontSize: "150px" }, 1000, function () { alert("列隊(duì)動(dòng)畫(huà)執(zhí)行完畢") }); 

          }) 

        }) 

      }) 

    }) 

    // ---------------------------------動(dòng)畫(huà)與非動(dòng)畫(huà) 進(jìn)行隊(duì)列 【queue()】 

    //我們知道動(dòng)畫(huà)可以有列隊(duì)效果。但是一個(gè)普通的css(比如改變背景顏色)如果實(shí)現(xiàn)與動(dòng)畫(huà)進(jìn)行列隊(duì)呢? 

    $(".button").click(function () { 

      $("#box").slideUp(1000).slideDown(1000).css("background", "yellow") 

    }) 

    //本來(lái)我們是想要實(shí)現(xiàn)隊(duì)列動(dòng)畫(huà)的,也就是先讓#box滑動(dòng)隱藏,然后再讓它滑動(dòng)顯示,最后讓它改變顏色。可是我們運(yùn)行這段呢代碼,我們看到第一時(shí)間就執(zhí)行了css("background","yellow")這段代碼。 

    //通過(guò)上面的代碼我們了解到 css()方法不是動(dòng)畫(huà)方法,會(huì)和第一個(gè)動(dòng)畫(huà)同時(shí)執(zhí)行。也就是說(shuō)非動(dòng)畫(huà)不能列隊(duì)。 

    //現(xiàn)在問(wèn)題又來(lái)了。我現(xiàn)在想要實(shí)現(xiàn)列隊(duì)動(dòng)畫(huà),也想非動(dòng)畫(huà)和動(dòng)畫(huà)一起列隊(duì)怎么辦呢? 其實(shí)我們可以使用回調(diào)函數(shù)實(shí)現(xiàn)的。請(qǐng)看下面的代碼 

    $(".button").click(function () { 

      $("#box") 

        .slideUp(1000) 

        .slideDown(1000, function () { $(this).css("background", "yellow") }) 

        .hide(3000); 

    }) 

    //但如果上面這樣的話(huà),當(dāng)列隊(duì)動(dòng)畫(huà)繁多的時(shí)候,可讀性不但下降,而原本的動(dòng)畫(huà)方法不夠清晰。所以,我們的想法是每個(gè)操作都是自己獨(dú)立的方法。那么jQuery 提供了一個(gè)類(lèi)似于回調(diào)函數(shù)的方法:.queue() 

    $(".button").click(function () {  //三個(gè)動(dòng)畫(huà)。 

      $("#box") 

        .slideUp(1000) 

        .slideDown(1000) 

        .queue(function () { $(this).css("background", "yellow");}) 

    }) 

    //現(xiàn)在,我們想繼續(xù)在.queue()方法后面再增加一個(gè)隱藏動(dòng)畫(huà),這時(shí)發(fā)現(xiàn)居然無(wú)法實(shí)現(xiàn)。這是.queue()特性導(dǎo)致的。有兩種方法可以解決這個(gè)問(wèn)題,jQuery 的.queue()的回調(diào)函數(shù)可以傳遞一個(gè)參數(shù),這個(gè)參數(shù)是next 函數(shù),在結(jié)尾處調(diào)用這個(gè)next()方法即可再鏈?zhǔn)綀?zhí)行列隊(duì)動(dòng)畫(huà)。 

    //鏈?zhǔn)骄幊虒?shí)現(xiàn)隊(duì)列動(dòng)畫(huà) 

    $(".button").click(function () { //四個(gè)動(dòng)畫(huà) 

      $("#box") 

        .slideUp(1000) 

        .slideDown(1000) 

        .queue(function (next) { //這個(gè)next是一個(gè)函數(shù) 

          $(this).css("background", "yellow"); 

          next();}) 

        .hide(1000); 

    }); 

    //順序編程實(shí)現(xiàn)隊(duì)列動(dòng)畫(huà) 我們看到使用順序調(diào)用的列隊(duì),逐個(gè)執(zhí)行,非常清晰 

    $(".button").click(function () { 

      $("#box").slideUp(1000); 

      $("#box").slideDown(1000); 

      $("#box").queue(function (next) { 

        $(this).css("background", "yellow"); 

        next(); }); 

      $("#box").hide(1000); 

    }); 

    //因?yàn)閚ext 函數(shù)是jQuery1.4 版本以后才出現(xiàn)的,而之前我們普遍使用的是.dequeue()方法。意思為執(zhí)行下一個(gè)元素列隊(duì)中的函數(shù)。 

    //使用.dequeue()方法執(zhí)行下一個(gè)函數(shù)動(dòng)畫(huà) 

    //$(".button").click(function () { 

    //  $('#box').slideUp('slow').slideDown('slow').queue(function () { 

    //    $(this).css('background', 'orange'); 

    //    $(this).dequeue(); //相當(dāng)于上面的那句next() 只是這里的function()括號(hào)里不像上面那樣需要傳遞一個(gè)next函數(shù) 

    //  }).hide(1000) 

    //}); 

    //-----------------------------動(dòng)畫(huà)的清除 【clearQueue()】 

    //jQuery 還提供了一個(gè)清理列隊(duì)的功能方法:.clearQueue()。把它放入一個(gè)列隊(duì)的回調(diào)函 數(shù)或.queue()方法里,就可以把剩下為執(zhí)行的列隊(duì)給移除。 

    //清理動(dòng)畫(huà)列隊(duì) 

    //假如我想在執(zhí)行完第二個(gè)動(dòng)畫(huà)那就就不再執(zhí)行了。那么只要在第二個(gè)動(dòng)畫(huà)的回調(diào)函數(shù)哪里添加一句$(this).clearQueue()就可以停止后面的列隊(duì)動(dòng)畫(huà)了 

    $(".button").click(function () { 

        

      $("#box") 

        .slideUp(1000) 

        .slideDown(1000, function () { $(this).clearQueue() }) 

        .queue(function (next) { $(this).css("background", "yellow"); next() }) 

        .hide(1000); 

    }) 

    //那么如果獲取列隊(duì)動(dòng)畫(huà)的長(zhǎng)度呢?  

    function getQueueCount() { 

      return $("#box").queue("fx").length; //獲取當(dāng)前列隊(duì)的長(zhǎng)度,fx 是默認(rèn)列隊(duì)的參數(shù) 

    } 

    //用法 

    $(".button").click(function () { 

      //下面這段代碼總共有slideUp,slideDown,queue,hide這四個(gè)動(dòng)畫(huà) 

      $("#box") 

        .slideUp(1000, function () { alert(getQueueCount()) }) //執(zhí)行到這一步的時(shí)候會(huì)打印出:4 它后面還有三個(gè)動(dòng)畫(huà),所以下一步的時(shí)候會(huì)打印出3 

        .slideDown(1000, function () { alert(getQueueCount()) }) //執(zhí)行到這一步的時(shí)候會(huì)打印出:3 

        .queue(function (next) { alert(getQueueCount()); $(this).css("background", "yellow"); next() }) //執(zhí)行到這一步的時(shí)候會(huì)打印出:2 

        .hide(1000, function () { alert(getQueueCount()) }); //執(zhí)行到這一步的時(shí)候會(huì)打印出:1 

    }); 

    //---------------------------------動(dòng)畫(huà)的停止【stop()】 

    //很多時(shí)候需要停止正在運(yùn)行中的動(dòng)畫(huà),jQuery 為此提供了一個(gè).stop()方法。它有兩個(gè)可選參數(shù):.stop(clearQueue, gotoEnd);clearQueue 傳遞一個(gè)布爾值,代表是否清空未執(zhí)行完的動(dòng)畫(huà)列隊(duì),gotoEnd 代表是否直接將正在執(zhí)行的動(dòng)畫(huà)跳轉(zhuǎn)到末狀態(tài)。 

    $(".button").click(function () { 

      $("#box") 

        .animate({left:"1000px"} ,3000) 

    }) 

    $(".stop").click(function () { 

      $("#box").stop(); //將#box這個(gè)元素的動(dòng)畫(huà)停止掉。沒(méi)有參數(shù)的stop()方法只是單純的停止動(dòng)畫(huà) 

    }) 

    //那下面再來(lái)了解下,列隊(duì)動(dòng)畫(huà)的停止 

    $(".button").click(function () { 

      $("#box").animate({ left: "300px" },1000) 

           .animate({ bottom: "300px" }, 1000) 

           .animate({ width: "300px" }, 1000) 

           .animate({ height: "300px" }, 1000)                   

    }) 

    //$(".stop").click(function () { 

    //  $("#box").stop(); // 如果用沒(méi)有參數(shù)的stop()方法去停止有列隊(duì)動(dòng)畫(huà),那么只會(huì)停止掉第一個(gè)列隊(duì)動(dòng)畫(huà),后面的列隊(duì)動(dòng)畫(huà)會(huì)繼續(xù)執(zhí)行。 

    //}) 

    //那么現(xiàn)在我想當(dāng)我點(diǎn)擊停止按鈕的時(shí)候,我就需要整個(gè)將列隊(duì)動(dòng)畫(huà)停止下來(lái),而不是僅僅停止第一個(gè),怎么辦呢? 答案是:我們可以給stop()方法加參數(shù) 

    //stop()方法有兩個(gè)可選參數(shù): 

    //第一個(gè)可選參數(shù),如果為true,就代表停止并清除掉后面的隊(duì)列動(dòng)畫(huà)。即:動(dòng)畫(huà)完全停止(默認(rèn)值為false) 

    //第二個(gè)可選參數(shù),如果為true,就代表停止并清除掉后面的隊(duì)列動(dòng)畫(huà),并且當(dāng)前動(dòng)畫(huà)會(huì)立刻跳轉(zhuǎn)到當(dāng)前這條動(dòng)畫(huà)執(zhí)行完畢的末尾位置(默認(rèn)為false) 

    $(".stop").click(function () { $("#box").stop(true, true); }) 

    //--------------------------------動(dòng)畫(huà)的延遲【delay()】 

    $(".button").click(function () { 

      $("#box").delay(2000)    //如果delay(2000) 直接寫(xiě)在$("#box")元素后面,就表示延遲2秒再執(zhí)行動(dòng)畫(huà) 

        .animate({ left: "300px" }, 1000) 

        .animate({ bottom: "300px" }, 1000) 

        .animate({ width: "300px" }, 1000).delay(3000) // 寫(xiě)在這里表示等animate({ width: "300px" }, 1000)這段代碼執(zhí)行完后,延遲3秒再執(zhí)行下面的代碼 

        .animate({ height: "300px" }, 1000) 

    }) 

    //-----------------------------------獲取當(dāng)前正在執(zhí)行的動(dòng)畫(huà) 【:animated 過(guò)濾器】 

    $(".button").click(function () { 

      //$("#box").slideUp(1000, function abc() { 

      //  $(this).slideToggle(1000, abc); //無(wú)限循環(huán)的調(diào)用自己。實(shí)現(xiàn)動(dòng)畫(huà)不停的執(zhí)行。 

      //}) 

      //或者用這以下這種方式也可以實(shí)現(xiàn) 動(dòng)畫(huà)不停的自執(zhí)行 

      $("#box").slideToggle(1000, function () { 

        $(this).slideToggle(1000, arguments.callee); //arguments.callee表示調(diào)用自身。 和上面那一句是一樣的 

      }) 

    }) 

    $(".ani").click(function () { 

      $(":animated").css("background", "blue").stop(true); //獲取當(dāng)前正在執(zhí)行的動(dòng)畫(huà),并將它的顏色改為藍(lán)色后停止動(dòng)畫(huà)的執(zhí)行 

    }) 

    //---------------------動(dòng)畫(huà)的全局屬性【$.fx.off屬性可以關(guān)閉頁(yè)面上所有的動(dòng)畫(huà)】【$.fx.interval屬性可以調(diào)整動(dòng)畫(huà)每秒運(yùn)行的幀數(shù)】 

     

    //$.fx.interval 屬性用于設(shè)置jQuery動(dòng)畫(huà)每隔多少毫秒繪制一幀圖像 (默認(rèn)為13 毫秒) 數(shù)字越小越流暢,但可能影響瀏覽器性能。 

    //$.fx.interval = 100; // 設(shè)置動(dòng)畫(huà)繪制一幀幀的時(shí)間為100毫秒,(默認(rèn)是13毫秒) 

    //$.fx.off = true; //關(guān)閉頁(yè)面上所有的動(dòng)畫(huà) 

    //補(bǔ)充:在.animate()方法中,還有一個(gè)參數(shù),easing 運(yùn)動(dòng)方式,這個(gè)參數(shù),大部分參數(shù)值需要通過(guò)插件來(lái)使用,在后面的課程中,會(huì)詳細(xì)講解。自帶的參數(shù)有兩個(gè):swing(緩動(dòng))、linear(勻速),默認(rèn)為swing。 

    $('.button').click(function () { 

      $('#box').animate({ left: '800px' }, 1000, 'swing'); //swing 表示緩動(dòng)運(yùn)行,緩速運(yùn)動(dòng)有個(gè)特點(diǎn),就是剛開(kāi)始運(yùn)行的慢,到了中間就比較快,最后又慢下來(lái)(中間快,兩頭慢) 整段代碼的意思就是在1秒鐘內(nèi) 以緩動(dòng)方式運(yùn)行動(dòng)畫(huà) 

      $('#pox').animate({ left: '800px' }, 1000, 'linear'); //linear表示勻速運(yùn)行,速度一直不變 整段代碼的意思就是在1秒鐘內(nèi) 以勻速方式運(yùn)行動(dòng)畫(huà) 

    }); 

  }); 

</script>

名單

以上這篇深入理解jquery自定義動(dòng)畫(huà)animate()就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:深入理解jquery自定義動(dòng)畫(huà)animate()
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)