如何使用JavaScript控制CSS Animations和Transitions

JavaScript015

如何使用JavaScript控制CSS Animations和Transitions,第1张

控制CSS Animation(动画)

就像我们刚刚了解到的,我们可以看到与元素动画相关的事件:animationStart,animationIteration,animationEnd。但是如果我们想改变CSS animation(动画)执行过程中的动画,还需要一点技巧!

animation-play-state属性

当你想在动画执行过程中暂停,并且接下来让动画接着执行。这时CSS的animation-play-state属性是非常有用的。你可以可以通过JavaScript像这样更改CSS(注意你的前缀):

element.style.webkitAnimationPlayState = "paused"

element.style.webkitAnimationPlayState = "running"

然而当使用animation-play-state让CSS 动画暂停时,动画中的元素变形也会以相同的方式被阻止。你不能使这种变形暂停在某个状态,使它变形,使它恢复,更不用期望它能从新的变形状态中恢复到流畅运行。为了实现这些控制,我们需要做一些更复杂的工作。

获取当前keyvalue的百分比

不幸的是,在这个阶段没有办法获得当前CSS动画关键帧的“完成百分比”。最好的获取近似值的方法是使用setInterval 函数在动画过程中迭代100次。它的本质是:动画持续的时间(单位是毫秒)/100。例如,如果动画时长4秒,则得到的setInterval的执行时间是每40ms(4000 / 100)。

var showPercent = window.setInterval(function() {

if (currentPercent <100) {

currentPercent += 1

} else {

currentPercent = 0

}

// Updates a div that displays the current percent

result.innerHTML = currentPercent

}, 40)

这种做法很不理想,因为函数实际运行频率要远少于每40ms。我发现将它设为39ms更准确。但这个也不是好实现,因为它依赖于浏览器,并非所有浏览器下都能得到很完美效果。

获取当前动画的CSS属性值

在理想的情况下,我们选择一个使用CSS动画的元素,删除该元素当前动画再给它添加个新的动画,让它可以从当前状态开始新的动画。但是现实情况却很复杂。

下面我们就有一个演示,用来测试获取和改变CSS动画”中间流”的技术。该动画让一个元素沿一个圆形路径移动,起始位置在圆形的顶部中心(或称为“十二点”)位置。当按钮被单击时,元素的起始位置变成元素当前移动到的位置。元素会沿着之前相同的路径继续移动,只是现在“起始”的位置变成了你按下按钮时元素移动到的位置。通过在动画的第一关键帧把元素的颜色变成红色,来表示元素动画起始点位置发生了改变。

http://www.w3cplus.com/animation/controlling-css-animations-transitions-javascript.html

实现原理:

用 js 建立若干个小的 box,然后将搜索结果分别移位放置到 box 里面,然后预先定义一个时间,让预先定义好的 box 做一个移位,看起来像机器人变形。

或者,换一个角度讲:百度搜索结果的变形金刚可以看做:通过 js 建立一些 box,让 box 做变型,然后将搜索结果当做颜色一样填充在机器人表面!制作一个机器人变形不好玩!而百度这个微原创,是将搜索结果和机器人变形结合起来,看起来就有点意思了。

其实这样好玩的javascript 效果代码非常多!而让人感觉到耳目一新、有意思的创新是需要将那些“死代码”包装、整合起来的。

实现原理讲解出来是挺简单的,如果要程序员做这样一个动画,其实是很麻烦的。因为机器人变形是要预算算出来的,放在数组里面预定义好。像这样一个机器人变形,要用到接近600个数据。就像以前股沟网Google.com的logo特效,很多都是要预先存储很多数据,才能展现动画效果。

这也正是 js 动画迟迟没有发展的一个重要原因:js几乎没有处理图像功能,完全依靠css,浏览器自身的一些效果来模拟动画。而 flash 的as 因为有flash客户端 ,可以直接处理图像,处理矢量图像,制作动画是相当轻松。

历代变形金刚动画的集合

如下,分为美版和日版。附带了集数,日版附带了播放日期。

首先是纯美版的东西,按顺序排好。第一行是英文原文,第二行是为了汉语。

1.TRANSFORMERS (SEASON 1) 01-16

变形金刚(第一季)

2.TRANSFORMERS (SEASON 2) 17-65

变形金刚(第二季)

3.TRANSFORMERS THE MOVIE

变形金刚 电影

4.TRANSFORMERS (SEASON 3) 66-95

变形金刚(第三季)

5.TRANSFORMERS (SEASON 4) 96-98

变形金刚(第四季)[注:即REBIRTH/重生]

6.THE TRANSFORMERS GENERATION 2

变形金刚 第二代 [注:即G2 集数不详]

7.TRANSFORMERS BEAST WARS (FIRST SEASON) 01-26

变形金刚 野兽战争(第一季)

超能勇士

8.TRANSFORMERS BEAST WARS (SECOND SEASON) 27-39

变形金刚 野兽战争(第二季)

超能勇士

9.TRANSFORMERS BEAST WARS (THIRD SEASON) 40-52

变形金刚 野兽战争(第三季)

超能勇士

10.TRANSFORMERS BEAST MACHINES (SEASON 1) 01-13

变形金刚 野兽机器(第一季)

猛兽侠

11.TRANSFORMERS BEAST MACHINES (SEASON 2) 14-26

变形金刚 野兽机器(第二季)

猛兽侠

12.TRANSFORMERS ROBOTS IN DISGUISE 01-39

变形金刚 伪装机器人

变形金刚 汽车人战记 [注:即RID 对应日版CAR ROBOT]

13.TRANSFORMERS ARMADA 01-52

