3.4 Dojo 特效

原文地址:https://dojotoolkit.org/documentation/tutorials/1.10/effects/index.html
本翻译项目放在GitBook上,欢迎参与。
GitBook地址:https://www.gitbook.com/book/limeng1900/dojo1-11-tutorials-translation-in-chinese/details
转载请注明出处:http://blog.csdn.net/taijiedi13/ – 碎梦道


本教程中,我们将探索Dojo提供的特效,它可以让你的页面或应用生动起来。

入门

现在为止,我们已经可以很舒服的从DOM节点来操作DOM和处理事件。但是,在我们执行某些动作时,过渡会非常生硬:移除一个节点让它从页面消失,可能会让用户迷惑。使用Dojo提供的标准特效,我们可以创建更加平滑的用户体验,为应用添加额外的闪光点。如果我们利用Dojo的dojo/_base/fxdojo/fx可以对这些特效进行连接和组合,进而提供非常炫的动态体验。

Dojo1.10有两个fx模块:dojo/_base/fxdojo/fx
dojo/_base/fx提供基础特效方法,之前在Dojo base里看到过,包括:animatePropertyanimfadeInfadeOut
dojo/fx提供更多高阶特效,包括:chaincombinewipeInwipeOutslideTo

淡入淡出

应用中你可能见过或者用过淡入和淡出。这个 特效很常见,它包含在dojo/_base/fx的核心特效部分。可以用它来平滑的显示或隐藏页面中的元素。请看示例:

