前戏
为何要写这篇文章

接下来因工作调整,应该就很少接触 H5 开发了。借此机会总结对动画的一些个人思考。

本文贴合实战,会结合笔者为数不多的开发案例进行讲解?。最后,也会提供相应文件让你实践。

为何“别人”实现的动效恰到好处?
同一份设计稿给到不同开发者,结果可能千差万别。而结果主要由两部分体现——内在与外在。『内在』指的是代码质量、性能优化,『外在』则指的是视觉还原度和动效(交互)。

其中对于更直观的『外在』来说,视觉还原度高是前提,真正体现差距的是『动效』。因为设计师一般只给到“静态”的视觉稿,而无动画演示,更不用说提供动效搞(如 AE)了。

在这种情况下,页面的动效更多是由前端开发者自由发挥。因此对动效有钻研的同学优势尽显。他们积累了一定理论知识和经验。我也曾问过这些同学,他们大多回答是:“多试多调”。因此,在设计师无『动效稿』提供的情况下,都需要花时间慢慢调整,以达到各方(自己、设计师、产品和需求方等)满意。若没有设计、动效等相关知识的学习与积累,恐怕是一只『没头苍蝇』。

关于动画的理论方面,笔者并没有积累,但推荐一些不错的资料(或许需要梯子)。同时也希望得到读者们的有效补充:

动画的十二原则——12 Principles of Animation (Official Full Series)
动画的第一步是『观察』——Exploring Animation And Interaction Techniques With WebGL (A Case Study),译文>>
其实可以把『锅』扔给设计师
大多数前端开发者在设计和动效方面并没有太多积累,因而难以做出令人拍手称赞的效果。其实,这是设计师(或动效设计师)所擅长的领域,可从下表查看两者的对比:

  • 设计师 前端开发 备注
    是否擅长动画 大部分 少部分
    如何生产动画 GUI 工具,如 AE 编写代码
    效益 高 低 体现在以下几个方面:
  1. 专业度
  2. 实现效率:可视化 > 编写代码
  3. 沟通成本
  4. 各方满意度

  5. 从上表可得,将『动效设计』交给设计师能显著提高效益。从实际工作流程上说:

设计师与前端开发的排期由『线性』变为『部分重叠』:设计师交付静态视觉稿后,前端开发就能进行视觉还原,设计师此时即可进入动效设计。
设计师将动效设计导出为视频,提前取得各方满意度,避免开发期间的反复沟通修改。
假设达成以上共识后,剩下的问题就是:如何还原『动效稿』?

apple 洗衣机
补间动画——Apple 逐帧动画——洗衣机
设计师输出的动效演示

注:全文『动效稿』均基于 Adobe After Effects(简称 AE)设计。

AE 到 Web 实现
其实,与『制造业』一样,实现方式就两种:

机械:通过工具直接导出
手工:手动取参数,通过掌握的 Web 技术实现
两者的优缺点比较:

  • 机械 手工
    效率 高 低
    精度 高 视情况而定
    定制化 低 高
    情怀 无 因人而异
    机械实现
    机械代表着“未来、高效”。业界出现了很多优秀的工具,使得在浏览器渲染复杂动效成为了可能,且极大地提高了效率。

代表工具有:

Bodymovin 是 AE 的一个插件,用于将 AE 导出为 Web 动画(HTML、SVG 或 Canvas),仅支持 AE 部分特性。
lottie-web 是 Airbnb 团队的一个用于在 Web、Android、iOS 和 React Native 渲染 AE 动画的库。
可是『世界上本来就没有十全十美的东西』。机械化生产可能未必满足所有要求,生产环境上的要求就更加苛刻了。主要体现在:机械化生产导致介入难度高。若出现以下问题就难以解决:

兼容性
在动画过程中插入自定义逻辑
工具自身的不完善
文件体积要求

无论如何,『机械化』是未来,期待它以完美的姿态到来。

手工实现
手工代表着“自定义、可控性”。无论世界如何工具化,总有一些人保持着对『手工』的热情。

『手工』意味着从无到有的过程。需要我们参与这个过程的每一步。这也就使得我们拥有了很强的自定义能力。这恰恰是『机械化』目前所不具备的特性。这也是本文重点阐述的内容。

