返回文章目录

让动画有一个
停下来的地方

开始播放很容易。做一个能暂停、会在后台休息、也能安静阅读的动画,需要多想一步。

把字符动画从终端搬到网页时,最先吸引注意的是字形如何出现、颜色如何流动。但页面与终端有不同的使用方式:人可能往下滚动、切换标签页,也可能在系统里启用了减少动态。动画如果只懂得一直播放,很快就会和阅读发生冲突。

把“想播放”和“正在播放”分开

一个暂停按钮只解决其中一部分问题。更完整的状态需要回答:使用者有没有要求播放?页面是否在前台?动画是否还在可见区域?系统有没有请求减少动态?只有这些条件同时允许,播放器才应继续推进。

在既有字符字标的网页适配中,手动暂停、离屏暂停与后台停止调度一起工作;系统要求减少动态时,直接保留完整静止字标。这样,文字本身不依赖动画完成才能被读到。

const canPlay =
  requestedByReader &&
  inViewport &&
  !document.hidden &&
  !prefersReducedMotion;

这里的区别很实用:切到另一个标签页,只是暂时不播放,并不必忘记使用者刚才的选择;真正点击暂停,则应该改变那个选择。

先静止,再由人开始

下面是一个独立的小示例。字母在静止时已经完整可读;开始以后可以暂停。滚出示例区域或切换标签页,它会暂时停下。若系统启用了减少动态,示例保持静止。

控制停顿,也要照顾恢复

网页端可以监听 visibilitychange,在标签页进入后台时暂停;用 IntersectionObserver 判断示例是否离开视口;用 matchMedia 读取并监听减少动态偏好。条件变化后,统一计算一次播放状态,比每个事件各自启动动画更容易检查。

若使用 requestAnimationFrame 绘制,还要确认恢复时没有重复启动多条循环。若播放的是预先生成的帧,暂停与恢复应使用同一份进度,不必为了恢复再加载一遍所有素材。

在真实页面里,再看一遍

原字符动画适配还有一个具体教训:同一份 gzip 压缩素材,本地服务器与正式预览服务器的响应头可能不同。浏览器有时已经解压,如果页面再次解压,就会失败。后来改为检查返回内容,再决定是否解压,并在两类服务器上核验。

动画文件正确,只说明素材本身没坏。页面怎样加载它、何时播放、何时停下,同样是作品的一部分。

来源与范围

依据 2026 年 10 月 17 日字符字标网页适配记录整理。既有字符动画来源涉及 Omarchy 与 ChrisBuilds 的 TTE,网页适配补充播放控制、减少动态回退和加载处理;本文不将上游动画称作原创。本站示例独立编写,未复制上游动画或素材。