WAAPI属性

发布于 大漠

上一篇文章中我们快速的了解了Web Animation API能做什么,也能使用Web Animation API制作类似CSS3 Animation实现的动效。但到目前为止,也仅仅就如此,并没有看到Web Animation API比CSS Animation有任何优势之处。那在这篇文章中,咱们来看看Web Animation API和CSS Animation明显性的区别。

当你调用element.animate(),会返回一个AnimationPlayer对象,然后动画开始播放。比如下面这样的一个示例:

假设将上面的动画赋值给一个变量player,我们就可以返回动画的方法(methods)、属性(Poperties)和Promises。

var player = eleAnime.animate(animeKeyframes, animeOptions);
console.log(player)

打印出来的结果如下图所示:

WAAPI属性

console.log(player.effect);

WAAPI属性

console.log(player.effect.timing);

WAAPI属性

掌握了其中的方法、属性等使用,将会发现Web Animation API的强大之处,也能更好的理解Web Animation API比CSS Animation有跟更强大的优势。接下来,一起来看看其方法和属性。

WAAPI属性

WAAPI对应的属性主要有:

接下来简单看看这些属性。

Animation.currentTime

Animation.currentTime可以获取和重置动画pause()play()的时间。比如下面这个示例:

可以在动画停止和播放时获取到其对应的Animation.currentTime:

var playerStop = function() {
    player.pause();
    console.log("Pause:" + player.currentTime);
};

var growPlayer = function() {
    player.play();
    console.log("Play:" + player.currentTime);
}

点击PausePlay按钮可以在控制器里输出其对应的player.currentTime时间:

WAAPI属性

除了可以获取.currentTime的值之外,还可以设置其值:

player.currentTime = player.effect.getComputedTiming().delay + player.effect.getComputedTiming().activeDuration / 2;

每次点击Play按钮,player.currentTime的值都是一样:

WAAPI属性

currentTime返回当前动画的所在的毫秒数。最大值为delay + (duration * iterations),当然,无限迭代的情况则没有最大值。

动画的播放速率会影响时间轴进行的速度。如果你设置的播放率为10,你的最大的currentTime保持不变,但是你会比时间轴快10倍。这个概念在早期的倒计时例子中也出现过。

因为currentTime是读/写属性,我们也可以使用它来跳转到时间轴上的某个点。它还可以让我们同步两个动画,如下面的示例所示。

Animation.effect

Animation.effect可以获取和重置动画effect。如上面的示例:

var effect = player.effect;

WAAPI属性

也可以设置effect

var effect = new KeyframeEffect(
    eleAnime,
    [
        {opacity:0},
        {opacity:1}
    ],
    300
);

WAAPI属性

Animation.id

Animation.id是用来设置或者获取动画的id名,其非常类似于CSS Animation中@keyframes的后的动画名称。就前面的示例来说:

player.id;

其打印出来的值是anime。那是因为我们在animeOptions中设置了id值为anime。其实也可以重新设置它的值:

player.id = "traslateAnimation"

打印出来就成traslateAnimation

Animation.playbackRate

Animation.playbackRate获取或设置一个动画的播放速度。动画提供了一个比例因子,将会改变动画timelinecurrentTime的变化比率。其初始值为1

另外,当playbackRate的值越大,速度越快;反之速度越缓存。

for (var i = 0; i < playBtn.length; i++ ){
      (function(j){
          playBtn[i].addEventListener('click', function () {
               player.playbackRate = j + 1;
            player.play();
      },false) })(i);
}

修改了playbackRate值后的动效如下:

playbackRate的值可以是0,也可以是正值或者负值。如果是负值将会扭转动画。

Animation.startTime

Animation.startTime返回或设置动画回放的开始时间。来简单的看一个示例:

function animateNewCatWithWAAPI() {  
  	var newCat = addCat();
  	var newAnimationPlayer = newCat.animate(keyframes, timing);
  	newAnimationPlayer.startTime = catRunning.startTime;
  	flex.appendChild(newCat);
}

效果如下:

上面显示的效果是根据@Rachel Nabors写的Cats animated with the Web Animation API效果改造的。

Animation.timeline

Animation.timeline用来获取和设置动画的timeline

player.timeline = document.timeline;

WAAPI属性

Animation.playState

Animation.playState是一个只读属性,会返回动画的状态。返回的值有五个idlependingrunningpausedfinished

console.log(player.playState); //"running"
player.pause(); //"paused"
player.play();  //"running"
player.cancel(); //"idle"... 跳到初始状态
player.finish(); //"finished"...跳到结束状态

来看一个示例:

tears.forEach(function(el) {  
  el.animate(
    tearsFalling, 
    {
      delay: getRandomMsRange(-1000, 1000), // randomized for each tear
      duration: getRandomMsRange(2000, 6000), // randomized for each tear
      iterations: Infinity,
      easing: "cubic-bezier(0.6, 0.04, 0.98, 0.335)"
    });
  el.playState = 'paused';
});
// Play the tears falling when the ending needs to be shown. 
tears.forEach(function(el) { 
  el.playState = 'playing'; 
});
// Reset the crying tears animations and pause them.
tears.forEach(function(el) {  
  el.playState = "paused";
  el.currentTime = 0;
});

Animation.finished

Animation.finished是一个仅读属性,允许你返回动画完成状态。比如下面的代码,其一直在等待,真到所有动画完成并且删除可动元素为止:

Promise.all(
  	elem.getAnimations().map( 
    	function(animation) { 
      	return animation.finished 
    	}
  	)
).then(
  	function() {
    	return elem.remove();
  	}
);

Animation.ready

Animation.ready将返回动画当前的Ready Promise对象。

player.pause();
player.ready.then(function() {
  	console.log(player.playState); // => running
});
player.play();

Animation.finishedAnimation.ready都涉及到了Promise。如果您对Promise方面没有任何了解,建议阅读@Dr. Axel Rauschmayer的《“Asynchronous programming (background)”》或者@Nicolás Bevacqua的《“ES6 Promises in Depth”》,另外@Dan Wilson的《Promises in Web Animations》对我们了解WAAPI中的涉及到Promise方面的有很大的帮助。有关于Promises更多的教程,可以阅读下面的相关文章:

总结

这篇文章简单的介绍了Web Animation API中一些属性以及其使用方法。通过这些属性可能帮助我们更好的对动画进行操作,也从文章的示例可以看到其特性以及优势。如果和CSS Animation相比,我想你也能体会出他们之间的差距了。如果你对这些属性了解透彻的话,你将能做出更优秀的动效。如果您有这方面的经验,欢迎在下面的评论中与我们分享。特别希望大家帮我指出文章不对之处。