在现代前端开发中,动效和交互是让系统更加有生命力和高级感的主要手段。本文将从动效复杂度和交互复杂度两个维度,对各种前端动效实现方式进行全面分析,涵盖从静态图片到高级的 WebGL 技术,帮助开发者更好地选择合适的技术方案。
从上图看,在动效和交互两个方式对现在前端的动效实现方式进行一个分析:
- 动效:指的是动效的复杂度,动效元素越多,效果越多,动效越复杂。
- 交互:指的是动效部分与用户的交互复杂度,动效需要响应的用户交互越多,交互复杂度越高。
下面就逐一来分析一下:
静态图片
静态图片是大家比较常用的最基础的形式,,只能单纯的展示一张简单的图片内容,不具备动效和交互功能。
静态图片类型
JPEG/JPG
JPEG(Joint Photographic Experts Group)一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。
优点:
- 压缩率高,文件小,加载速度快
- 兼容性好,支持色彩丰富的图像
缺点
-
不适用于存储透明背景或图标类图像
-
压缩过度会导致图像质量下降
渐进式 JPEG
普通的jpg是从上往下加载图片的,在网络慢的时候尤为明显。
渐进式jpg文件包含多次扫描,这些扫描顺寻的存储在jpg文件中。打开文件过程中,会先显示整个图片的模糊轮廓,随着扫描次数的增加,图片变得越来越清晰。
看这里了解渐进式JPEG详情和如何生成:渐进式jpeg(progressive jpeg)图片及其相关 << 张鑫旭-鑫空间-鑫生活
优点
- 压缩率高,尺寸较小,打开速度快
- 兼容性好
- 色彩丰富
缺点
-
JPEG不适合用来存储企业Logo、线框类的这种高清图
-
不支持动画、背景透明
PNG
PNG(Portable Network Graphics)是一种无损压缩的位图图形格式,有 PNG-8,PNG-24,PNG-32 三种版本,不支持动画,支持背景透明。相对比GIF格式好的特点在于背景透明时,图像边缘没有什么 噪点 ,颜色表现更优秀。PNG-24其实就是无损压缩的JPEG。而PNG-32就是在PNG-24的基础上,增加了透明度的支持。
优点
- 不失真的情况下尽可能压缩图像文件的大小
- 像素丰富
- 支持透明背景(alpha通道)
- APNG 支持动画
缺点
-
文件大
-
无法控制播放进度
WebP
WebP 是一种同时提供了有损压缩与无损压缩的图片文件格式。它可让网页图片有效进行压缩,同时又不影响图片格式兼容与实际清晰度,进而让整体网页下载速度加快。
- 在无损压缩的情况下,相同质量的WebP图片,文件大小要比PNG小26%;
- 在有损压缩的情况下,具有相同图片精度的WebP图片,文件大小要比JPEG小25%~34%;
- WebP图片格式支持图片透明度,一个无损压缩的WebP图片,如果要支持透明度只需要22%的格外文件大小。
优点
-
同等质量更小
-
压缩之后质量无明显变化
-
支持无损图像
-
支持动画
-
更快的解码速度
- 和PNG相比,WebP的编码时间较长,是PNG的5倍以上,但解码速度与PNG差不多,甚至很多时候比PNG快。而WebP在编码时占用内存比PNG高25%,解码时比PNG低30%。
- 和GIF相比,WebP所用解码时间是GIF的57%。
缺点
- 兼容性较差,iOS 系统不支持。
静态 SVG
SVG 是一种基于 xml 的矢量图形格式,它将图像的内容指定为一组绘图命令,这些命令创建形状、线条、应用颜色、过滤器等等。SVG 文件是理想的图表,图标和其他图像,可以准确地绘制在任何大小。因此,SVG 是现代 Web 设计中用户界面元素的流行选择。
优点
- 可伸缩性,可以随心所欲地把它们做大或者做小,而不用牺牲质量
- 体积小,SVG 平均比 GIF、 JPEG、 PNG 小得多,甚至在极高的分辨率下也是如此
- 支持动画,更灵活,质量无与伦比
- 与DOM无缝衔接,SVG 可以直接使用 HTML、 CSS 和 JavaScript (例如动画)来操作
缺点
- SVG复杂度高会减慢渲染速度,对于性能有影响。
- 不适合游戏类等高互动动画
评分
静态都是单纯的展示,不存在交互和动效,因此在动效和交互的复杂度上都是0。
GIF
GIF图形交换格式是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。它实际上是一种压缩文档,采用LZW压缩算法进行编码,有效地减少了图像文件在网络上传输的时间。它是目前广泛应用于网络传输的图像格式之一。
优点
- 兼容性最好
- 优秀的压缩算法使其在一定程度上保证图像质量的同时将体积变得很小
- 可以实现动画效果
- 可设置透明色
缺点
- 仅支持8bit的索引色,也就是说只有256个颜色,会出现颜色失真的情况
- 像素点只有完全透明和完全不透明,无法展示有透明度渐变(雾状)的区域,动画还原度很低
- 动画文件太大
- 播放资源占用高:内存/CPU占用高
- 不支持播放进度控制
评分
GIF 支持简单的动画效果,但是画质较差,无法很好的支持复杂的动画效果,体积也偏大,在动效上给 10 分。
GIF 不能控制播放进度,在交互上只能通过 CSS/JS 做简单的显隐和变形,在交互上给 10 分。
APNG
APNG 全称是 Animated Portable Network Graphics
, 是 PNG 格式的动画扩展。APNG 的第1帧为标准PNG图像,剩余的动画和帧速等数据放在PNG扩展数据块里。这里有点类似于视频的关键帧,关键帧有完整的图像信息,而两个关键帧之间只保留了变化的信息。
简单来说,APNG 支持全彩和透明,无杂边问题.
优点
- 支持png的所有优点
- 支持动画
- 可以使用 apng-js 控制播放的进度和速度。
缺点
- 浏览器支持情况较差,需要使用 Canvas 兼容。
评分
APNG 支持简单的动画效果,复杂的动画会大大增大图片体积,影响页面加载,在动效上给 20 分。
使用 apng-js 可以控制 APNG 的播放进度和速度,有一定的交互性,在 交互 上给 20分。
Animated WebP
谷歌于2014年提出了 Animated WebP,拓展 WebP 使其支持动图能力。WebP 动图实际上是把多个单帧 WebP 数据简单打包到一个文件内。Animated WebP相比GIF支持更丰富的色彩,并且也占用更小空间,更适应移动网络的动图播放。
优点
- 有所有 WebP 的优点
缺点
- 兼容性较差,大部分手机都不支持
- 无法控制播放进度
评分
Animated WebP 基本和 GIF 差不多,动效显示效果上会好一些,给15分,交互上和 GIF 一样10分。
序列帧
序列帧就是把一个连续的动画的每一帧都拼成一张图片,但是通过调整显示位置,使用户看起来像是播放一个动画的效果。
优点
序列帧和 GIF APNG 等比较类似,但是不需要通过 canvas 等做兼容处理,还可以通过 JS 控制播放的进度和速度。
缺点
- 文件比较大,没有 APNG、GIF 等的压缩效果
- 很容易引发OOM
- 需要通过 JS 来手动控制播放
评分
和 APNG 差不多,在动效上给 20 分,在 交互 上给 20分。
SVG 动画
SVG的动画元素是和SMIL开发组合作开发的。SMIL开发组和SVG开发组合作开发了SMIL动画规范,在规范中制定了一个基本的XML动画特征集合。SVG吸收了SMIL动画规范当中的动画优点,并提供了一些SVG继承实现。
超级强大的SVG SMIL animation动画详解 << 张鑫旭-鑫空间-鑫生活
优点
- 体积小
- 矢量图,不依赖于像素,无限放大后不会失真。
- 能实现复杂的动效
- 可以监听 DOM 事件
缺点
- dom形式,涉及到动画时候需要更新dom,性能较低。
评分
SVG 动画可以实现很多比较炫酷的效果,在动效上比 图片形式丰富很多,在动效上给 50 分。
SVG 可以和 DOM 进行绑定,可以监听事件然后做一些交互,但是 SVG 本身并没有交互效果,在交互上给 30 分。
JS+CSS 动画
CSS animations 使得可以将从一个CSS样式配置转换到另一个CSS样式配置。动画包括两个部分:描述动画的样式规则和用于指定动画开始、结束以及中间点样式的关键帧。
较于传统的脚本实现动画技术,使用CSS动画有三个主要优点:
- 能够非常容易地创建简单动画,你甚至不需要了解JavaScript就能创建动画。
- 动画运行效果良好,甚至在低性能的系统上。渲染引擎会使用跳帧或者其他技术以保证动画表现尽可能的流畅。而使用JavaScript实现的动画通常表现不佳(除非经过很好的设计)。
- 让浏览器控制动画序列,允许浏览器优化性能和效果,如降低位于隐藏选项卡中的动画更新频率
CSS 和 JS 结合,可以做出很多复杂的动效,满足大部分的效果需求。
评分
CSS 动画是在 CSS 样式变动时形成类似补间动画的效果,动效还算丰富,和JS一起能达到较为复杂的动画效果,在动效上给 60 分,交互上 70 分。
视频
视频是静态类效果的巅峰,所有的动效都可以使用视频来展现,视频有以下几种类型:
视频类型
MP4
MP4(MPEG-4 Part 14)是一种数字多媒体封装格式,广泛应用于音频和视频的存储与传播。它支持多种编解码格式,因而适应性强,是目前主流的视频格式之一。
优点
- 广泛支持:几乎所有主流设备、浏览器和播放器都支持 MP4 格式。
- 压缩效率高:采用高级视频压缩技术(如 H.264),在保证画质的同时有效降低文件大小。
- 质量与文件大小平衡:既能提供高质量的视频,又保持较小的文件大小,适合流媒体传输。
- 支持多种流媒体特性:如快速定位(seeking)、章节划分和字幕。
缺点
- 对透明度支持有限:标准 MP4 不支持 Alpha 通道,因此无法展示透明区域。
- 格式 封装 较复杂:容易出现兼容性问题,尤其在不同设备或操作系统之间。
适用场景
-
在线流媒体(如视频网站的主流格式)
-
移动端和桌面端的视频播放
FLV
FLV(Flash Video)是一种 Adobe 推出的流媒体格式,主要用于互联网视频传输。它是一种轻量级封装格式,支持较高的压缩比和快速加载,早期常用于嵌入网页的视频播放。
优点
- 加载速度快:文件大小较小,适合低带宽环境下的流媒体传输。
- 兼容 Flash Player:可与 Flash 技术无缝集成,适用于网页视频的快速播放。
- 编码简单:使用常见的 H.263 或 VP6 编解码,处理成本较低。
缺点
- 兼容性差:现代浏览器和设备对 FLV 的支持逐渐减少,需额外插件(如 Flash Player)。
- 画质限制:不支持现代高级编解码器,导致画质和压缩效率不如 MP4 等格式。
- 安全隐患:依赖 Flash 技术,而 Flash 已被广泛认为存在安全问题且逐渐被淘汰。
适用场景
-
早期视频网站
-
老旧系统和低配置设备的视频播放
MOV
即QuickTime影片格式,是Apple公司开发的一种音频、视频文件格式,这也注定了该种视频格式只适合在IOS设备上播放,在安卓设备上无法播放。
另:苹果在WWDC 2019提出一种H.265支持Alpha通道的方案,基本原理是将H.265视频基础上增加一层alpha通道,最终封装为MOV格式,进行播放。
优点
- 支持高质量视频:支持多种高分辨率编解码器(如 ProRes),适用于专业视频制作。
- 多轨道支持:可以封装多个音频、视频轨道以及字幕轨道。
- 支持 Alpha 通道:部分编码(如 Apple 的 H.265 扩展)支持透明度通道,适合需要透明背景的视频。
缺点
- 跨平台兼容性较差:在 Windows 和 Android 系统上可能需要额外的编解码器支持。
- 文件较大:高质量编码使文件体积较大,不适合网络流媒体传输。
适用场景
-
专业视频编辑与制作
-
需要透明背景的视频
MKV
MKV (Matroska Video File
)是Matroska媒体系列的视频文件格式,Matroska最大的特点就是能容纳多种不同类型的影像编码、音频编码及字幕流,但在ios设备上不支持。
优点
- 支持多种 编解码器:几乎兼容所有主流音视频编码。
- 多流支持:可以封装多音轨、多个视频流以及多种字幕格式。
- 开源灵活:免费且开源,易于定制和扩展。
- 高压缩率:支持高效压缩算法,适合高分辨率视频(如 4K、8K)的封装。
缺点
- 部分设备兼容性不足:尤其在 iOS 系统上,需要额外安装播放器支持。
- 加载时间较长:文件复杂度较高,可能导致加载速度慢。
适用场景
-
高清电影和电视剧存储
-
多音轨和多字幕需求的场景
WebM
WebM是基于Matriska容器由Google开发的视频封装格式,由使用VP8或VP9视频编解码器压缩的视频流和使用Vorbis或Opus音频编解码器压缩的音频流组成。因此在安卓设备上支持较好,但在ios设备上无法播放。
优点
- 性能优越:专为网络流媒体优化,支持快速加载和低延迟播放。
- 高压缩比:在保持画质的同时提供极小的文件大小,适合低带宽网络。
- 免费开源:无专利费用,适合广泛传播。
- 支持现代浏览器:主流浏览器(如 Chrome、Firefox)对 WebM 原生支持良好。
缺点
- 设备兼容性有限:iOS 系统上的原生支持较差,需要第三方播放器。
- 功能有限:相比 MKV 等封装格式,灵活性较弱。
适用场景
-
网页视频流媒体
-
移动端视频播放
AlphaPlayer
AlphaPlayer 是一种支持透明度视频(Alpha 通道)的播放器技术,适合在视频中显示带透明背景的内容。其原理是通过双通道编码将颜色和透明度信息分开存储,最终在播放时合成透明视频。
优点
- 支持透明度:能够播放包含 Alpha 通道的透明视频,适用于叠加动效和高定制场景。
- 高性能:支持硬件加速,适合高帧率和高分辨率视频。
- 广泛兼容性:支持 Android 和 Web 平台,通过定制可支持更多设备。
- 适合复杂场景:可用于广告、特效和互动场景的视频需求。
缺点
- 实现门槛高:需要额外的播放器库支持,开发和维护成本较高。
- 封闭性较强:目前大部分实现依赖于特定厂商的定制技术(如字节跳动的 AlphaPlayer)。
适用场景
-
动画广告叠加展示
-
视频特效与透明背景视频播放
Canvas 动画
Canvas 是 HTML5 提供的一种用于在网页中进行动态绘制的画布。它通过提供一个绘图 API,允许开发者使用 JavaScript 绘制图形和动画。Canvas 动画是基于像素操作的动画实现方式,常用于游戏、动态图表等需要动态更新的场景。
优点
- 灵活性高:可以自由绘制任意形状、路径、文本和图片,适合实现复杂的动态效果。
- 性能较好:通过 GPU 硬件加速,支持较高帧率的动画效果。
- 兼容性好:主流浏览器均支持,适配广泛。
- 独立于 DOM:不需要频繁操作 DOM,避免了 DOM 操作的性能瓶颈。
缺点
- 难以控制交互:与 DOM 无天然关联,交互事件需要手动处理。
- 开发复杂度较高:需要手写大量绘制和更新逻辑。
- 分辨率依赖性:基于像素操作,图像放大可能失真。
评分
- 动效:80 分。Canvas 动画可以实现高度复杂的动态效果,但复杂动画实现成本较高。
- 交互:60 分。Canvas 不具备内置的交互能力,需要开发者自行实现。
WebGL
WebGL 是一种基于 JavaScript 和 HTML5 的技术,用于在浏览器中渲染 3D 图形。WebGL 的核心是 OpenGL ES 规范,通过硬件加速提供高性能的图形渲染能力,适合用于游戏、可视化和 VR/AR 应用等场景。
优点
- 性能强大:利用 GPU 进行硬件加速,支持高复杂度的 3D 动画和大规模场景渲染。
- 支持 2D 和 3D:可以渲染 2D 图形和 3D 场景,具有更广的应用范围。
- 跨平台:基于浏览器实现,无需安装额外插件。
- 生态丰富:有丰富的第三方库(如 Three.js、Babylon.js)可以简化开发。
缺点
- 开发复杂度高:原生 WebGL 接口较底层,开发者需要理解计算机图形学基础。
- 调试困难:由于绘制逻辑复杂,定位和解决问题难度较大。
- 代码量大:实现简单的效果通常需要编写较多代码,且需要着色器语言(GLSL)支持。
评分
-
动效:100 分。WebGL 动画几乎没有限制,可以实现从简单到极其复杂的动态效果。
-
交互:80 分。WebGL 与鼠标、键盘事件结合可实现多样化的交互效果,但需要额外开发逻辑。
Lottie
Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案,设计师可以使用 Adobe After Effects 设计出动画之后,利用 Bodymovin 插件将设计好的动画导出成 JSON 格式,就可以直接在Android/iOS、React Native 和 web 端实现相同的动画效果。
优点:
- 轻量级
- 支持高质量动画
- 跨平台,支持 Web、Android、iOS 等
缺点:
- 需要额外的 JavaScript 库来加载动画,可能导致性能问题
游戏引擎
可以参考这篇文章:HTML5游戏引擎深度测评