<button id="fadeOutButton">Fade block out</button>
<button id="fadeInButton">Fade block in</button><div id="fadeTarget" class="red-block">A red block
</div>
<script>require(["dojo/_base/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) {var fadeOutButton = dom.byId("fadeOutButton"),fadeInButton = dom.byId("fadeInButton"),fadeTarget = dom.byId("fadeTarget");on(fadeOutButton, "click", function(evt){fx.fadeOut({ node: fadeTarget }).play();});on(fadeInButton, "click", function(evt){fx.fadeIn({ node: fadeTarget }).play();});});
</script>

所有的动画函数都需要一个参数:含属性的对象。你要用的最重要的属性是node属性:一个DOM节点或一个节点ID字符串。另一个属性是duration——动画的持续时间,以毫秒为单位,默认为350毫秒。其他动画还有别的属性,不过淡入淡出不需要。
动画函数返回一个dojo/_base/fx::Animation对象,它有几个方法:paly、pause、stop和gotoPercent。如上,动画在创建时不会立即播放必须用play方法播放。

View Demo

Wiping

另一个动画是擦拭:改变一个节点的高度。看起来像是在节点上使用雨刷器。通常,它用来创建页面下拉特效,用在较少访问的内容部分。

<button id="wipeOutButton">Wipe block out</button>
<button id="wipeInButton">Wipe block in</button><div id="wipeTarget" class="red-block wipe">A red block
</div>
<script>require(["dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) {var wipeOutButton = dom.byId("wipeOutButton"),wipeInButton = dom.byId("wipeInButton"),wipeTarget = dom.byId("wipeTarget");on(wipeOutButton, "click", function(evt){fx.wipeOut({ node: wipeTarget }).play();});on(wipeInButton, "click", function(evt){fx.wipeIn({ node: wipeTarget }).play();});});
</script>

擦拭特效位于dojo/fx模块。本例中,将“wipe”类添加到目标节点。由于wipe函数操作节点内容的高度,“wipe”类将目标节点的高度设为“auto”。

View Demo

滑动

目前已经涉及了隐藏节点,但是如果要移动它们呢?淡入淡出和擦拭都不能改变节点的位置。可以用fx.slideTo。节点的位移可以用来创建页面上的运动,fx.slideTo创建一个节点的平滑动画,通过指定左上角的坐标来移动它。

<button id="slideAwayButton">Slide block away</button>
<button id="slideBackButton">Slide block back</button><div id="slideTarget" class="red-block slide">A red block
</div>
<script>require(["dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) {var slideAwayButton = dom.byId("slideAwayButton"),slideBackButton = dom.byId("slideBackButton"),slideTarget = dom.byId("slideTarget");on(slideAwayButton, "click", function(evt){fx.slideTo({ node: slideTarget, left: "200", top: "200" }).play();});on(slideBackButton, "click", function(evt){fx.slideTo({ node: slideTarget, left: "0", top: "100" }).play();});});
</script>

View Demo

动画事件

之前说过所有的动画方法都返回一个dojo/_base/fx::Animation对象。这些对象不只用来控制动画的播放和暂停,为了控制动作的执行顺序如之前、期间、之后,这些对象还可以设置监听事件。两个常用的重要事件处理器是beforeBeginonEnd

<button id="slideAwayButton">Slide block away</button>
<button id="slideBackButton">Slide block back</button><div id="slideTarget" class="red-block slide">A red block
</div>
<script>require(["dojo/fx", "dojo/on", "dojo/dom-style", "dojo/dom", "dojo/domReady!"], function(fx, on, style, dom) {var slideAwayButton = dom.byId("slideAwayButton"),slideBackButton = dom.byId("slideBackButton"),slideTarget = dom.byId("slideTarget");on(slideAwayButton, "click", function(evt){// Note that we're specifying the beforeBegin as a property of the animation// rather than using connect. This ensures that our beforeBegin handler// executes before any others.var anim = fx.slideTo({node: slideTarget,left: "200",top: "200",beforeBegin: function(){console.warn("slide target is: ", slideTarget);style.set(slideTarget, {left: "0px",top: "100px"});}});// We could have also specified onEnd above alongside beforeBegin,// but it's just as easy to connect like soon(anim, "End", function(){style.set(slideTarget, {backgroundColor: "blue"});}, true);// Don't forget to actually start the animation!anim.play();});on(slideBackButton, "click", function(evt){var anim = fx.slideTo({node: slideTarget,left: "0",top: "100",beforeBegin: function(){style.set(slideTarget, {left: "200px",top: "200px"});}});on(anim, "End", function(){style.set(slideTarget, {backgroundColor: "red"});}, true);anim.play();});});
</script>

beforeBegin作为一个参数对象的属性传递。直接原因是在确定在动画创建的时候就连接beforeBegin。因此,如果你在动画创建之后连接beforeBegin,你的处理器将在动画的beforeBegin处理器之后执行,你可能并不想这样。通过将处理器作为参数对象属性传递,可以确保你的处理器最先执行。

View Demo

链接

如果我们想要连续播放动画呢?可以使用之前说过的end事件来开启下一个特效,但是不太方便。dojo/fx提供了几个方法设置特效顺序播放或并行,每个方法都返回一个dojo/_base/fx::Animation对象,它带有一组事件和代表整个序列的方法。先看fx.chain来一个接一个播放动画:

<button id="slideAwayButton">Slide block away</button>
<button id="slideBackButton">Slide block back</button><div id="slideTarget" class="red-block slide chain">A red block
</div>
<script>require(["dojo/_base/fx", "dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(baseFx, fx, on, dom) {var slideAwayButton = dom.byId("slideAwayButton"),slideBackButton = dom.byId("slideBackButton"),slideTarget = dom.byId("slideTarget");// Set up a couple of click handlers to run our chained animationson(slideAwayButton, "click", function(evt){fx.chain([baseFx.fadeIn({ node: slideTarget }),fx.slideTo({ node: slideTarget, left: "200", top: "200" }),baseFx.fadeOut({ node: slideTarget })]).play();});on(slideBackButton, "click", function(evt){fx.chain([baseFx.fadeIn({ node: slideTarget }),fx.slideTo({ node: slideTarget, left: "0", top: "100" }),baseFx.fadeOut({ node: slideTarget })]).play();});});
</script>

如你所见,直接在fx.chain的回调里创建了一些特效,然后立即调用返回的dojo/_base/fx::Animationplay来开启链式动画。我们不对每一个独立特效启动播放,fx.chain会进行处理。

View Demo

组合

dojo/fx提供的第二个方便的方法是combine,可以同时开启多个动画。在持续最长的动画结束后,返回的dojo/_base/fx::Animation对象会启动onEnd事件。来看另一个例子:

<button id="slideAwayButton">Slide block away</button>
<button id="slideBackButton">Slide block back</button><div id="slideTarget" class="red-block slide chain">A red block
</div>
<script>require(["dojo/_base/fx", "dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(baseFx, fx, on, dom) {var slideAwayButton = dom.byId("slideAwayButton"),slideBackButton = dom.byId("slideBackButton"),slideTarget = dom.byId("slideTarget");// Set up a couple of click handlers to run our combined animationson(slideAwayButton, "click", function(evt){fx.combine([baseFx.fadeIn({ node: slideTarget }),fx.slideTo({ node: slideTarget, left: "200", top: "200" })]).play();});on(slideBackButton, "click", function(evt){fx.combine([fx.slideTo({ node: slideTarget, left: "0", top: "100" }),baseFx.fadeOut({ node: slideTarget })]).play();});});
</script>

这个例子中,同时进行滑动和淡入淡出。
你可以使用fx.chainfx.combine来创建一些精致的动画序列。而且,链接和组合都返回一个动画对象,这些方法还可以进行连接和组合,你就可以用简单的动画来创建更加丰富多彩的序列。

View Demo

小结

使用Dojo可以很容易地为你的页面增色。 dojo/_base/fx and dojo/fx可以让你轻易的实现DOM节点的淡入淡出、擦除等,链接和组合意味着你可以更快更容易地创建高阶动画。
然而,如果你想要多一些更有难度的事,比如调整一个DOM节点的高但并不一定缩减到零,或者通过动画变背景颜色?下一节教程fx.animateProperty会涉及到这些。

Dojo1.11官方教程文档翻译(3.4)Dojo特效相关推荐

  1. Dojo1.11官方教程文档翻译(3.5)动画

    3.5 动画 原文地址:https://dojotoolkit.org/documentation/tutorials/1.10/animation/index.html 本翻译项目放在GitBook ...

  2. Dojo 1.6 最新官方教程: Dojo DOM 函数

    本文翻译自: Dojo DOM Functions 原作者: Sam Foster 翻译: Siqi (siqi.zhong@gmail.com) 在本教程中,您将学到如何使用Dojo简单地跨平台操作 ...

  3. 11、Java 变量作用域、构造方法官方教程

    文章目录 一.变量作用域 二.构造方法(Constructor) (1) 官方教程解释构造方法 (2) 构造方法概念 (3) this 的本质 ☆☆☆☆☆ 三.对象创建流程分析 一.变量作用域 Jav ...

  4. Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  5. Caffe官方教程翻译(7):Fine-tuning for Style Recognition

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  6. Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  7. TiDB 官方设计文档翻译(二)

    这个系列共三篇译文:  TiDB 官方设计文档翻译(一)  TiDB 官方设计文档翻译(二)  TiDB 官方设计文档翻译(三) 原文:  https://pingcap.github.io/blog ...

  8. Android官方技术文档翻译——Gradle 插件用户指南(5)

    昨晚把第五章未译完的几句话攻克了.只是第六章没怎么译,明后天又是周末,假设周一前第六章翻译完的话,周一再发第六章. 本文译自Android官方技术文档<Gradle Plugin User Gu ...

  9. Ubuntu18.04+Halcon18.11安装教程

    Ubuntu18.04+Halcon18.11安装教程 HALCON下载 建议到HALCON官方下载页选择linux版本下载,压缩包名为MVTec_HALCON_Progress-18.11.0.1- ...

  10. Hololens官方教程精简版 - 08. Sharing holograms(共享全息影像)

    前言 注意:本文已更新到5.5.1f1版本 本篇集中学习全息影像"共享"的功能,以实现在同一房间的人,看到"同一个物体".之所以打引号,是因为,每个人看到的并非 ...

最新文章

  1. opencv中Range类的使用
  2. python【蓝桥杯vip练习题库】ALGO-75筛选号码(约瑟夫环)
  3. 预备作业02-20162314王译潇 黑客帝国之路1.1
  4. C++实现hopcroft karp霍普克洛夫特-卡普算法(附完整源码)
  5. 两数之和,两数相加(leetcode)
  6. java kafka搭建,Apache Kafka 安装步骤
  7. java fangfa_daicanfangfa java中的方法 刚入门的分不清带参方法的作用和用处 这个可以详细的讲解如何使用带参方法 - 下载 - 搜珍网...
  8. 【语音分析】基于matlab GUI语音信号分析【含Matlab源码 1718期】
  9. Unity_游戏源码
  10. mate9 android原生包,华为Mate9 Pro官方固件rom刷机包_Mate9Pro系统包_升级包
  11. ubuntu 中的流程图绘制软件
  12. Communication(Floyed+并查集 || Trajan)
  13. 使用阿里云的ip地址查询服务-使用java调用ip地址查询服务
  14. 国内主流短信验证码平台收费价格对比「二」:亿佰云、秒嘀科技、极光短信、华信云通信
  15. 关于“u盘打开为空,但是占用空间”的解决方法之一
  16. Python3之基础语法
  17. 经典的期货量化交易策略大全(含源代码)
  18. potplayer清晰度设置
  19. android手机8g内存够用嘛,安卓手机8G内存和12G内存有啥区别?
  20. android 刷机原理,分区。

热门文章

  1. 高胜美------《笑拥江山梦》
  2. 个人计算机中的防病毒软件无法,为什么无法在计算机上安装360防病毒软件?
  3. 牛顿法与拟牛顿法求解比较
  4. 用分治法解决青蛙跳问题(斐波那契数列)
  5. 新疆计算机操作题,新疆维吾尔自治区教师计算机操作题复习套
  6. 2023年全国管理类联考综合试卷真题及解析
  7. 朴素贝叶斯-公园穿凉鞋问题的推导
  8. 虚拟机下ROS调用笔记本摄像头
  9. 数据库课程设计矿大_中国矿业大学选课系统
  10. 游戏模型制作的注意事项 项目模型规范总结