
本文目录
网页透明动画应该让页面本身的背景透出来。每一帧都固定带着黑底、白底、绿幕或画上去的棋盘格,无法得到这种效果。
这篇文章直接使用一份 AnimGen 导出的 WebM Alpha,不用 GIF 模拟结果。你可以先打开在线浏览器示例,也可以下载完整 HTML 示例包,拿同一组文件去自己的目标浏览器测试。
先看实际效果,再复制代码
示例把同一个角色视频分别放到浅色面板、深色面板和渐变 Hero 区域上。用三种背景做对照,可以马上确认背景是否真的透出来,也更容易发现只在某一种底色上暴露的边缘问题。
本文使用的文件实测数据如下:
| 素材 | 实测信息 | 用途 |
|---|---|---|
| 透明 WebM | VP8 Alpha、512 × 512、24 FPS、4.00 秒、1,611,685 字节 | 动画层 |
| PNG 海报图 | 512 × 512 RGBA、121,667 字节 | 初始画面与静态降级 |
我们使用 libvpx 解码了全部 96 帧,解码后的 Alpha 范围是 0–255;随后在 macOS 26.5.2 的 Chrome 152.0.7977.84 中打开页面,确认三个视频都能推进,而且透明像素下面的三种背景仍然可见。响应式页面也在紧凑的 500 像素宽度下完成了检查。
这些结论对应的是这份文件和这次环境。“浏览器支持普通 WebM”并不等于“它一定会正确显示 WebM Alpha”。MDN 当前的视频编码指南明确提到 Safari 不支持 VP8/VP9 视频的 Alpha 透明度,因此应把目标浏览器当成产品要求来验证,而不是猜测。
准备独立的 WebM 和 PNG
把动画和静态降级图当作两个真实文件保存:
public/
└── animation/
├── character-run.webm
└── character-run.png
PNG 应该是带真实透明通道的一帧,而不是棋盘格截图。下面就是示例使用的降级图;博客页面上看到的棋盘格来自图片查看器,文件里没有画入背景。
不要把普通 MP4 当作透明降级格式。常规 MP4 和最初的模型预览都是不透明视频;在 AnimGen 流程中,WebM Alpha、ProRes 4444、RGBA 帧和透明精灵资产是单独生成的导出结果。不同格式的用途见透明格式与播放兼容性。
先用渐进增强的 HTML
默认展示 PNG。浏览器表示可以播放 VP8 WebM 后再显示视频;媒体加载失败时,再退回 PNG。
<div class="animation-stage">
<img
id="character-fallback"
src="/animation/character-run.png"
width="512"
height="512"
alt="正在跑步的蓝色角色"
/>
<video
id="character-video"
width="512"
height="512"
muted
loop
playsinline
preload="metadata"
poster="/animation/character-run.png"
aria-label="正在跑步的蓝色角色"
hidden
>
<source
src="/animation/character-run.webm"
type='video/webm; codecs="vp8"'
/>
</video>
</div>
明确写出 width 和 height,可以在媒体加载前预留正确比例;playsinline 让移动端尽量在页面内播放,muted 让装饰性动画保持静音,preload="metadata" 则避免页面一打开就急着下载整段视频。MDN 的 <video> 元素说明记录了这些属性和 poster 的行为。
这里有一个容易踩的坑:写在 <video>...</video> 内部的文字或图片,主要是给不认识 video 元素的浏览器准备的。现代浏览器如果认识 <video>,却无法解码你提供的所有 source,内部内容不一定会按预期出现。所以更实用的方案是把 PNG 作为相邻的 <img>,再用错误事件切换。
用 CSS 把动画放到页面背景之上
透明像素会显示 .animation-stage 自己的背景:
.animation-stage {
position: relative;
width: min(100%, 32rem);
aspect-ratio: 1;
overflow: hidden;
border-radius: 1.5rem;
background: linear-gradient(145deg, #7c3aed, #0891b2);
}
.animation-stage > img,
.animation-stage > video {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
如果完整角色画布都要显示,使用 object-fit: contain;只有确定要裁切时才使用 cover。在复杂的 Hero 背景上可以用 CSS drop-shadow() 增加分离度,但验收原始边缘时应先关掉特效,避免阴影掩盖溢色或光边。
在视频和降级图之间安全切换
canPlayType() 可以帮助选择初始路径,但它只能说明浏览器对容器和编码的判断,不能证明 Alpha 一定会正确参与合成。
const video = document.querySelector("#character-video");
const fallback = document.querySelector("#character-fallback");
const playButton = document.querySelector("#play-character");
function showFallback() {
video.pause();
video.hidden = true;
fallback.hidden = false;
}
const canPlayWebM = video.canPlayType(
'video/webm; codecs="vp8"'
);
if (canPlayWebM) {
fallback.hidden = true;
video.hidden = false;
} else {
showFallback();
}
video.addEventListener("error", showFallback);
playButton.addEventListener("click", () => video.play());
如果透明动画位于关键 Hero 或引导流程,就要实测目标浏览器,并保留明确的应用级降级。若它只是装饰,一张合适的 PNG 足以保持页面布局,不必让视频兼容问题挡住主要内容。
把播放权交给访问者
透明视频仍然是动态内容。不要让无限循环的装饰动画成为理解或使用页面的唯一方式。
可下载示例默认停在 poster,并提供播放/暂停按钮;同时检查 prefers-reduced-motion。如果访问者请求减少动态效果,页面会继续显示 PNG,直到对方主动开始播放。
const reducedMotion = matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
if (reducedMotion) {
showFallback();
}
如果场景确实需要自动播放,至少保持静音和页内播放,处理被浏览器拒绝的 play() Promise,并保留暂停入口。一段很短的动画,也不应该因为循环而永久消耗 CPU 和网络。
控制网页交付成本
这个演示同时播放三份视频,是为了在三种背景上证明透明效果。正式页面通常只需要一个 video,而不是三个解码器重复播放同一素材。
上线前可以按下面检查:
- 把片段裁到真正会展示的动作范围。
- 导出尺寸接近网页中的最大显示尺寸,不要把超大源文件塞进小卡片。
- 首屏以下或必须主动触发的媒体使用
preload="none";需要提前知道尺寸和时长时再用metadata。 - 准备一张有代表性的透明 PNG poster。
- 长时间播放的动画在离开视口或标签页不可见时暂停。
- 让服务器返回正确的
video/webmContent-Type,并为带版本号的静态文件设置缓存。 - ProRes 4444 留给剪辑和合成,不作为常规网页内嵌格式。
本文 4 秒示例约为 1.54 MiB,作为聚焦的展示小样是可用的,但它不是所有网站都应照抄的预算。要把它与页面其他资源一起放到限速移动网络中测量。
黑色矩形不一定要重新生成动作
透明动画显示成黑底时,先把“素材问题”和“播放问题”拆开:
- 把配套 RGBA PNG 分别放到浅色与深色背景上。
- PNG 正常透明、WebM 却变黑时,检查浏览器/解码器、实际编码和视频合成路径。
- 两种文件都不透明时,检查源图 Alpha、导出模式,以及原画里是否已经画入背景。
- 确认服务器返回完整文件和
Content-Type: video/webm。 - 在产品真正使用的浏览器、系统、设备或内嵌 WebView 中重测。
透明导出排障文档还整理了光边、溢色、模糊边缘,以及“文件带 Alpha、播放器却显示错误”等情况。
先做动画,再验收最终网页
使用 AnimGen 制作网页素材时,可以从带有效 Alpha 的 PNG 开始,选择透明动画模式,生成动作后裁出可用区间,再一起导出 WebM Alpha 和一帧 PNG 作为降级图。透明动画完整流程说明了输入与导出的边界;跑步与跳跃案例则覆盖生成动作和交付前清理。
最后要验收的是实际网页组件,而不只是下载文件:把它放到真实背景上,并检查最小支持视口。你可以下载本文完整示例作为起点,也可以打开 AnimGen 工作台,制作自己的透明角色动画。

