在应用程序中使用动画会使应用显得更加生动,进而给用户带来良好的视觉效果。例如,当用户将某个项添加到列表时,新项不会立即出现在列表中,而是采用动画形式到达相应位置,并且列表中的其他项也采用动画形式移动到新位置,以便为添加的项腾出空间。这样的动画效果能够让用户更清晰地看到变化过程,而不是只能看到变化之后的结果。

应用程序的动画效果可以使用Windows动画库来创建,开发人员无需自己编写动画效果代码即可获得Metro风格的动画外观和效果。另外还可以通过设置页面元素的style对象的相关属性来创建。下面介绍几种常用的动画效果。

(1)展开动画和折叠动画

展开动画和折叠动画是Windows动画库中的动画效果。展开动画可以在视图中腾出空间以显示更多信息,例如,显示错误消息时会使视图中的其他内容发生移动,以便为该消息腾出空间;折叠动画可以隐藏附加内容,以便显示有关特定项的较少信息。

创建展开动画可以使用WinJS.UI.Animation命名空间中的createExpandAnimation函数来实现,这个函数有两个参数,一个是revealed,另一个是affected。其中,revealed是一个Object类型的对象,表示要被展开的元素;affected也是一个Object类型的对象,表示当展开revealed元素时位置需要移动的元素。createExpandAnimation函数会返回一个Object类型的对象,通过这个对象调用execute函数来执行已创建的动画。

创建折叠动画可以使用WinJS.UI.Animation命名空间中的createCollapseAnimation函数来实现,这个函数也有两个参数,一个是hidden,另一个是affected。其中,hidden是一个Object类型的对象,表示要被折叠的元素;affected也是一个Object类型的对象,表示当折叠hidden元素时位置需要移动的元素。createCollapseAnimation函数同样会返回一个Object类型的对象,通过此对象的execute函数来执行动画。

下面以一个应用程序为例,来演示如何使用HTML5和JavaScript创建展开动画和折叠动画。在这个应用程序中,可以以动画的形式向应用程序界面中添加一个界面元素,也可以以动画的形式从界面中移除一个元素。

新建一个JavaScript的Windows应用商店的空白应用程序项目,将其命名为ExpandAndCollapseApp。打开default.html文件,在body元素中添加一个h3元素、一个按钮和四个div元素。其中,h3元素用来显示页面标题"展开-折叠动画示例";四个div元素用于定义四个文本区,内容分别为"原区域1"、"扩展区域"、"原区域2"和"原区域3",其中内容为"扩展区域"的文本区初始时不显示;按钮则用来在应用程序界面中添加或移除内容为"扩展区域"的文本区,初始文本内容为"展开"。相应的HTML代码片段如下所示:

<body>

<h2 class="articleTitle">展开-折叠动画示例</h2>

<br />

<button id="runAnimation">展开</button>

<br />

<div class="area">原区域1</div>

<div id="expandedItem" class="area" style="display: none">扩展区域</div>

<div class="area affectedItem">原区域2</div>

<div class="area affectedItem">原区域3</div>

</body>

在上面的代码中,为了便于设计CSS样式和检索控件,在添加控件时为其设置了类名和ID。其中,设置h2元素的class属性值为articleTitle,内容为"原区域1"和"扩展区域"的两个div元素的class属性值为area,而内容为"原区域2"和"原区域3"的两个div元素的class属性值都是area affectedItem;按钮的id属性值被设置为runAnimation,内容为"扩展区域"的div元素的id属性值则为expandedItem。

为了控制应用程序界面的显示外观,在default.css文件中添加如下代码来控制default.html页面的布局。

/*设置h2元素的字体大小和在应用程序界面中的显示位置*/

.articleTitle {

font-size: large;

margin: 20px 15px 10px 45px;

}

/*为class属性值为"area"的元素设置样式*/

.area {

height: 50px;

width: 100px;

margin: 0px 15px 10px 70px;

text-align: center;

color: white;

background: #808080;

}

/*为id属性值为"runAnimation"的元素设置样式*/

#runAnimation {

border-color: gray;

border-width: thin;

margin: 0px 20px 15px 75px;

}

/*为id属性值为"expandedItem"的元素设置背景色*/

#expandedItem {

background: #00B6FF;

}

完成前台界面的布局后,应用程序界面效果如图19-23所示。

图19-23 前台界面效果图

