在本篇博客中主要介绍两个模块的使用,1个是dojo/_base/fx
,另外1个模块是dojo/fx
,这两个模块的作用是实现DOM元素的动画效果,通过名字我们可以看出:
dojo/_base/fx
提供1些基础的动画效果dojo/fx
提供1些高级的动画效果接下来我们就来用1些这两个模块实现的动画效果
dojo/_base/fx
实现动画效果 在dojo/_base/fx
模块中提供了5个方法来实现动画效果: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样的,区分是animateProperty传入1个对象,anim方法是传入6个参数fadeIn
可让dom元素从无到有的1个进程,他的args参数主要填:node
,duration
,easing
,这3个参数的意义和animateProperty参数的意义相同fadeOut
方法可让DOM元素从有到无的1个进程,他的args参数主要填:node
,duration
,easing
,这3个参数的意义和animateProperty参数的意义相同dojo/fx
实现动画效果 在dojo/fx
模块中我们可以实现1些高级的动画效果,这个模块给我们提供了1些方法:
wipeIn
和wipeOut
实现了卷帘效果slideTo
实现了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
,其中他们的区分是(假定有两个动画效果):
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也给我们实现了简单的AOP,这个模块叫做dojo/aspect
,接下来我们看1下这个模块如何和我们的动画效果结合。
在aspect
模块中主要实现了3个方法:after
,around
,before
,我们将这3个方法分别叫做:后置通知,环绕通知,前置通知(具体甚么意思,大家可以去看 AOP专业的书),在这里我们主要简单说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();