Web Animations API为浏览器和开发人员提供了一种用于描述DOM元素动画的通用方法。实现网页DOM元素动画的方法有很多,最常用的是通过CSS3 transitions和CSS3 keyframes帧动画来实现。例如animate.css动画库。也有很多js插件可以实现DOM元素动画效果,例如Velocity。
有了Web Animations API,我们可以不依赖于CSS3或js插件,就可以制作出炫酷的网页动画效果。
创建动画
首先来看一个简单的例子,对比一下CSS3 keyframes帧动画和 js Web Animations API的动画效果。
请使用鼠标点击图形。
CSS keyframes
JS Web Animation API
通过CSS方法来创建动画
在上面的CSS3动画中,我们使用@keyframes
帧动画来制作,并通过animate
class类将动画应用到DOM元素上。
.animate { animation-name: move-and-change-color; animation-duration: 0.4s; animation-fill-mode: forwards; } @keyframes move-and-change-color { 0% { transform: translateX(0); } 80% { transform: translateX(100px); background-color: #2196F3; } 100% { transform: translateX(100px); background-color: #EF5350; } }
要在用户点击图形的时候产生动画效果,必须为DOM元素添加事件监听。
var square = document.getElementById('square'); square.addEventListener('click', function() { square.className += " animate"; });
以上是我们最常用的制作CSS3动画的方法,下面来看看 js Web Animation API给我们带来的改变。
通过Web Animation API来制作动画
我们可以通过CSS属性来描述JavaScript动画,例如:
var moveAndChangeColor = [ { transform: 'translateX(0)', background: '#2196F3' // 蓝色 }, { offset: 0.8, transform: 'translateX(100px)', background: '#2196F3' // 蓝色 }, { transform: 'translateX(100px)', background: '#EF5350' // 红色 } ];
在上面的声明中,数组中的每一个对象代表动画的一个状态。在定义好动画状态数组之后,我们就可以通过animate()方法来调用它。animate()
方法的第二个参数和CSS animation属性相似,用于指定动画的持续时间,动画的循环次数等。
var circle = document.getElementById('circle'); circle.addEventListener('click', function() { circle.animate(moveAndChangeColor, { duration: 400, fill: 'forwards' }); });
控制动画
Web Animation API允许我们对动画进行控制。animate()
方法会返回一个Animate对象,通过这个对象我们可以对动画进行控制。
var animation = elem.animate(transitions, options);
Web Animation API提供了下面的方法来控制动画。
- pause():暂停动画的当前状态。
- play():恢复动画或在动画结束时重新开始动画。
- reverse():反向执行动画。
- finish():跳转到动画结束处。
- cancel():停止动画并返回动画开始处。
下面是一个控制动画的小例子:
通过下面的按钮来控制动画。
上面的例子的js代码如下:
var spinner = document.getElementById('spinner'); var spinnerAnimation = spinner.animate([ { transform: 'rotate(0)' }, { transform: 'rotate(359deg)' } ], { duration: 1000, iterations: Infinity }); document.getElementById('pause').addEventListener('click', function() { spinnerAnimation.pause(); }); document.getElementById('play').addEventListener('click', function() { spinnerAnimation.play(); }); document.getElementById('reverse').addEventListener('click', function() { spinnerAnimation.reverse(); }); document.getElementById('cancel').addEventListener('click', function() { spinnerAnimation.cancel(); });
返回的Animate对象还包括一些有用的属性,例如当前时间,播放速度等。完整的属性列表可以参考MDN。例如下面的一个例子:
设置播放速度:
上面的例子的js代码如下:
var spinner = document.getElementById('spinner'); var spinnerAnimation = spinner.animate([ { transform: 'rotate(0)' }, { transform: 'rotate(359deg)' } ], { duration: 1000, iterations: Infinity }); document.getElementById('half').addEventListener('click', function() { spinnerAnimation.playbackRate = 0.5; }); document.getElementById('normal').addEventListener('click', function() { spinnerAnimation.playbackRate = 1; }); document.getElementById('double').addEventListener('click', function() { spinnerAnimation.playbackRate = 2; }); document.getElementById('triple').addEventListener('click', function() { spinnerAnimation.playbackRate = 3; });
另外,Web Animation API在动画结束或被取消时提供了2个有用的事件处理方法。
spinnerAnimation.addEventListener('finish', function() { // Animation has completed or .finish() has been called. doSomething(); }); spinnerAnimation.addEventListener('cancel', function() { // Animation has been canceled. doSomething(); });
浏览器支持
目前只有chrome和firefox浏览器支持Web Animations API,你可以通过caniuse来查看浏览器对Web Animations API的支持情况。