产品发布 · 开源格式

网站上的小动画一交互就顿一下?AVAL 想让预渲染视频听懂「悬停 / 点了 / 成功」

先说痛:网页上的立体小图标要会动、还要跟着鼠标和状态变,用普通视频很容易卡一下。AVAL 是给这种短动画用的专用格式和播放器。

pixelpoint.io/aval github.com/pixel-point/aval 许可 MIT 状态 技术预览
一分钟速览
  • 问题:网站上的小 3D 图标、收藏按钮这类「又短、又好看、还要可交互」的动画,用普通视频接循环和状态切换,容易顿一下;用 Lottie 又难塞复杂渲染画面。
  • 是什么:AVAL 是一种网页专用的交互视频格式(文件后缀 .avl)+ 浏览器播放器。动画状态写进文件里,页面只说「现在变成成功态」。
  • 凭什么顺一点:循环接缝尽量不「跳回去重播」;切换尽量卡在做动画时定好的那一帧;透明也能做;浏览器不支持就显示你准备好的静态图。
  • 现状:开源技术预览;可看官网演示、可 clone 仓库试。同类闭源思路外界提过(如 Airbnb Lava),AVAL 是可直接摸的开源实现。

立场提示:材料来自项目官网与 GitHub 文档,属于开源项目自述。下文拆问题和能力,不是第三方压测报告。

先说问题:网页小动画,好看和「能点」经常打架

一句话问题

你想在网页上放一段已经渲染好的短动画(比如 Blender 做出来的立体小图标),它要自己轻轻循环;鼠标移上去变个样子;点一下再变成「已收藏 / 加载成功」。用现在的普通视频做法,状态一变,画面就容易顿一下,甚至闪一帧。

为什么会疼?粗分三条:

  • 普通视频会「跳片」:循环到头要跳回开头;从「默认」切到「悬停」也常靠改播放进度。跳的那一下,解码器要重新找位置,肉眼有时就是顿一下。
  • 矢量动效工具(如 Lottie):适合线条、扁平 UI;一旦是复杂光照、毛发、立体材质的预渲染画面,就不好塞进去。
  • 状态逻辑散落在业务代码里:哪一段从第几秒播到第几秒、悬停触发什么,全靠开发手写。改一版动画,代码也要跟着改时间表。
旧做法体感

多段 MP4 来回切,或一个长视频改时间点。交互一多,就像在看碟时不停快进快退,接缝处容易露馅。

理想体感

动画自己知道有「默认 / 悬停 / 成功」几种状态。页面只通知「现在进成功」,过渡从哪一帧开始、能不能倒回去,由动画资源自己带着。

AVAL 冲的就是这种小而精的交互

看一段发布演示(约 37 秒)。抓住一件事就够:画面跟着交互换状态,尽量不像在拖视频进度条。 想上手点,去官网 pixelpoint.io/aval

发布演示。 草地 idle 等状态切换;站内 web 版便于播放。可交互原件见 官网

AVAL 到底是什么(用人话)

AVAL = 一种文件格式 + 一套编译/播放工具。

  • 美术 / 动效把短动画做好(视频或一帧帧图)。
  • 用编译器打成一个 .avl 文件:里面既有画面,也有「有哪些状态、怎么切」的说明书。
  • 网页里放一个播放标签 <aval-player>,指向这个文件。浏览器负责播;业务代码只说「切到 success」。
做好动画 Blender 等导出 短片 / 序列帧 打成 .avl 画面 + 状态说明书 编译器打包 网页里播 悬停 / 点击 只通知状态名 示意:业务不用再记「从第 1.2 秒播到 2.0 秒」,只记状态名字。
一条流水线。 复杂画面继续用你熟悉的 3D/预渲染;交互状态写进文件;网页变薄。

定位写得很窄:体积小、占 CPU 少,适合 Blender 一类做出的小图标动效。网站上又精致又短的交互动画,不是长视频,也不是电影。

官网列的那些能力,翻译成人话

下面按「你能感到什么」写。括号里保留官网关键词,方便你对照原文,正文先看中文就够。

1. 动画自带几种「身份」

比如默认、悬停、按下、成功。每种身份播哪一段,做动画时事先写好。页面只喊身份名字。后来的指令优先:你快速划过又划回来,以最新意图为准。

deterministic state graph · latest-wins

2. 切换尽量卡在该卡的那一帧

从默认切到悬停时,尽量从做动画时定好的画面帧开始过渡,少做随手掐一刀。可以「播完这段再走」「硬切」「走到一半倒回去」等写法。

frame-accurate routes · portals / finishes / cuts / reversals

3. 循环接缝尽量不「跳回去」

普通视频循环到头,播放器常把进度条拉回 0,这一下可能卡。AVAL 的目标是:接缝处继续往前接下一段同样的循环,减少这种硬跳。

seekless loops

4. 透明背景也能做

小图标通常要「抠掉背景」叠在网页上。普通视频格式对透明不友好。AVAL 用一种打包透明信息的办法,在网页里用图形接口拆开合成。

packed-alpha transparency · WebGL2

5. 尽量走浏览器自带能力

解码、上屏尽量用现代浏览器自带的视频解码和图形能力,不强制再塞一个很大的 WASM 播放器。

WebCodecs · WebGL2 · web-native runtime

6. 播不了就显示你准备的静图

浏览器太老、用户开了「减少动态效果」、机器扛不住时,露出你在网页里写好的备用图。备用图不塞进 .avl,永远属于你的页面。

progressive fallback · host-owned markup

默认 轻轻循环 悬停 另一段循环 鼠标移入 → 走过渡 鼠标移出 → 可原路退回 示意:状态名你自己起;过渡怎么播写在 .avl 里。
像给动画装了开关面板。 页面拨开关,动画自己知道怎么过渡。

你现在能怎么摸,以及别指望什么

想先看效果

官网 pixelpoint.io/aval 可直接试;或 clone 仓库跑 playground(见仓库文档)。当前是技术预览,会继续改。

想接进自己的网页(概念上)

集成时大概是这样(示意):

<aval-player src="/icon.avl" width="320" height="320">
  <img slot="fallback" src="/icon.png" alt="">
</aval-player>
// 业务只说状态名
await player.setState("success");
安装现状别写飞。 README 写了 npm 包名和 1.0.0,但 2026-07-16 查 npm 官方源时这些包还查不到(404)。以仓库和官网当天状态为准;真要试,优先走 GitHub 仓库,别假定 npm install 一定成功。

现在还别当真生产默认的原因

  • 仓库自标 technical preview,会快变。
  • TODO 仍写着:Safari 支持、React 封装、更多编码格式、更好看的演示等(有过 Safari 相关修复提交,是否算「已支持」以本机实测为准)。
  • 做动画的人要多学一步:除了出片,还要会标状态和切换规则;这不是「丢个 MP4 就完事」。
  • 浏览器能力参差:播不了就靠你准备的静图兜底,交互体验会降级。

先记住问题,再记产品:网页上那些「又短又精致、还要跟着交互变」的预渲染动画,旧办法容易顿。AVAL 想把画面 + 状态说明书打成一个文件,让页面只负责喊状态名。它现在能看、能 clone 试,但还是早期预览,别当成已经打磨完的行业标准。

主源:官网 · GitHub · 发布说明。文中 Airbnb Lava 仅作公开讨论过的对照,未做第三方核实。