Dojo------DOM基础之DOM特效
使用dojo 提供的标准特效,我们能创建平滑的用户的体验,
使用dojo/_base/fx
和 dojo/fx
模块,能组合一些动态特效
Dojo 1.10有两个fx模块:
dojo/_base/fx
:在以前的dojo提供了基础特效方法,包括: animateProperty
, anim
, fadeIn
, 和 fadeout
dojo/fx
:提供了许多高级特效,包括:chain
, combine
, wipeIn
, wipeOut
和 slideTo
一、 Fading
平滑的显示和隐藏元素,使节点淡入淡出。
1 <button id="fadeOutButton">Fade block out</button> 2 <button id="fadeInButton">Fade block in</button> 3 4 <div id="fadeTarget" class="red-block"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/_base/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) { 9 var fadeOutButton = dom.byId("fadeOutButton"), 10 fadeInButton = dom.byId("fadeInButton"), 11 fadeTarget = dom.byId("fadeTarget"); 12 13 on(fadeOutButton, "click", function(evt){ 14 fx.fadeOut({ node: fadeTarget }).play(); 15 }); 16 on(fadeInButton, "click", function(evt){ 17 fx.fadeIn({ node: fadeTarget }).play(); 18 }); 19 }); 20 </script>
所有的动画函数都只有一个参数:一个包含属性的对象。
最重要的属性是node,是一个DOM节点或节点字符串id,
另一个属性是duration,表示动画持续多久,用毫秒指定,默认为350毫秒
返回值:dojo/_base/fx::Animation
对象,这个对象有几个方法:
play, pause, stop, status, gotoPercent.
动画创建后必须调用play方法来启动
二、Wiping
在页面创建下拉折叠的效果
1 <button id="wipeOutButton">Wipe block out</button> 2 <button id="wipeInButton">Wipe block in</button> 3 4 <div id="wipeTarget" class="red-block wipe"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) { 9 var wipeOutButton = dom.byId("wipeOutButton"), 10 wipeInButton = dom.byId("wipeInButton"), 11 wipeTarget = dom.byId("wipeTarget"); 12 13 on(wipeOutButton, "click", function(evt){ 14 fx.wipeOut({ node: wipeTarget }).play(); 15 }); 16 on(wipeInButton, "click", function(evt){ 17 fx.wipeIn({ node: wipeTarget }).play(); 18 }); 19 }); 20 </script>
我们添加了wipe 类到目标节点上,因为wipe函数操作在一个节点内容的高度上,而不是一个定义的高度,我们的wipe类设置目标节点的高度为auto
三、Sliding
fx.slideTo
创建了一个平滑的动画,移动到像素指定的top和left坐标位置
1 <button id="slideAwayButton">Slide block away</button> 2 <button id="slideBackButton">Slide block back</button> 3 4 <div id="slideTarget" class="red-block slide"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) { 9 var slideAwayButton = dom.byId("slideAwayButton"), 10 slideBackButton = dom.byId("slideBackButton"), 11 slideTarget = dom.byId("slideTarget"); 12 13 on(slideAwayButton, "click", function(evt){ 14 fx.slideTo({ node: slideTarget, left: "200", top: "200" }).play(); 15 }); 16 on(slideBackButton, "click", function(evt){ 17 fx.slideTo({ node: slideTarget, left: "0", top: "100" }).play(); 18 }); 19 }); 20 </script>
四、Animation Events
所有的动画方法都返回一个dojo/_base/fx::Animation
对象,这个对象不仅提供了play或pause来控制动画,也提供了一套我们来监听的事件,可以再动画前,动画中,动画后执行一些方法,最重要和常用的事件处理器是beforeBegin
和 onEnd
:
1 <button id="slideAwayButton">Slide block away</button> 2 <button id="slideBackButton">Slide block back</button> 3 4 <div id="slideTarget" class="red-block slide"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/fx", "dojo/on", "dojo/dom-style", "dojo/dom", "dojo/domReady!"], function(fx, on, style, dom) { 9 10 var slideAwayButton = dom.byId("slideAwayButton"), 11 slideBackButton = dom.byId("slideBackButton"), 12 slideTarget = dom.byId("slideTarget"); 13 14 on(slideAwayButton, "click", function(evt){ 15 // Note that we're specifying the beforeBegin as a property of the animation 16 // rather than using connect. This ensures that our beforeBegin handler 17 // executes before any others. 18 var anim = fx.slideTo({ 19 node: slideTarget, 20 left: "200", 21 top: "200", 22 beforeBegin: function(){ 23 24 console.warn("slide target is: ", slideTarget); 25 26 style.set(slideTarget, { 27 left: "0px", 28 top: "100px" 29 }); 30 } 31 }); 32 33 // We could have also specified onEnd above alongside beforeBegin, 34 // but it's just as easy to connect like so 35 on(anim, "End", function(){ 36 style.set(slideTarget, { 37 backgroundColor: "blue" 38 }); 39 }, true); 40 41 // Don't forget to actually start the animation! 42 anim.play(); 43 }); 44 45 on(slideBackButton, "click", function(evt){ 46 var anim = fx.slideTo({ 47 node: slideTarget, 48 left: "0", 49 top: "100", 50 beforeBegin: function(){ 51 52 style.set(slideTarget, { 53 left: "200px", 54 top: "200px" 55 }); 56 } 57 }); 58 59 on(anim, "End", function(){ 60 style.set(slideTarget, { 61 backgroundColor: "red" 62 }); 63 }, true); 64 65 anim.play(); 66 }); 67 }); 68 </script>
五、
Chaining
按照顺序触发动画,使用fx.chain
一个接一个的播放动画
1 <button id="slideAwayButton">Slide block away</button> 2 <button id="slideBackButton">Slide block back</button> 3 4 <div id="slideTarget" class="red-block slide chain"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/_base/fx", "dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(baseFx, fx, on, dom) { 9 10 var slideAwayButton = dom.byId("slideAwayButton"), 11 slideBackButton = dom.byId("slideBackButton"), 12 slideTarget = dom.byId("slideTarget"); 13 14 // Set up a couple of click handlers to run our chained animations 15 on(slideAwayButton, "click", function(evt){ 16 fx.chain([ 17 baseFx.fadeIn({ node: slideTarget }), 18 fx.slideTo({ node: slideTarget, left: "200", top: "200" }), 19 baseFx.fadeOut({ node: slideTarget }) 20 ]).play(); 21 }); 22 on(slideBackButton, "click", function(evt){ 23 fx.chain([ 24 baseFx.fadeIn({ node: slideTarget }), 25 fx.slideTo({ node: slideTarget, left: "0", top: "100" }), 26 baseFx.fadeOut({ node: slideTarget }) 27 ]).play(); 28 }); 29 }); 30 </script>
我们调用fx.chain
直接在一行上创建了许多特性,调用play返回
dojo/_base/fx::Animation
启动链式动画。
六、
Combining
同时启动多个动画,最长时间的动画完成后返回的dojo/_base/fx::Animation
将会触发onEnd
事件
1 <button id="slideAwayButton">Slide block away</button> 2 <button id="slideBackButton">Slide block back</button> 3 4 <div id="slideTarget" class="red-block slide chain"> 5 A red block 6 </div> 7 <script> 8 require(["dojo/_base/fx", "dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(baseFx, fx, on, dom) { 9 10 var slideAwayButton = dom.byId("slideAwayButton"), 11 slideBackButton = dom.byId("slideBackButton"), 12 slideTarget = dom.byId("slideTarget"); 13 14 // Set up a couple of click handlers to run our combined animations 15 on(slideAwayButton, "click", function(evt){ 16 fx.combine([ 17 baseFx.fadeIn({ node: slideTarget }), 18 fx.slideTo({ node: slideTarget, left: "200", top: "200" }) 19 ]).play(); 20 }); 21 on(slideBackButton, "click", function(evt){ 22 fx.combine([ 23 fx.slideTo({ node: slideTarget, left: "0", top: "100" }), 24 baseFx.fadeOut({ node: slideTarget }) 25 ]).play(); 26 }); 27 }); 28 </script>