一、本堂课重点内容:
- 动画的基本原理
- 前端动画分类
- 实现前端动画
- 相关实践
二、详细知识点介绍:
1、动画的基本原理
-
帧率与人眼: 一般每秒10-12帧时人会认为画面是连贯的,这个现象称为视觉暂留。但是对于电脑动画和游戏来说,最好帧数要超过30。
-
动画的类别:
- 补间动画(关键帧动画):主画师绘制关键帧,然后再有专门的人或部门自动补充动画间的帧。对于浏览器来说,补充动画的可以是keyframe,transition。
- 逐帧动画:每一帧动画都要绘制出来。对于浏览器来说,如steps实现雪碧图。
2、前端动画分类
(1) css动画(transform)
css动画的种类
- translate(移动):两个参数,分别表示在x和y方向上的位移,可以是负数。若为百分比,则是相对于自身的宽度;一个参数时,指的是x方向上的移动距离。
- scale(缩放):两个参数,分别表示在x和y方向上的缩放比例,可以是负数,负数表示朝着向着反方向进行缩放。一个参数时,指的是x方向上的移动距离。
- rotate(旋转):一个参数,单位是
deg,即度数(区别于弧度) - skew(倾斜):两个参数,单位是
deg,分别表示水平和垂直方向上的倾斜角度。
css实现补间动画
-
transition:
<property> <duration> <timing-function> <delay>,即指定要变化的css属性、持续时间、变化函数和延迟。 -
keyframe:
@keyframe通过在动画序列中定义关键帧控制css动画的中间步骤,相对于transform会更灵活。如:@keyframe slidein{ from { transform: translateX(0%) } to { transform: translateX(100%) } }form to 可以换成 0% ... 100%
要想让keyframe生效,需要使用
animation属性,确定:- 动画名(上例中的 slidein)
- 动画时间
- 动画速度曲线
- 延迟
- 循环次数
- 是否反向播放动画
css实现逐帧动画
在animation属性中,使用steps函数,它有两个参数,分别表示分成的帧数和状态切换时的样式。
第二个参数可以填入两个值:start和end,默认end。
- start:保留下一帧的状态,直到这段动画时间结束。
- end: 保留当前帧的状态,直到这段动画时间结束。
css实现动画的特点
- 优点:简单、高效、声明式的,不依赖主线程,采用硬件加速(GPU)可以简单控制动画的播放与暂停
- 缺点:不能动态修改动画,不同动画间无法同步,动画间不能堆叠,即动画控制不够灵活;涉及到兼容性问题;部分效果(如复杂动画)无法实现。
- 使用场景: 简单的h5页面
- 推荐库:animation.css、shake.css
(2) SVG动画
SVG动画的实现方式 SVG时基于XML的矢量图形描述语言,实现方式一般有以下三种:
- SMIL(同步多媒体集成语言),原始的兼容性不好,不过多讨论
- JS: 一般是以下两个属性配合使用实现笔画效果。
- stroke-dashoffset:
<length> | <percentage>需要填充的路径 - stroke-dasharray:
<length> | <percentage>dash模式开始位置的偏移量
- stroke-dashoffset:
- CSS: 主要使用animation、transform、transition来实现动画,类似于css动画。
SVG实现动画的特点
- 优点:通过矢量元素实现动画,不同的屏幕下均可获得较好的清晰度。可以实现一些特殊的效果:描字,形变,墨水扩散等。
- 缺点:使用方式较为复杂,计算量比较大,过多使用可能会带来性能问题。
(3) JS动画
可以通过JS控制CSS的属性值,以实现动画,或者操作canvas上的API进行动画绘制。
JS实现动画的特点
- 优点:使用灵活,调节参数方便;可以进行多个状态的组合执行或联动。
- 缺点:调优不如CSS简单;对于性能和兼容性差的浏览器,JS需要写很多适配代码。
(4) 总结
- 为UI 元素采用较小的独立状态时,使用CSS。
- 在需要对动画进行大量控制时,使用JavaScript。
- 在特定的场景下可以使用SVG,可以使用CSS或JS去操作SVG变化。
3、动画实现
此处主要涉及到物理中物体的运动和几个API的使用,在此不再过多介绍。
4、工作实践
动画的优化
-
性能角度
页面的渲染过程一般是 JS > CSS > 样式计算 > 布局 > 绘制 > 渲染层合并。其中Layout重排和Paint重绘是最耗时的,应该尽量避免,最理想的渲染过程中是没有布局和绘制环节的。
在实际的应用里,最为简单的一个注意点就是,触发动画的开始不要用display:none属性值,因为它会引起Layout、Paint环节,通过切换类名就已经是一种很好的办法。translate属性值来替换top/left/right/bottom的切换,scale属性值替换width/height,opacity属性替换display/visibility等等
-
硬件加速
CSS3 硬件加速又叫做GPU 加速,是利用GPU 进行渲染,减少CPU 操作的一种优化方案。由于GPU 中的transform 等CSS 属性不会触发repaint,所以能大大提高网页的性能。 CSS 中的以下几个属性能触发硬件加速:
- transform
- opacity
- filter
- Will-change
-
算法优化
- 线性函数代替真实计算
- 何模型优化
- 碰撞检测优化
-
内存/缓存优化
-
离屏绘制
三、课后个人总结:
CSS中的动画涉及到的内容很多,老师在这么短的时间内讲解的内容可以给我们一些学习的总体方向和参考,涉及到的很多细节性的东西还是需要我们课下多去了解和学习的。