下面小編就為大家?guī)硪黄钊肜斫鈐query自定義動畫animate()。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。
在以前很長一段時間里,網(wǎng)頁上的各種特效還需要采用flash 在進行。但最近幾年里,我們已經(jīng)很少看到這種情況了,絕大部分已經(jīng)使用JavaScript 動畫效果來取代flash。
這里說的取代是網(wǎng)頁特效部分,而不是動畫。網(wǎng)頁特效比如:漸變菜單、漸進顯示、圖片輪播等;而動畫比如:故事情節(jié)廣告、MV 等等。
如果復(fù)制當(dā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="開始" /><input type="button" class="stop" value="停止" />
<input type="button" class="ani" value="查找運動中的動畫" />
<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這種方向性的屬性 先必須對"#box元素設(shè)置CSS 絕對定位
})
})
//自定義動畫中,每次開始運動都必須是初始位置或初始狀態(tài),而有時我們想通過當(dāng)前位置或狀態(tài)下再進行動畫。jQuery 提供了自定義動畫的累加、累減功能。
$(".button").click(function () {
$("#box").animate({
left: "+=50px" //每點擊一次.button按鈕,#box元素就往左移動50px
})
})
//-------------------------------------同步動畫
//一個CSS 變化就是一個動畫效果,下面的例子中,已經(jīng)有四個CSS 變化(分別是width,height,opacity,fontSize的變化)實現(xiàn)了多重動畫同步運動的效果。(所謂多重同步運動的效果就是,這四個css屬性的值在同一時間,同時變化)
$(".button").click(function () {
$("#box").animate({
width: "300px",
height: "200px",
opacity:0.5, //透明度為0.5 注:透明度的值在0-1之間
fontSize:"200px", //字體大小設(shè)為30px
}) //第一個參數(shù):是一個對象,他是鍵值對的css
})
//--------------------------------------列隊動畫
//通過回調(diào)函數(shù)現(xiàn)實隊列動畫。(效果就是:首先#box的寬度變?yōu)?00px 然后高度變?yōu)?00px,然后透明度變?yōu)?0%,字體大小變?yōu)?50px 最后彈出一個“完畢”)
$(".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("完畢")})
});
});
});
})
//在同一個元素的基礎(chǔ)上,使用鏈?zhǔn)秸{(diào)用也可以實現(xiàn)列隊動畫
$(".button").click(function () {
$("#box")
.animate({ width: "300px" }, 1000)
.animate({ height: "200px" }, 1000)
.animate({ opacity: 0.5 }, 1000)
.animate({ fontSize: "150px" }, 1000, function () { alert("列隊動畫執(zhí)行完畢")})
});
//在同一個元素的基礎(chǔ)上,通過依次順序?qū)崿F(xiàn)列隊動畫 (如果有多個元素則不能實現(xiàn),兩個元素之間的動畫是同步的。)
$(".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("列隊動畫執(zhí)行完畢")});
})
//如果有多個元素則不能實現(xiàn) 不信請看下面代碼 (通過執(zhí)行下面這段代碼,我們發(fā)現(xiàn)#box 與#pox這兩個元素的動畫是同時執(zhí)行的,屬于#box的那兩段動畫是先執(zhí)行 $("#box").animate({ width: "300px" }, 1000)然后再執(zhí)行("#box").animate({ opacity: 0.5 }, 1000); 他們兩個有列隊動畫的效果) 而屬于#pox的兩段動畫是先執(zhí)行 $("#pox").animate({ height: "200px" }, 1000)然后再執(zhí)行 $("#pox").animate({ fontSize: "150px" }, 1000)他們兩個有列隊動畫的效果。 但是 $("#box").animate({ width: "300px" }, 1000)與$("#pox").animate({ height: "200px" }, 1000); 同時執(zhí)行的。 $("#box").animate({ opacity: 0.5 }, 1000)與$("#pox").animate({ fontSize: "150px" }, 1000)是同時執(zhí)行的。
//前面說了這么一大堆 其實就是:
//#box的第一條和第三條是列隊動畫
//#pox的第二條和第四條是列隊動畫
//#box的第一條和#pox的第二條是同步動畫
//#box的第三條和#pox的第四條是同步動畫
$(".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("列隊動畫執(zhí)行完畢")});
})
//那我們現(xiàn)在的需求是:不管你有幾個元素,我都要他們依次實現(xiàn)列隊動畫效果。(測試了一下,只能用這種回調(diào)函數(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("列隊動畫執(zhí)行完畢") });
})
})
})
})
// ---------------------------------動畫與非動畫 進行隊列 【queue()】
//我們知道動畫可以有列隊效果。但是一個普通的css(比如改變背景顏色)如果實現(xiàn)與動畫進行列隊呢?
$(".button").click(function () {
$("#box").slideUp(1000).slideDown(1000).css("background", "yellow")
})
//本來我們是想要實現(xiàn)隊列動畫的,也就是先讓#box滑動隱藏,然后再讓它滑動顯示,最后讓它改變顏色??墒俏覀冞\行這段呢代碼,我們看到第一時間就執(zhí)行了css("background","yellow")這段代碼。
//通過上面的代碼我們了解到 css()方法不是動畫方法,會和第一個動畫同時執(zhí)行。也就是說非動畫不能列隊。
//現(xiàn)在問題又來了。我現(xiàn)在想要實現(xiàn)列隊動畫,也想非動畫和動畫一起列隊怎么辦呢? 其實我們可以使用回調(diào)函數(shù)實現(xiàn)的。請看下面的代碼
$(".button").click(function () {
$("#box")
.slideUp(1000)
.slideDown(1000, function () { $(this).css("background", "yellow") })
.hide(3000);
})
//但如果上面這樣的話,當(dāng)列隊動畫繁多的時候,可讀性不但下降,而原本的動畫方法不夠清晰。所以,我們的想法是每個操作都是自己獨立的方法。那么jQuery 提供了一個類似于回調(diào)函數(shù)的方法:.queue()
$(".button").click(function () { //三個動畫。
$("#box")
.slideUp(1000)
.slideDown(1000)
.queue(function () { $(this).css("background", "yellow");})
})
//現(xiàn)在,我們想繼續(xù)在.queue()方法后面再增加一個隱藏動畫,這時發(fā)現(xiàn)居然無法實現(xiàn)。這是.queue()特性導(dǎo)致的。有兩種方法可以解決這個問題,jQuery 的.queue()的回調(diào)函數(shù)可以傳遞一個參數(shù),這個參數(shù)是next 函數(shù),在結(jié)尾處調(diào)用這個next()方法即可再鏈?zhǔn)綀?zhí)行列隊動畫。
//鏈?zhǔn)骄幊虒崿F(xiàn)隊列動畫
$(".button").click(function () { //四個動畫
$("#box")
.slideUp(1000)
.slideDown(1000)
.queue(function (next) { //這個next是一個函數(shù)
$(this).css("background", "yellow");
next();})
.hide(1000);
});
//順序編程實現(xiàn)隊列動畫 我們看到使用順序調(diào)用的列隊,逐個執(zhí)行,非常清晰
$(".button").click(function () {
$("#box").slideUp(1000);
$("#box").slideDown(1000);
$("#box").queue(function (next) {
$(this).css("background", "yellow");
next(); });
$("#box").hide(1000);
});
//因為next 函數(shù)是jQuery1.4 版本以后才出現(xiàn)的,而之前我們普遍使用的是.dequeue()方法。意思為執(zhí)行下一個元素列隊中的函數(shù)。
//使用.dequeue()方法執(zhí)行下一個函數(shù)動畫
//$(".button").click(function () {
// $('#box').slideUp('slow').slideDown('slow').queue(function () {
// $(this).css('background', 'orange');
// $(this).dequeue(); //相當(dāng)于上面的那句next() 只是這里的function()括號里不像上面那樣需要傳遞一個next函數(shù)
// }).hide(1000)
//});
//-----------------------------動畫的清除 【clearQueue()】
//jQuery 還提供了一個清理列隊的功能方法:.clearQueue()。把它放入一個列隊的回調(diào)函 數(shù)或.queue()方法里,就可以把剩下為執(zhí)行的列隊給移除。
//清理動畫列隊
//假如我想在執(zhí)行完第二個動畫那就就不再執(zhí)行了。那么只要在第二個動畫的回調(diào)函數(shù)哪里添加一句$(this).clearQueue()就可以停止后面的列隊動畫了
$(".button").click(function () {
$("#box")
.slideUp(1000)
.slideDown(1000, function () { $(this).clearQueue() })
.queue(function (next) { $(this).css("background", "yellow"); next() })
.hide(1000);
})
//那么如果獲取列隊動畫的長度呢?
function getQueueCount() {
return $("#box").queue("fx").length; //獲取當(dāng)前列隊的長度,fx 是默認列隊的參數(shù)
}
//用法
$(".button").click(function () {
//下面這段代碼總共有slideUp,slideDown,queue,hide這四個動畫
$("#box")
.slideUp(1000, function () { alert(getQueueCount()) }) //執(zhí)行到這一步的時候會打印出:4 它后面還有三個動畫,所以下一步的時候會打印出3
.slideDown(1000, function () { alert(getQueueCount()) }) //執(zhí)行到這一步的時候會打印出:3
.queue(function (next) { alert(getQueueCount()); $(this).css("background", "yellow"); next() }) //執(zhí)行到這一步的時候會打印出:2
.hide(1000, function () { alert(getQueueCount()) }); //執(zhí)行到這一步的時候會打印出:1
});
//---------------------------------動畫的停止【stop()】
//很多時候需要停止正在運行中的動畫,jQuery 為此提供了一個.stop()方法。它有兩個可選參數(shù):.stop(clearQueue, gotoEnd);clearQueue 傳遞一個布爾值,代表是否清空未執(zhí)行完的動畫列隊,gotoEnd 代表是否直接將正在執(zhí)行的動畫跳轉(zhuǎn)到末狀態(tài)。
$(".button").click(function () {
$("#box")
.animate({left:"1000px"} ,3000)
})
$(".stop").click(function () {
$("#box").stop(); //將#box這個元素的動畫停止掉。沒有參數(shù)的stop()方法只是單純的停止動畫
})
//那下面再來了解下,列隊動畫的停止
$(".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(); // 如果用沒有參數(shù)的stop()方法去停止有列隊動畫,那么只會停止掉第一個列隊動畫,后面的列隊動畫會繼續(xù)執(zhí)行。
//})
//那么現(xiàn)在我想當(dāng)我點擊停止按鈕的時候,我就需要整個將列隊動畫停止下來,而不是僅僅停止第一個,怎么辦呢? 答案是:我們可以給stop()方法加參數(shù)
//stop()方法有兩個可選參數(shù):
//第一個可選參數(shù),如果為true,就代表停止并清除掉后面的隊列動畫。即:動畫完全停止(默認值為false)
//第二個可選參數(shù),如果為true,就代表停止并清除掉后面的隊列動畫,并且當(dāng)前動畫會立刻跳轉(zhuǎn)到當(dāng)前這條動畫執(zhí)行完畢的末尾位置(默認為false)
$(".stop").click(function () { $("#box").stop(true, true); })
//--------------------------------動畫的延遲【delay()】
$(".button").click(function () {
$("#box").delay(2000) //如果delay(2000) 直接寫在$("#box")元素后面,就表示延遲2秒再執(zhí)行動畫
.animate({ left: "300px" }, 1000)
.animate({ bottom: "300px" }, 1000)
.animate({ width: "300px" }, 1000).delay(3000) // 寫在這里表示等animate({ width: "300px" }, 1000)這段代碼執(zhí)行完后,延遲3秒再執(zhí)行下面的代碼
.animate({ height: "300px" }, 1000)
})
//-----------------------------------獲取當(dāng)前正在執(zhí)行的動畫 【:animated 過濾器】
$(".button").click(function () {
//$("#box").slideUp(1000, function abc() {
// $(this).slideToggle(1000, abc); //無限循環(huán)的調(diào)用自己。實現(xiàn)動畫不停的執(zhí)行。
//})
//或者用這以下這種方式也可以實現(xiàn) 動畫不停的自執(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í)行的動畫,并將它的顏色改為藍色后停止動畫的執(zhí)行
})
//---------------------動畫的全局屬性【$.fx.off屬性可以關(guān)閉頁面上所有的動畫】【$.fx.interval屬性可以調(diào)整動畫每秒運行的幀數(shù)】
//$.fx.interval 屬性用于設(shè)置jQuery動畫每隔多少毫秒繪制一幀圖像 (默認為13 毫秒) 數(shù)字越小越流暢,但可能影響瀏覽器性能。
//$.fx.interval = 100; // 設(shè)置動畫繪制一幀幀的時間為100毫秒,(默認是13毫秒)
//$.fx.off = true; //關(guān)閉頁面上所有的動畫
//補充:在.animate()方法中,還有一個參數(shù),easing 運動方式,這個參數(shù),大部分參數(shù)值需要通過插件來使用,在后面的課程中,會詳細講解。自帶的參數(shù)有兩個:swing(緩動)、linear(勻速),默認為swing。
$('.button').click(function () {
$('#box').animate({ left: '800px' }, 1000, 'swing'); //swing 表示緩動運行,緩速運動有個特點,就是剛開始運行的慢,到了中間就比較快,最后又慢下來(中間快,兩頭慢) 整段代碼的意思就是在1秒鐘內(nèi) 以緩動方式運行動畫
$('#pox').animate({ left: '800px' }, 1000, 'linear'); //linear表示勻速運行,速度一直不變 整段代碼的意思就是在1秒鐘內(nèi) 以勻速方式運行動畫
});
});
</script>
以上這篇深入理解jquery自定義動畫animate()就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考