用MYJS实现动画效果

出自Manyou开发者指南

跳转到: 导航, 搜索

目录

描述

MYJS提供了一个强大的动画库,以便开发者用简短的代码改进其用户界面交互。所有运动都基于CSS实现,所以掌握好CSS将有助于你实现这些效果。

MYJS动画库丰富了当前的脚本库,并且使用习惯也是开发者所熟悉的。

看完下面的教程,并且在MYML开发者测试控制台动手试试,会帮助你更好的理解MYJS动画库是如何工作的。

基本动画

CSS样式过渡

示例代码:

<a href="#" onclick="Animation(this).to('background', '#ffff4b').go(); return false;">Highlight</a>

第一步通常是调用Animation类的构造方法,以一个对其施加动画效果的DOM对象为参数。然后就可以为其附加任意你想让其过渡到的样式了。比如在这个例子中,我们让背景色变成浅黄色。最后,使用go() 方法执行附加的效果。

也可以这样附加多个样式过渡:

<a href="#" onclick="Animation(this).to('background', '#ffff4b').to('color', '#00a000').go(); return false;">Highlight</a>

在这个例子中,我们同时变化了文字颜色和背景颜色,它们在同一个过渡中完成了。

方法to() 通常用来从当前的属性值过渡到指定的属性值。当然也可以使用from() 方法覆盖这种默认行为:

<a href="#" onclick="Animation(this).to('background', '#fff').from('background', '#ffff4b').go(); return false;">Flash</a>

当同时使用to() 和 from() 时,可以简写成这样:

<a href="#" onclick="Animation(this).to('background', '#fff').from('#ffff4b').go(); return false;">Flash</a>

另一种直接和CSS交互的方法是by(),它以一定的数量增加当前的属性值:

<a href="#" onclick="Animation(this).by('left', '15px').go(); return false;" style="position: relative; left: 0px">Move</a>

当你点击这个链接的时候,你会看到它以每次15像素的步长向右移动。

自定义持续时间

默认的动画持续时间是1秒,可以用duration() 方法自己指定,单位是毫秒:

<a href="#" onclick="Animation(this).to('color', '#ffff4b').to('#00a000').duration(5000).go(); return false;">Highlight</a>

块级对象动画

隐藏和收缩

使用MYJS动画库也可以为块级对象添加效果,比如显示或隐藏页面中的某一部分:

<div style="overflow: hidden" id="container"> <img src="http://uchome.developer.manyou.com/uchome/image/logo.gif" /><br /> <a href="#" onclick="Animation(document.getElementById('container')).to('height', '0px').to('opacity', 0).hide().go(); return false;">Hide this div</a>.</div>

注意div上的style="overflow: hidden",在这个例子中这是非常重要的。因为动画效果基于CSS,如果我们不指定overflow:hidden,高度将无法正常过渡。使用hide() 方法,会将目标对象的display属性位置为none;而在这个例子中,我们结合使用to() 方法,实现了漂亮的隐藏效果。

预防过渡中的文字换行

对一些块级元素进行尺寸过渡效果时,其中的文字会因为即时适应父元素宽度而不停调整其换行结构,这使得过渡效果不够流畅且不美观,可以使用blind() 方法预防这种情况的发生:

<div id="container"> 服务器返回的数据先被 Manyou 转换为 JSON 对象,然后再返回到您的 callback url。JSON 每个字段的名称将被加上前缀 "myml_",然后返回 MYML 代码。您可以通过使用 setInnerMYML 方法来将这些 MYML 设置到您指定的 DOM 对象上。<br /> <a href="#" onclick="Animation(document.getElementById('container')).to('height', '0px').to('width', '0px').to('opacity', 0).blind().hide().go(); return false;">Hide this div</a>. </div>

展现

完全展现一个div时,可以将其宽高分别过渡到’auto’,这样其宽高将自动计算,以适应其父元素,比如:

<div id="about" style="display: none">在您要将同一事件附加到相同类型的多个对象上时,此方法非常有用。举一个购物车的例子:当用户将鼠标移动到购物车中的某件商品上的时候,根据该商品的 ID ,您可以在另一个 DIV 中显示出该商品的相关信息,这样可以极大的增强用户体验。所以,正如您所看到的,在您需要显示一些额外信息的时候非常,事件是非常有用的。 </div> <a href="#" onclick="Animation(document.getElementById('about')).to('height', 'auto').from('0px').to('width', 'auto').from('0px').to('opacity', 1).from(0).blind().show().go(); return false;">点击这里展现</a>

在这个例子中,我们综合使用了很多MYJS动画库特性,将一个初始状态为display:hidden的div平滑展现出来。

高级特性

分步动画

前面的例子中往往是几种效果在一个动画过程中同时发生,而通常我们可能需要几个独立的动画过程顺序完成, 这时就应该使用分步动画:

<div id="about" style="display: none; border: 1px solid #bdc7d8; padding: 0px 3px">经过对百款应用试用和了解,我们提醒您注意在设计应用时必须考虑到隔离非本站用户的数据,保持应用在各个站点的独立性。通过 Manyou 平台应用可能被大量的站点选用安装,因此接受到 Manyou 平台返回的数据也是来自不同的站点。而这一特性和以往应用只服务于某个站点,并仅接受一个站点返回数据有着很大的区别。下面的内容我们将详细阐述这个问题的原由和解决方法。</div> <a href="#" onclick="Animation(document.getElementById('about')).to('height', '0px').from('0px').to('width', 'auto').from('0px').show().blind().checkpoint().to('height', 'auto').blind().go(); return false;">分步动画</a>.

这样一来动画就分步进行了,高度调整紧跟着宽度调整后进行。只要使用了checkpoint() 方法,可以设置任意多个的分步。

交错分步动画

checkpoint() 方法还提供了一个参数,该参数是一个范围在0到1内的数字,表示后续动画在先前动画完成到百分之几时发生。其默认值是1,所以在前面的例子中我们看到的是等待先前动画完全结束后,后续动画才发生。

<div id="container">经过对百款应用试用和了解,我们提醒您注意在设计应用时必须考虑到隔离非本站用户的数据,保持应用在各个站点的独立性。通过 Manyou 平台应用可能被大量的站点选用安装,因此接受到 Manyou 平台返回的数据也是来自不同的站点。而这一特性和以往应用只服务于某个站点,并仅接受一个站点返回数据有着很大的区别。下面的内容我们将详细阐述这个问题的原由和解决方法。<br /> <a href="#" onclick="Animation(document.getElementById('container')).to('height', '0px').duration(5000).blind().hide().checkpoint(0.5).to('opacity', 0).duration(500).go(); return false;">交错分步动画</a>. </div>

本例中,高度调整 to() 动画完成一半(0.5)时,隐藏 hide() 动作才发生。

有callback的分步动画

分步动画方法checkpoint() 的第二个参数是callback,从而可以使其触发其他动画,或进行相关任务:

<div id="container">由于UCenter Home被设计成可以在几乎任何支持PHP/MySQL的虚拟主机或服务器上使用,而应用开发者通常又需要大量频繁存取UCenter Home上的相关数据,以使得应用能够和UCenter Home用户网站紧密的整合,成为网站的一部分。<br /> <a href="#" onclick="Animation(document.getElementById('container')).to('width', '0px').to('height', '0px').to('opacity', 0).blind().hide() .checkpoint(1, function() { Animation(document.getElementById('next')).to('width', 'auto').from('0px').to('height', 'auto').from('0px').to('opacity', 1).from(0).blind().show().go(); }) .go(); return false;">callback分步动画</a> </div> <div id="next" style="display: none">因此,考虑到UCenter Home复杂的服务器环境及UCenter Home安装服务器运算能力、存储能力的限制,MYOP致力于分担UCenter Home服务器的数据存取压力,使得应用开发者能够尽可能不受到速度影响的,充分使用API接口满足自身需要。 </div>

实际上在这里我们创建了一个嵌套的动画。外层的动画隐藏了一个div,当它完成时,内层的动画显示出另一个div。

擦除

默认的过渡动画是线性的,也就是整个动画过程以一个匀速进行。我们可以使用ease() 方法:

<div id="container">MYOP由较强运算能力的服务器集群构成,通过对UCenter Home用户网站数据的缓存及分布式处理,保证应用开发者对API响应速度的需求。由于MYOP与UCenter Home用户网站服务器只使用较为简单的数据同步和触发机制,同时确保无论API如何被应用调用,基本都不会影响到用户网站服务器的稳定运行。<a href="#" onclick="Animation(document.getElementById('container')).to('height', '0px').to('width', '0px').to('opacity', 0).duration(1500).blind().hide().ease(Animation.ease.end).go(); return false;">擦除</a>. </div>

在这里,可以看到动画开始的比较快,而快结束时,速度会减缓。

ease() 方法的几种基本参数有 Animation.ease.begin (缓始快终),Animation.ease.end (快始缓终) 和Animation.ease.both (缓始缓终 中程加速)。

自定义擦除函数

也可以自定义擦除的行为函数,其参数为当前过渡行为所进行到的百分比,返回值亦然,范围在0到1内。

比如我们可以自定义一个弹跳效果:

<div id="container">同时,MYOP能在一定程度上解决同一个应用运行于不同版本的UCenter Home上的兼容性问题。MYOP与UCenter Home之间的专有API接口,将尽可能的考虑不同版本UCenter Home的差异性问题,使得应用开发者不必过多受到UCenter Home版本差异性的困扰。但不可避免的是,如同所有软件产品一样,随着技术的发展,在UCenter Home产品架构进行重大升级或调整的情况下,有可能应用开发者仍然需要进行一些版本适配的工作,以确保应用可以完好的运行于新的产品中。 <a href="#" onclick="Animation(document.getElementById('container')).to('height', '0px').blind().hide().ease(bounceEase).go(); return false;">弹跳擦除</a>. </div> <script> function bounceEase(p) { if (p <= 0.6) { return Math.pow(p * 5 / 3, 2); } else { return Math.pow((p - 0.8) * 5, 2) * 0.4 + 0.6 } } </script>
个人工具
接口文档