布局好前台界面后,接下来介绍如何将一个内容为"扩展区域"的文本区在两个原区域之间添加和移除,并在此过程中配合展开和折叠动画效果。打开default.js文件,在"args.setPromise(WinJS.UI.processAll());"语句后添加如下代码,为"展开"按钮注册click事件的处理函数ExpandOrCollapse。

document.getElementById("runAnimation").addEventListener("click", ExpandOrCollapse);

以"runAnimation"为参数调用document对象的getElementById函数来查找id属性值为runAnimation的元素对象,并调用addEventListener函数为该元素对象,也就是"展开"按钮的click事件注册事件处理函数ExpandOrCollapse。

接着在default.js文件中的"app.onactivated = function (args) {...};"语句后添加"展开"按钮的click事件处理函数ExpandOrCollapse的代码。

function ExpandOrCollapse() {

var affectedElement = document.querySelectorAll(".affectedItem");

if (expandedItem.style.display === "none") {

ExpandItem(expandedItem, affectedElement);

runAnimation.innerText = "折叠";

}

else {

CollapseItem(expandedItem, affectedElement);

runAnimation.innerText = "展开";

}

}

在上面的代码中,首先以".affectedItem"作为参数调用document对象的querySelectorAll函数来查找class属性值为affectedItem的所有元素对象,并保存到变量affectedElement中。然后通过style对象中的样式属性display来判断id属性值为expandedItem的元素对象的显示状态,如果display属性值为none,说明id属性值为expandedItem的元素对象没有显示在页面中,则以expandedItem和affectedElement作为参数调用ExpandItem函数将其显示,并设置id属性值为runAnimation的元素对象的innterText属性值为"折叠",使得按钮的文本内容变为"折叠";如果display属性值不为none,说明 id属性值为expandedItem的元素对象已经显示在页面中,则以expandedItem和affectedElement作为参数调用CollapseItem函数将其隐藏,并将id属性值为runAnimation的元素对象的innterText属性赋值为"展开",使得按钮的文本内容变为"展开"。这里使用的ExpandItem和CollapseItem函数为自定义的函数,下面分别来介绍这两个函数的实现代码。

ExpandItem函数用来在应用程序界面中以动画的形式添加内容为"扩展区域"的文本区,该函数的代码添加在ExpandOrCollapse函数后,相应的JavaScript代码片段如下所示:

function ExpandItem(expansionElement, affectionElement) {

// 新建展开动画对象

var expandAnimation = WinJS.UI.Animation.createExpandAnimation(expansionElement, affectionElement);

// 设置待展开元素的样式属性

expansionElement.style.display = "block";

expansionElement.style.position = "inherit";

expansionElement.style.opacity = "1";

//执行展开动画

expandAnimation.execute();

}

代码中首先以expansionElement和affectionElement作为createExpandAnimation函数的参数新建一个展开动画对象expandAnimation,其中expansionElement和affectionElement分别表示要被显示的元素对象以及位置需要移动的其他元素对象,并设置expansionElement.style对象中的display和position样式属性值分别为block和inherit,这样expansionElement元素对象就会以区块的形式显示在界面中,而且定位方式与父元素相同,接着将opacity样式属性值设置为1,opacity属性表示元素的不透明度,取值范围为0~1,值越大不透明度越高。设置完成之后调用expandAnimation对象的execute函数来执行动画。

CollapseItem函数用来在应用程序界面中以动画的形式移除内容为"扩展区域"的文本区,该函数的代码添加在ExpandItem函数后,相应的JavaScript代码片段如下所示:

function CollapseItem(collapsionElement, affectionElement) {

// 新建折叠动画对象

var collapseAnimation = WinJS.UI.Animation.createCollapseAnimation(collapsionElement, affectionElement);

// 设置待折叠元素的样式属性

collapsionElement.style.opacity = "0";

collapsionElement.style.display = "none";

//执行折叠动画

collapseAnimation.execute();

}

可以看到,函数的实现代码与ExpandItem函数很相似,同样是首先以collapsionElement和affectionElement作为createCollapseAnimation函数的参数新建一个折叠动画对象collapseAnimation,不同的是,这里通过设置collapsionElement.style对象中的opacity样式属性值为"0"来隐藏id属性值为collapsionElement的元素对象,并将display样式属性重新赋值为none。

