1. 程式人生 > >自定義動畫animate()

自定義動畫animate()

無法 pre col css樣式 round 用戶 同時 tro 就是

在上一節總結了一下3中類型的動畫,其中show()和hide()方法會同時修改元素的多個屬性,fadeOut()和fadeIn()方法只會修改元素的不透明度,而slideDown()和slideUp()方法只會改變元素的高度,但是很多情況下,需要對動畫有更多控制,這些方法無法滿足用戶的需求,這時,jQuery中的自定義動畫animate()就可以用來解決這些高級的動畫問題了。

1,語法結構

首先來看一下該方法的語法結構:animate(params,speed,callback)

  • params:一個包含樣式屬性及值的映射
  • speed:速度參數,可選
  • callback:在動畫完成時執行的函數,可選,

在開始操作前,先在html中新建一個div元素,具體如下,接下的所有操作均在此基礎上進行。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="jquery-1.3.1.js"></script>
    <style type="text/css">
        #box1 
{ position:relative; width:100px; height:100px; border:1px solid #0050d0; background-color: #96e555; } </style> </head> <body> <div id="box1"></div> </body> </html>

2,自定義簡單動畫

animate()也可以像前面的方法那樣,讓元素動起來,而且動畫效果可以更加精致新穎。

首先要實現的是鼠標懸浮時元素向右移動。

<script type="text/javascript">
  $(function(){
      $("#box1").hover(function(){
          $(this).animate({left:"100px"},3000);
      })
  })
</script>

上面的代碼能實現鼠標懸浮時,元素移動到距離左邊100px出的位置,移動時間用時3000毫秒。

<script type="text/javascript">
$(function(){
    $("#box1").hover(function(){
        $(this).animate({left:"+=100px"},3000);
    })
})
</script>

這段代碼也是讓元素移動,不同的是,這段代碼是讓元素在當前的位置上進行累加的,即繼續向右移動100px,而上面的代碼則與當前位置無關,直接將元素移動到距離左邊100px處。

3,多重動畫

就是執行多個動畫,比如讓元素既能向右滑動,又能放大元素。

<script type="text/javascript">
$(function(){
    $("#box1").hover(function(){
        $(this).animate({left:"200px",height:"200px"},3000);
    })
})
</script>

上面這段代碼能同時實現兩個效果,讓元素的向右移動和高度增加同時發生,用時均為3000毫秒。

<script type="text/javascript">
$(function(){
    $("#box1").hover(function(){
        $(this).animate({left:"200px"},3000);
        $(this).animate({height:"200px"},3000);
    })
})
</script>

上面這段代碼也能實現兩個效果,但是兩個效果是分開執行,前3000毫秒用來實現向右移動,移動結束後,後3000毫秒用來實現高度增加。上面的兩個動畫均是對同一個對象進行操作,因此可以采用鏈式的寫法:

<script type="text/javascript">
$(function(){
    $("#box1").hover(function(){
        $(this).animate({left:"200px"},3000)
               .animate({height:"200px"},3000);
    })
})
</script>

向這種動畫的執行效果具有先後順序,稱為“動畫隊列”

4,綜合動畫

接下來要完成更復雜的動畫,鼠標懸浮的時候,讓元素向右移動的同時增大它的高度,並將它的透明度從50%變換到100%,然後再讓它從上到下移動,同時它的寬度變大,當完成這些效果後,讓它以淡出的方式隱藏。

<script type="text/javascript">
$(function(){
    $("#box1").css("opacity","0.5")
    $("#box1").hover(function(){
        $(this).animate({left:"200px",height:"200px",opacity:1},3000)
               .animate({top:"200px",width:"200px"},3000)
               .fadeOut("slow");
    })
})
</script>

上面的效果可以分解為3步,第一步是在前3000毫秒同時實現右移動,高度增加和透明度變化,第二步是在第二個3000毫秒同時實現向下移動和寬度增加,第三步實現淡出隱藏,並通過鏈式的方式將這三步進行排隊依次執行。

5,動畫回調函數

如果,我們想在上面的綜合動畫中,將元素的淡出隱藏改為切換元素的css樣式,如果我們繼續采用上面的方法,是不能得到理想的效果的。

<script type="text/javascript">
$(function(){
    $("#box1").css("opacity","0.5")
    $("#box1").hover(function(){
        $(this).animate({left:"200px",height:"200px",opacity:1},3000)
               .animate({top:"200px",width:"200px"},3000)
               .css("border","5px solid blue");
    })
})
</script>

雖然我們的css寫在了最後面,預期在動畫的最後一步改變元素樣式,但實際情況是,剛開始執行動畫的時候,最後的css()方法就被執行,這是因為css()並不是animate(),不會被加到動畫隊列中,而是立即執行,此時,如果我們想要達到預期的效果,可是使用回調函數對非動畫方法實現排隊。

<script type="text/javascript">
$(function(){
    $("#box1").css("opacity","0.5")
    $("#box1").hover(function(){
        $(this).animate({left:"200px",height:"200px",opacity:1},3000)
               .animate({top:"200px",width:"200px"},3000,function(){
                   $(this).css("border","5px solid blue");
               })
    })
})
</script>

自定義動畫animate()