变形金刚 舰队 [注:对应日版MICRON传说]

14.TRANSFORMERS ENERGON 01-51

变形金刚 能量体

变形金刚 能量争夺战 [注:对应日版SUPER LINK]

15.TRANSFORMERS CYBERTRON ROBOTS IN DISGUISE 01-51

变形金刚 塞博特隆 伪装机器人

变形金刚 塞博特恩传奇 [注:对应日版GALAXY FORCE]

下面是日本方面。还是首行原文,二行英文,三行翻译的,四行大家熟知的翻译。

1.戦え!超ロボット生命体トランスフォーマー 01-63 (1985.7.6-1986.11.7)

FIGHT!SUPER ROBOT LIFEFORM TRANSFORMERS

战斗吧!超级机器人生命体 变形金刚 [注:对应美版一二季]

2.スクランブルシティ発动编

SCRAMBLE CITY

紧急都市 发动篇 [注:日版独立单集OVA]

3.トランスフォーマー ザ�9�9ムービー

TRANSFORMERS THE MOVIE

变形金刚 电影

4.戦え!超ロボット生命体トランスフォーマー2010 01-30 (1986.11.14-1987.6.25)

FIGHT!SUPER ROBOT LIFEFORM TRANSFORMERS 2010

战斗吧!超级机器人生命体 变形金刚 2010 [注:对应美版第三季]

5.トランスフォーマー ザ★ヘッドマスターズ 01-35 (1987.7.3-1988.3.28)

TRANSFORMERS THE HEADMASTERS

变形金刚 头领战士

6.戦え!超ロボット生命体トランスフォーマー 英雄伝说编

FIGHT! SUPER ROBOT LIFEFORM TRANSFORMERS THE CHAPTER OF HERO LEGEND

战斗吧!超级机器人生命体 变形金刚 英雄传说篇

7.トランスフォーマー 超神マスターフォース 01-42/47 (1988.4.12-1989.2.28)

TRANSFORMERS SUPER-GOD MASTER FORCE

变形金刚 超神战士部队

变形金刚 隐者战士

8.戦え!超ロボット生命体トランスフォーマーV(ビクトリー) 01-38/44 (1989.3.14-1989-12.19)

FIGHT!SUPER ROBOT LIFEFORM TRANSFORMERS VICTORY

战斗吧!超级机器人生命体 变形金刚 V(胜利)

胜利之斗争

9.トランスフォーマーZ(ゾーン)

TRANSFORMERS ZONE

变形金刚 Z(地带)

10.超生命体トランスフォーマー ビーストウォーズ 01-26 (1997.10~1998.3)

SUPER LIFEFORM TRANSFORMERS BEAST WARS

超级生命体变形金刚 野兽战争

超能勇士 [注:对应美版第一季]

11.超生命体トランスフォーマー ビーストウォーズ 激突!ビースト戦士

SUPER LIFEFORM TRANSFORMERS BEAST WARS CRASH! THE BEAST WARRIORS

超级生命体变形金刚 野兽战争 激战!野兽战士

12.超生命体トランスフォーマー ビーストウォーズⅡ(セカンド) 01-43 (1998.4~1999.1)

SUPER LIFEFORM TRANSFORMERS BEAST WARS SECOND

超级生命体变形金刚 野兽战争 Ⅱ(第二部) [注:日本的美BW一季续作]

13.超生命体トランスフォーマー ビーストウォーズⅡ(セカンド) ライオコンボイ危机一髪!

SUPER LIFEFORM TRANSFORMERS BEAST WARS SECOND LIO CONVOY IN IMMINENT DANGER!

超级生命体变形金刚 野兽战争 Ⅱ 白狮擎天柱千钧一发! [注:日BW 2的电影版]

14.超生命体トランスフォーマー ビーストウォーズ ネオ 01-35 (1999.2~1999.9)

SUPER LIFEFORM TRANSFORMERS BEAST WARS NEO

超级生命体变形金刚 新野兽战争 [注:日BW 2的续作]

15.超生命体トランスフォーマー ビーストウォーズ メタルス コンボイ大変身!

超级生命体变形金刚 野兽战争 金属 擎天柱大变身! [注:擎天柱/CONVOY即黑猩猩]

16.超生命体トランスフォーマー ビーストウォーズ メタルス 01-26 (1999.10~2000.3)

SUPER LIFEFORM TRANSFORMERS BEAST WARS METALS

超级生命体变形金刚 野兽战争 金属 [注:对应美版二三季]

17.超生命体トランスフォーマー ビーストウォーズ リターンズ 01-26

SUPER LIFEFORM TRANSFORMERS BEAST WARS RETURNS [注:对应美版BM]

超级生命体变形金刚 野兽战争 归来 (2005.4.2~2005.10.1)

猛兽侠

18.トランスフォーマー カーロボット01-39 (2000.4.5~2000.12.20)

TRANSFORMERS CAR ROBOT

变形金刚 车辆机器人

(俗称)TF2000

19.超ロボット生命体トランスフォーマー マイクロン伝说 01-52

SUPER ROBOT LIFEFORM TRANSFORMERS LEGEND OF MICRON (2003.1.10~2003.12.26)

超级机器人生命体变形金刚 微型金刚传说

20.トランスフォーマー スーパーリンク 01-51+1 (2004.1.19~2004.12.24)

TRANSFORMERS SUPER LINK

变形金刚 超级合体

21.トランスフォーマー ギャラクシーフォース 01-52 (2005.1.8~2005.12.31)

TRANSFORMERS GALAXY FORCE

变形金刚 银河之力

日版夹在美版的顺序:美2-日2-美3,美5-日5至9-美6,美7-日12至14-美8。