Web动画:学习使用API

转载自http://www.w3cplus.com/animation/web-animations-learning-to-love-the-api.html

如果你使用过SVG,你应该知道可以使用SMIL给SVG添加动画CSS Transitionskeyframes动画都可以操作CSS属性来添加动画。requestAnimationFrame() 使得浏览器可以在下一帧执行之前,请求一个动作。

但是每一中动画技术都不是完美的,各自有各自的问题。

现代浏览器正在逐步淘汰SMIL。Chrome也长时间多次表示要抛弃SMIL,而且既然Blink要改,Opera同理;IE11和Edge则从来都没有实现这块,我还没在Firefox中查找关于SMIL的支持情况。有一个SMIL Polyfill——Fake SMILE,但是它对于开发者期望它执行以及用在实际生产中是否合理?

关于SMIL详解,可以移步张鑫旭老师的博客文章 (づ ̄ 3 ̄)づ。

Transitions和animations一直都处在需要添加前缀的麻烦中。

浏览器厂商有时会在实验或非标准的CSS属性中添加前缀,所以开发者可以进行试验,但在标准进程中浏览器行为的改变并不会破坏代码。开发者应该等到引入无前缀的属性,直到浏览器行为标准化。 前缀(-webkit--moz--o--ms-)参考https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix

供应商前缀的问题是,为了支持尽可能更广泛的用户,它们很少会被抛弃。理论上当一项技术完全标准化的时候,浏览器厂商应该(或者说,必须)抛弃前缀,但是它们只针对当前版本做这样的支持,旧版本还是需要继续在代码中添加前缀。

所以,在定义CSS动画时,我们就必须像下面这样,添加不同的浏览器前缀以获得全面的支持:

@-moz-keyframes identifier {
  /* For Firefox */
  0% { top: 0; left: 0; }
  30% { top: 50px; }
  68%, 72% { left: 50px; }
  100% { top: 100px; left: 100%; }
}

@-webkit-keyframes identifier {
  /* Chrome, Opera and Safari */
  0% { top: 0; left: 0; }
  30% { top: 50px; }
  68%, 72% { left: 50px; }
  100% { top: 100px; left: 100%; }
}

@keyframes identifier {
  /* Standards compliant */
  0% { top: 0; left: 0; }
  30% { top: 50px; }
  68%, 72% { left: 50px; }
  100% { top: 100px; left: 100%; }
}

所以我们需要添加-ms前缀来覆盖微软系列的浏览器,以及-o来覆盖旧Opera浏览器,即Opera内核换成Blink之前的版本。

这就是Autoprefixer插件或好的自动化构建工具出世的原因,方便我们编写代码。

requestAnimationFrame()是一个非常棒的API,但是它所有的脚本都是在页面跑的,你只有16.6ms的时间将一切搞定,以让next frame加入。如果因为一些原因,脚本没有在规定时间内完成它们的工作,我们在动画方面就会有些紧张,缓慢和迟钝的脚本会阻塞页面上的一些活动。

了解Web动画API

Web动画API(WAAPI)是一个新的JavaScript API,旨在规范Web上创建动画的方式。我建议取代SMIL(这也是为什么SMIL会在Chrome和Opera中被抛弃的原因之一)和支持CSS Transitions及animations。

Alex Danilo在Google开发者大会介绍了Web动画API(WAAPI)。这是一个高水平的关于API的概述,关于它如何工作以及可以用于何处:

关于WAAPI的presentation,最让我着迷的是Rachel Nabors 2015年在SFHTML5的演讲。除了对Web animation非常多的激情,还给非技术观众做了相当好的讲解。

视频来自于YouTube,天朝同学浏览,请自备天梯。

所以现在我们对于WAAPI有了稍微更多的认识,接下来我们来看看如何使它工作。

它是如何工作的

这一节使用的是Dan Wilson的Web Animation API tutorial中的代码,中文译文见这里。 所有的Web动画实例都有3个组成部分。第一个部分是我们要添加动画的元素的.animate()声明。

var player = document.getElementById(‘toAnimate‘).animate()

动画函数接受2个参数。第一个是一个KeyframeEffects数组,设置你想让动画发生的位置,和CSS中的@keyframes声明相似。当我们看完整的实例时,就会发现区别。

每个属性的值需要和你如何在JavaScript中使用element.style指定的相匹配,如透明度opacity接受数字number,而transform接受字符串string

var player = document.getElementById(‘toAnimate‘).animate([
 { transform: ‘scale(1)‘, opacity: 1, offset: 0 },
 { transform: ‘scale(.5)‘, opacity: .5, offset: .3 }
 { transform: ‘scale(.667)‘, opacity: .667 },
 { transform: ‘scale(.6)‘, opacity: .6 }
‘], {});

第二个参数是一个时间函数列表。它会映射到CSS动画属性,尽管有时候名称略有不同。

var player = document.getElementById(‘toAnimate‘).animate([ ],
{
    duration: 700, //毫秒
    easing: ‘ease-in-out‘, //值为‘linear‘, 或贝塞尔曲线, 等等
    delay: 10, //毫秒
    iterations: Infinity, //或者为数字
    direction: ‘alternate‘, //‘normal‘, ‘reverse‘, 等等.
    fill: ‘forwards‘ //‘backwards‘, ‘both‘, ‘none‘, ‘auto‘
});

完整的实例如下:

var player = document.getElementById(‘toAnimate‘).animate([
    { transform: ‘scale(1)‘, opacity: 1, offset: 0 },
    { transform: ‘scale(.5)‘, opacity: .5, offset: .3 },
    { transform: ‘scale(.667)‘, opacity: .667 },
    { transform: ‘scale(.6)‘, opacity: .6 }
  ], {
    duration: 700, //毫秒
    easing: ‘ease-in-out‘, //值为‘linear‘, 或贝塞尔曲线, 等等
    delay: 10, //毫秒
    iterations: Infinity, //或者为数字
    direction: ‘alternate‘, //‘normal‘, ‘reverse‘, 等等。
    fill: ‘forwards‘ //‘backwards‘, ‘both‘, ‘none‘, ‘auto‘
  });

相比之下,相同的动画,使用keyframes完成如下:

@keyframes emphasis {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  39% {
    transform: scale(.5);
    opacity: .5;
  }
  78.75% {
    transform: scale(.667);
    opacity: .667;
  }
  100% {
    transform: scale(.6);
    opacity: .6;
  }
}
#toAnimate {
  animation: emphasis 700ms ease-in-out 10ms infinite alternate forwards;
}

这只是一点基础,我们将探讨更多语法方面,以及如何进一步提高。

浏览器支持情况?

很多新的JavaScript API,浏览器支持是不一致的。Chrome中对Web动画的支持是最好(原生)的(包括新Opera);Firefox对于API支持有限(查阅are we animated yet?文档),而Edge则正在开发。Safari则例外,没有提供支持(目前或者计划,都没有)。

支持API意味着很多问题。没有浏览器能够支持完整的规范,但是你可以使用下面的页面来测试你的浏览器支持哪些方面的API。

测试你的浏览器是否支持WAAPI

需要的polyfill

对于不支持规范(即不支持全部的功能)的浏览器,Github上有polyfill。polyfill有几个版本,我对web-animation-next这个版本比较感兴趣。它支持目前规范中拟议的功能,以及规范中尚在讨论的功能。

我们的实例中的所有功能,在Chrome中或者通过polyfill可以原生工作。

时间: 2024-08-05 08:51:02

Web动画:学习使用API的相关文章

Web动画API教程2:AnimationPlayer和Timeline

本文转载: Web动画API教程2:AnimationPlayer和Timeline

Web动画API教程3:多个动画

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-part-3-multiple-animations.html 在关于AnimationPlayer和时间轴的讨论之后,我们来看看多动画和多player吧. 给一个元素添加多个动画 在这个示例中,每个矩形被应用了三个动画(其中包括变换.透明度和颜色).你可以给一个元素多次调用animate(),类似CSS中的多动画. 使用的CSS: #toAnimate { animation:

Web动画API教程: 总结

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-animations-conclusion.html 我们前面已经讲解了很多内容,而且希望能够解决Web动画API到底是什么的问题.在总结这个系列时,我们将回顾一下我们已经讨论的内容,然后再看一下有哪些内容还没有实现的. 为什么这么费心API呢? 在第一篇的导论中就已经讨论了API是如何应运而生,为了将CSS.JS.SVG创建动画的方法糅合到一起,提取它们的优点,提供一种统一的方

Web动画API教程4:GroupEffects 及 SequenceEffects

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-part-4-groupEffects-and-sequenceEffects.html 我们来继续我们关于Web动画API中多动画的探讨,讨论一下现在polyfill中提供的分组和序列功能. KeyframeEffects KeyframeEffect传入三个参数:要添加动画的元素.关键帧数组.时间函数timing选项.这些参数都是我们之前使用element.animate()

Web动画API教程1:创建基本动画

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-part-1-creating-a-basic-animation.html 我们已经初步了解了统一web动画API的内容,但是我们还没有真正去对规范的细节进行探讨,所以现在开始吧. WAAPI为你提供了比你用于CSS动画更多的控件,但是在了解它们之前,我们先打一下基础:如何使用这个API创建一个基本的动画? 创建一个关键帧动画 如果你对CSS Transition和animat

Web动画API教程5:可爱的运动路径(Motion Path)

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-part-5-the-loveable-motion-path.html 终于.沿路径的动画,不再是SVG的专利! Motion Path:规范的当前方向 随着API规范已经制定好并且通过,运动路径motion path也先后出现了不同的形式.单方向最初看起来可能是Effect的形式(如上一篇中讨论的GroupEffect),但随后Motion Path作为一个CSS模块慢慢的一

Web开发之RSET API

REST介绍 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就不多说了.总之,Web是我们在互联网上最常用的服务,甚至在某些人的心中,互联网就是Web.当然,Web只是互联网的一部分而已,只是大家用的最多而已,我们访问的所有网站都是基于Web. 那么,Web和REST之间究竟有什么关系呢?我们接下来将聊聊组成Web的几大基础技术,URI(统一资源标识符,用来标

Android动画学习——Tween Animation

目录 目录 Android动画学习 Tween Animation scale动画调节尺寸 alpha动画调节透明度 rotate动画旋转 translate动画平移 Android动画学习 android中动画分为3种: Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生的动画效果,即是一种渐变动画. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画. Property Animation:属性动画,通过动态地改变对象的属性从而达

绘图与动画学习笔记(一)

1. 处理图形与动画的框架有 UIKit 高层次的框架,允许开发人员创建视图.窗口.按钮和其他UI相关的组件.它还将一些低级别的API引入到易于使用的高级别API中 Quartz 2D iOS上绘图的主要引擎:UIKit就使用Quartz. Core Graphics 它支持图形上下文.加载图像.绘制图像,等等. Core Animation 顾名思义,是一个帮助开发者在IOS上实现动画的框架 2. UIColor的set方法可设置Graphical context的颜色 - (void)dra