基于 AE 手工实现 Web 动画的主要工作有两个:

在动效稿上拿到元素的参数信息,如 x/y/z、rotation 等
通过适当的 Web 技术进行实现,如 CSS3/Canvas/SVG 等
如何手工取参
Web 动画一般分为 逐帧动画 和 补间动画。

显然,对于取参操作来说,逐帧动画比补间动画的工作量要大得多,但两者操作一致。所以下面以 补间动画 Apple 为例:

打开 apple.aep 文件,AE 界面如下:

AE 界面
AE 界面

点击『信息模块』预览面板的播放按钮或拖动『时间轴模块』的 标记3 即可预览动画。

根据 CSS3 animation 属性,我们需要获取以下信息:

动画持续时间 animation-duration
关键帧之间的缓动函数 animation-timing-function
动画延时时间 animation-delay
为了方便阐述,我们选取整个 Apple 动画中一个小圆圈(共 60 个)为代表,其余元素同理。
另外,由于该动画是一次性的,无需设置/获取动画的重复次数(animation-iteration-count)、运动方向(animation-direction)。

现在我们把目光投向『图层、运动模块』的 标记1:

fps
标记1——FPS

由上图可得,FPS 为 12,即 1 秒 12 帧, 1 帧 0.0833 秒。

由上面 Apple 动画 可看出,每个圆的延时时间(animation-delay)、缓动函数(animation-timing-function)和持续时间(animation-duration)均不相同。换句话说,每个圈都是一个独立的补间动画,所有元素组合起来才是一个完整的补间动画。

双击『标记 2』,进入编组以查看每个圆的信息。

子元素——圆
子元素——圆

