在本篇博客中主要介紹兩個模塊的使用,1個是dojo/_base/fx
,另外1個模塊是dojo/fx
,這兩個模塊的作用是實現(xiàn)DOM元素的動畫效果,通過名字我們可以看出:
dojo/_base/fx
提供1些基礎的動畫效果dojo/fx
提供1些高級的動畫效果接下來我們就來用1些這兩個模塊實現(xiàn)的動畫效果
dojo/_base/fx
實現(xiàn)動畫效果 在dojo/_base/fx
模塊中提供了5個方法來實現(xiàn)動畫效果:animateProperty
, anim
, fadeIn
, fadeOut
,接下來我們主要介紹1個方法animateProperty
,由于當這個方法會使用的時候,其他的方法也就會了。
我們首先介紹1下args的參數:
//用于動畫的div
<div id="nodeId" style="background-color: red"></div>
//代碼
require(["dojo/_base/fx","dojo/domReady!"],function(basefx){
basefx.animateProperty({
node:"nodeId",
properties:{
width: { start: '200', end: '400', units:"px" },
height: { start:'200', end: '400', units:"px" }
},
duration:4000,
delay:2000,
easing: function (n) {
return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
},
onEnd:function(node){
alert("動畫結束了")
}
}).play();
解釋參數:
注意1點:properties的樣式對應的值也能夠是1個函數,例如:
basefx.animateProperty({
node:"nodeId",
properties:{
width:{
start:function(node){ return 100; },
end:function(node){ return 200; }
}
}
}).play();
在強調1下:properties的值可以是1個函數,在這個函數中可以拿到我們的DOM元素(注意函數有1個參數為node)
我們直接看剩余3個方法
anim(node,properties,duration,easing,onEnd,delay)
其實anim的方法和animateProperty方法是1樣的,區(qū)分是animateProperty傳入1個對象,anim方法是傳入6個參數fadeIn
可讓dom元素從無到有的1個進程,他的args參數主要填:node
,duration
,easing
,這3個參數的意義和animateProperty參數的意義相同fadeOut
方法可讓DOM元素從有到無的1個進程,他的args參數主要填:node
,duration
,easing
,這3個參數的意義和animateProperty參數的意義相同dojo/fx
實現(xiàn)動畫效果 在dojo/fx
模塊中我們可以實現(xiàn)1些高級的動畫效果,這個模塊給我們提供了1些方法:
wipeIn
和wipeOut
實現(xiàn)了卷簾效果slideTo
實現(xiàn)了DOM元素的移動combine
和chain
可以同時讓多個DOM元素進行動畫效果wipeIn
和wipeOut
這兩個方法都需要傳入1個args對象,基本和animateProperty類似,代碼以下
wipeOut
方法,需要注意的是,args沒有properties
屬性(千萬不要寫)//動畫的dom元素
<div id="nodeId" style="width: 500px;height: 500px; background-color: red"></div>
//動畫代碼
require(["dojo/fx","dojo/domReady!"],function(fx){
fx.wipeOut({
node:"nodeId",
duration:4000,
delay:2000,
easing: function (n) {
return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
},
onEnd:function(node){
alert("動畫結束了")
}
}).play();
})
wipeIn
方法,需要注意的是,args沒有properties
屬性(千萬不要寫)//注意兩點:
// 1.div1開始display:none,同時不需要設置height屬性(框架總是指定為auto)
// 2.div里面必須有內容(必須有內容,不然不行)
<div id="nodeId" style="width: 500px;background-color: red;display: none;">
<b>This is a container of random content to wipe in!</b>
</div>
//js代碼
require(["dojo/fx","dojo/domReady!"],function(fx){
fx.wipeIn({
node:"nodeId"
}).play();
})
slideTo
滑動效果很簡單,就是從某1個位置移動到另外1個位置,代碼以下
<div id="nodeId" style="width: 500px;height: 500px; background-color: red"></div>
require(["dojo/fx","dojo/domReady!"],function(fx){
fx.slideTo({
node: "nodeId",
top: "40",
left: "50",
units: "px"
}).play();
})
dojo/fx
模塊給我們提供了兩個方法,1個是chain
,1個叫做combine
,其中他們的區(qū)分是(假定有兩個動畫效果):
chain
函數是多個動畫順序履行(先履行1動畫,在履行2動畫)combine
是多個動畫同時履行(1和2動畫同時履行)實例代碼:
<div id="nodeId" style="width: 200px;height:200px; background-color: red"></div>
<div id="nodeId2" style="width: 500px;background-color: red;display: none;">
<b>This is a container of random content to wipe in!</b>
</div>
require(["dojo/fx","dojo/domReady!"],function(fx){
fx.combine([
fx.wipeOut({
duration: 1200,
node: "nodeId"
}),
fx.wipeIn({
duration: 1200,
node: "nodeId2"
})
]).play();
})
如果大家學過后臺語言(比如Java),大家1定會知道1個非常著名的概念:AOP,AOP的目的也是為了模塊化編程,一樣Dojo也給我們實現(xiàn)了簡單的AOP,這個模塊叫做dojo/aspect
,接下來我們看1下這個模塊如何和我們的動畫效果結合。
在aspect
模塊中主要實現(xiàn)了3個方法:after
,around
,before
,我們將這3個方法分別叫做:后置通知,環(huán)繞通知,前置通知(具體甚么意思,大家可以去看 AOP專業(yè)的書),在這里我們主要簡單說1下這3個方法的作用。
require(["dojo/fx","dojo/aspect","dojo/domReady!"],function(fx,aspect){
var anim=fx.wipeOut({
node:"nodeId",
duration:4000
});
aspect.before(anim,"play",function(){
alert("履行動畫之前")
})
anim.play();
})
require(["dojo/fx","dojo/aspect","dojo/domReady!"],function(fx,aspect){
var anim=fx.wipeOut({
node:"nodeId",
duration:4000,
onEnd:function(node){
alert("動畫結束了")
}
});
aspect.after(anim,"onEnd",function(){
alert("履行動畫以后")
})
anim.play();
})
解釋:我們在履行onEnd函數以后履行切面函數
require(["dojo/fx","dojo/aspect","dojo/domReady!"],function(fx,aspect){
var anim=fx.wipeOut({
node:"nodeId",
duration:4000
});
aspect.around(anim,"play",function(originalFoo){
return function(){
alert("履行動畫之前")
var results = originalFoo.apply(this, arguments);
alert("履行動畫以后")
}
})
anim.play();