把字符动画从终端搬到网页时,最先吸引注意的是字形如何出现、颜色如何流动。但页面与终端有不同的使用方式:人可能往下滚动、切换标签页,也可能在系统里启用了减少动态。动画如果只懂得一直播放,很快就会和阅读发生冲突。
把“想播放”和“正在播放”分开
一个暂停按钮只解决其中一部分问题。更完整的状态需要回答:使用者有没有要求播放?页面是否在前台?动画是否还在可见区域?系统有没有请求减少动态?只有这些条件同时允许,播放器才应继续推进。
在既有字符字标的网页适配中,手动暂停、离屏暂停与后台停止调度一起工作;系统要求减少动态时,直接保留完整静止字标。这样,文字本身不依赖动画完成才能被读到。
const canPlay =
requestedByReader &&
inViewport &&
!document.hidden &&
!prefersReducedMotion;
这里的区别很实用:切到另一个标签页,只是暂时不播放,并不必忘记使用者刚才的选择;真正点击暂停,则应该改变那个选择。
先静止,再由人开始
下面是一个独立的小示例。字母在静止时已经完整可读;开始以后可以暂停。滚出示例区域或切换标签页,它会暂时停下。若系统启用了减少动态,示例保持静止。
让一行字轻轻动起来
这是为本文新写的 CSS 示例,用来说明播放状态;不是原字符动画的复刻。
控制停顿,也要照顾恢复
网页端可以监听 visibilitychange,在标签页进入后台时暂停;用 IntersectionObserver 判断示例是否离开视口;用 matchMedia 读取并监听减少动态偏好。条件变化后,统一计算一次播放状态,比每个事件各自启动动画更容易检查。
若使用 requestAnimationFrame 绘制,还要确认恢复时没有重复启动多条循环。若播放的是预先生成的帧,暂停与恢复应使用同一份进度,不必为了恢复再加载一遍所有素材。
在真实页面里,再看一遍
原字符动画适配还有一个具体教训:同一份 gzip 压缩素材,本地服务器与正式预览服务器的响应头可能不同。浏览器有时已经解压,如果页面再次解压,就会失败。后来改为检查返回内容,再决定是否解压,并在两类服务器上核验。
动画文件正确,只说明素材本身没坏。页面怎样加载它、何时播放、何时停下,同样是作品的一部分。
来源与范围
依据 2026 年 10 月 17 日字符字标网页适配记录整理。既有字符动画来源涉及 Omarchy 与 ChrisBuilds 的 TTE,网页适配补充播放控制、减少动态回退和加载处理;本文不将上游动画称作原创。本站示例独立编写,未复制上游动画或素材。