在『查看器』或『图层、运动模块』任意选中一个圆,展开其 变换 属性并单击 位置(标记1),即可显示右侧的元素运动路径(标记2)。同时这也反映了属性的变化速率(即缓动函数(animation-timing-function),这方面会在后面详解。

位置 前面的时钟图标为蓝色时,代表有过渡动画。

某个圆的时间轴
某个圆的时间轴

结合上面知识,可从上图得出以下信息点:

该元素共有 4 个关键帧
只有 Y 轴上发生位移运动(绿线),X 轴上则是静止状态(红线)
延时时间为 1 帧
中间停留时间(第2、3 关键帧之间)为 1 帧
过渡时间为 42 帧(3 * 12 + 7 - 1)。注意要减去延时时间(1),因为 02:03 包含了它。下同。
因此,我们基于 CSS3 animation 实现该元素的补间动画:

1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* 默认定位在第2(或3)帧以让元素默认显示屏幕内,便于开发调试。 */ .circle-29 { width: 60px; height: 60px; background-color: rgba(0, 224, 93, .7); position: absolute; left: 473px; top: 348px; border-radius: 50%; animation-name: circle29; animation-duration: 3.5s; /* 42 * (1 / 12) */ animation-delay: 0.0833s; /* 1 * (1 / 12) */ animation-fill-mode: both; animation-timing-function: ease-in-out; }

@keyframes circle29 {
0% {
transform: translate3d(0, 1175px, 0);
}
61.90% { /* (2 * 12 + 3 - 1) / 42,注意要减去延时时间(1),因为 02:03 包含了它。下同。*/
transform: translate3d(0, 0, 0);
}
64.29% {
transform: translate3d(0, 0, 0);
}
100% {
transform: translate3d(0, -1225px, 0);
}
}
这样就完成了某个圆的补间动画了。虽然繁琐,但是省去反复试验的时间,基本做到一次开发即可使各方满意的效果。

其余元素按照以上步骤执行即可完成整个动画。

假设没有动画演示和动效稿,仅凭借着个人感觉,编码完成一个由 60 多个元素组成的动画,简直难于上青天(对于笔者来说)。

也许你对 animation-timing-function 存在误解
细心的读者可能发现:如果第 1、2 帧和第 3、4 帧的缓动函数不相同时,该怎么办?

首先部分人可能对 animation-timing-function 存在误解:它是作用于整个 @keyframes 规则的。❌

对 timing-function 的错误认识

其实缓动函数是作用于 @keyframes 规则内的关键帧。若未为关键帧指定 animation-timing-function,则会从其元素取得 animation-timing-function。

更严格地说,缓动函数是应用在属性上,从定义该属性的关键帧到下一个指定同样属性的关键帧。若后续无指定该属性的关键帧则到动画结束。因此,在 100% 或 to 关键帧上指定 animation-timing-function 是无用的。

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.box {
width: 100px;
height: 100px;
background-color: #6190e8;
animation: move 2s ease both;
}

@keyframes move {
0% {
animation-timing-function: linear;
transform: translateX(0);
opacity: 1;
}
50% {
opacity: .5;
}
100% {
transform: translateX(100px);
opacity: 1
animation-timing-function: ease-in-out; /* 无用多余 */
}
}
在 0% 关键帧中指定的 animation-timing-function: linear 是对 transform 和 opacity 属性有效。但因为 50% 关键帧未指定 transform 属性,所以 animation-timing-function: linear 对它生效至有指定 transform 属性的关键帧,即 100%。

另外,由于 50% 关键帧未指定 animation-timing-function,所以它会使用 .box 元素上指定的 ease 缓动函数。

总上所述,可在关键帧上指定不同的缓动函数,以满足关键帧间属性的不同变化速率。

更强大的 cubic-bezier
细心的读者可能又发现:缓动函数碰巧是 预定义的关键字,如果是以下这种情况呢?

复杂的缓动函数

显然浏览器预定义的关键字无法表示该类型的缓动函数,但浏览器提供了强大的 cubic-bezier() 方法。翻译过来就是三次贝塞尔曲线。因此,我们可以通过该方法自定义缓动函数。

想了解贝塞尔曲线的更多知识,可阅读 《贝塞尔曲线扫盲》。

AE 时间轴 上呈现的是属性的变化路径,其未必与变化速率(即缓动函数)完全一致。因为它们的 X/Y 轴含义不同。

AE 与 CSS3 animation 对比

如上图所示,AE 是属性随着时间而变,CSS3 animation 是动画进度随着时间而变。然而属性的变化是有方向的,动画进度是永远向前的。

举个例子:

AE:
AE 的时间轴
AE 属性变化是有方向的

对应 CSS3 animation-timing-function:
CSS3 animation
动画进度永远是向前的

如上面二图所示,下图是上图的速率变化(缓动函数)。理清 AE 与 CSS3 animation 的对应关系后,剩下的问题就是:如何通过 cubic-bezier() 表示图中的 CurveA 与 CurveB。

也许有工具可从 AE 直接导出(欢迎读者们提供链接),但本文为了简单起见,推荐使用 Ceasar 或 Cubic-Bezier.com 这类可视化工具直接模拟生成。

因此,上述补间动画的缓动函数可表示为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@keyframes ae2css {
0% {
animation-timing-function: ease-out;
}
23% {
animation-timing-function: ease-in;
}
50% {
animation-timing-function: cubic-bezier(0.5, 0, 0.5, 1.5);
}
76% {
animation-timing-function: cubic-bezier(0, 0, 0, 1);
}
100% {
}
}
总结
本文基于实际案例总结出 AE 到 Web 动画的实现方法。相对于『无动效稿』的反复编码尝试,该方法无疑能提高效益。当然,『手工』不能胜任复杂的动画(如 SVG 的变形动画(Morphing)),并且低效。因此,业界也在『机械/工具化』方面不断推陈出新,涌现出许多优秀的工具,让复杂的动画在各终端上得以表现。无论如何,学习更多知识总没错!

原文链接

https://aotu.io/notes/2018/03/06/ae2web/

服务推荐

  • 蜻蜓代理
  • 代理ip
  • 微信域名拦截检测
  • 微信域名检测api

动画:从 AE 到 Web相关推荐

  1. 文本动画过渡效果AE模板

    MotionArray Exciting Opener是一套非常整洁的现代文本动画时尚过渡效果After Effects模板.文本动画过渡效果AE模板具有时尚的设计,无需任何插件即可使用,你可以用于各 ...

  2. AE484 3D大气电影风格LOGO视频片头爆炸烟雾粒子碎片特效动画制作ae模板

    AE484 3D大气电影风格LOGO视频片头爆炸烟雾粒子碎片特效动画制作ae模板 模板用途:3D,动作,电影,云,史诗,爆炸,火灾,灯光,标志揭示,金属,神秘,粒子,反射,烟雾 软件版本:后效CS6~ ...

  3. AE493 10组卡通烟雾流体图形动画彩色文字字幕动画转场效果ae模板

    AE493 10组卡通烟雾流体图形动画彩色文字字幕动画转场效果ae模板 [ae模板介绍] 模板用途:2D.美女.卡通.色彩.趣味.个人品牌.幻灯片.烟雾.故事.风格.文字动画.标题.过渡 软件版本:后 ...

  4. android ae动画教程,AE动画转Web代码工具指北-Lottie

    简介 Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案,设计师可以使用 Adobe After Effects 设计出漂亮的动画之后,使用 Lottic 提供的 Bodymov ...

  5. css精灵列表使用实例,介绍一个导出CSS精灵图动画的AE小脚本

    作者:李威 在H5项目中如果有动画需求,一个常见的流程是设计师用 After Effect 制作动画,然后导出为序列帧. 序列帧就是一张张图片,快速连续播放就能成为动画,但是在H5里直接播放序列帧对网 ...

  6. 过渡效果_12个酷炫创意的动画过渡效果AE模板

    哈喽!大家好,这里公众号,Adobe素材助手. 小故障转换V4是一种快节奏且时尚的After Effects模板.它汇集了效果的惊人组合,构成了12种酷炫外观和富有创意的动画过渡效果.您可以使用它们在 ...

  7. 这文字的起始位置_ae制作文字动画?ae文字动画教程

    ae文字动画技巧教程: 第1步 创建一个新的合成,转到文件并选择一个新的合成 第2步 选择[T]文本工具 第3步 输入您的文字. 第4步 根据您的需要更改文本的颜色. 第5步 借助选择工具[V]调整文 ...

  8. 简单实用 铃铛运动动画制作AE教程

    铃铛的摆动是有一定幅度和要求的,我们要如何通过AE制作铃铛动画呢?接下来就给大家分享一波铃铛晃动的技巧. 铃铛晃动动画AE教程 1.在绘图工具中绘制铃铛本体和铛簧,选中之后导入AE: 2.铃铛本体锚点 ...

  9. 2021新年全屏标题动画素材ae模板

    Modern New Year Typography是一个很棒的After Effects模板,其中包含12个全屏标题动画的集合.您可以在各种不同的视频中使用这些动画,包括电视节目,商业广告,卡通,广 ...

最新文章

  1. STC89C52RC片内资源介绍
  2. php nsdata,在iPhone中加密nsdata并在php中解密
  3. 看到一个blog的标语,有意思!
  4. es搜索准实时的理解
  5. mysql 删除用户下的所有表_使用PL/SQL快速删除用户下的所有表数据
  6. 基金投资顾问制度即将启动,巨头入局
  7. Nicescroll用法
  8. 基于三维冲击波的变分理论--交通运输工程(一)
  9. 甲方在IT信息化中的项目管理
  10. 为什么C++开发不需要安装STL库
  11. python2安装biopython
  12. Maxcompute修改列名
  13. STM32:I2S驱动WM8978
  14. 屏蔽html查看源代码,禁止查看网页源代码方法
  15. 天池竞赛-金融风控-task1
  16. gdb 调试 PIE程序
  17. pycharm能不能编写Java_使用Pycharm编写第一个Python程序
  18. 太阳光轨迹软件_轻松画太阳视运动轨迹
  19. Hamming Codes
  20. 读书心得 | 软技能-代码之外的生存指南

热门文章

  1. 海蜘蛛软路由linux安装教程,软路由安装设置教程【详细步骤】-太平洋IT百科
  2. matlab2018a字体乱码怎么办,解决Matlab 2018a源代码的中文支持问题
  3. RN动画Animated
  4. fNIRS–EEG监测人脑活动和氧合作用的研究进展
  5. 什么是数据库?数据库有什么作用?
  6. hadoop学习之路(2)
  7. phpmywind 手机站多语言版本
  8. 前端Hack之XSS攻击个人学习笔记
  9. gtx1660是什么级别的_GTX1660相当于什么显卡 三月显卡天梯图秒懂GTX1660性能
  10. 涂涂乐的详细实现之三--文件IO操作