启动调试,当单击"展开"按钮时,内容分别为"原区域2"和"原区域3"的两个文本区先向下移动一个位置,然后内容为"扩展区域"的文本区会显示在腾出的位置中,同时按钮的文本由"展开"变为"折叠",运行效果如图19-24所示。这时再次单击按钮,内容为"扩展区域"的文本区消失,内容分别为"原区域2"和"原区域3"的两个文本区回到原来的位置,同时按钮的文本由"折叠"变为"展开",运行效果和图19-23所示的效果相同。

图19-24 单击"展开"按钮之后的效果

Win10系列:JavaScript 动画1的更多相关文章

  1. javascript动画系列第一篇——模拟拖拽

    × 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...

  2. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  3. 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

    CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...

  4. JavaScript动画知多少?

    今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户. JS如何制造出动画效果? 结合浏览器提供的 setInterval ...

  5. Javascript动画效果(三)

    Javascript动画效果(三) 前面我们已经介绍了速度动画.透明度动画.多物体运动和任意值变化,并且我们在Javascript动画效果(二)中介绍到我们封装了一个简单的插件雏形,接下来我们对前面的 ...

  6. Javascript动画效果(一)

    Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的 ...

  7. Javascript动画效果(二)

    Javascript动画效果(二) 在前面的博客中讲了简单的Javascript动画效果,这篇文章主要介绍我在改变之前代码时发现的一些问题及解决方法. 在前面的多物体宽度变化的例子中,我们给其增加代码 ...

  8. Javascript动画效果(四)

    Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下 ...

  9. [Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动

    经过昨天2dtoolkit系列教程一的推出,感觉对新手还有有一定的启发作用,引导学习使用unity 2dToolKit插件的使用过程,今天继续系列二——动画精灵的创建,以及背景图的无限循环滚动,在群里 ...

  10. 给力的轻量级JavaScript动画框架 - jsMorph

    jsMorph 是一个独立的轻量级 JavaScript 动画框架,可以用它来操纵多个 HTML 元素的样式,实现动画效果.此框架会自动检测起始位置.转换单位.调整渲染的速度,以此来获得更流畅的渲染体 ...

随机推荐

  1. scala中option、None、some对象

    转载:http://www.jianshu.com/p/95896d06a94d 1.option类型避免对象是空值,造成空指针异常. 2.None对象表示null,在没有对象返回时使用,some在有 ...

  2. 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits ...

  3. ZOJ 4053 Couleur

    4053 思路: 主席树 先分别求前缀和后缀的逆序数 然后要求某一段的逆序数,就可以根据前缀或着后缀根据容斥求出答案, 这样需要枚举这一段中的数,求之前或者之后有多少个比他大或比他小的数, 这个可以通 ...

  4. 第 3 章 镜像 - 016 - Dockerfile 常用指令

    Dockerfile 常用指令 1.FROM 指定base镜像2.MAINTAINER 设置镜像的作者,可以为任意字符串3.COPY 从build context 复制到镜像 COPY 支持两种形式: ...

  5. 最多的划分来使数组有序 Max Chunks To Make Sorted

    2018-12-01 11:05:46 一.Max Chunks To Make Sorted 问题描述: 问题求解: 由于没有重复,所以直观的来看对于每个遇到数,其能够被划分出来的前提是其前面已经有 ...

  6. echarts画中国地图并上色

    任务是画一个中国地图,并在指定区域上颜色,学姐说用arcgis画,乖乖,4个g的安装文件,算了, 还是echarts大法好..如果想熟悉这个牛X的工具,请移步https://www.w3cschool ...

  7. Go语言学习之3 流程控制、函数

    主要内容: 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings . strin ...

  8. 怎么从bam文件中提取出比对OR没比对上的paired reads | bamToFastq | STAR

    折腾这么多都是白瞎,STAR就有输出没有别对上的pair-end reads的功能 参见:How To Filter Mapped Reads With Samtools I had the same ...

  9. 圆的变化(自定义动画,及自定义UI)

    之前在面试的时候被问到过一个问题,如何实现一个圆沿着一条线由大到小 当时回答的含糊不清,现在已经明白怎么去实现 关键点:Paint,path,canvas 一种方法 在activity中去控制圆的x, ...

  10. hihocoder-1407 后缀数组二·重复旋律2 不重合 最少重复K次

    后缀数组不能直接通过Height得出不重合的公共串.我们可以二分k值,这样连续的Height只要都大于等于k,那他们互相间的k值都大于等于k.每个这样的连续区间查找SA的最大最小值,做差判断是否重合( ...