1. 这波刷屏到底发生了什么
前几天我正刷着信息流,突然发现首页被一批画风极其统一的视频给占了。点进去一看,清一色是那种带点物理模拟、粒子效果、甚至能实时交互的网页动画,有的像流体,有的像粒子星系,还有的干脆把整个地铁线路图做成了可拖拽缩放的可视化画布。评论区一堆人在问“这用什么做的”“是不是又要学新软件了”,结果高赞回答就一句话:Opus 5.5 加 Claude Code,一个 HTML 文件搞定。
说实话,我第一反应是怀疑的。毕竟“AI 生成视频”这事被炒了太久,大部分产物要么是几秒钟的模糊片段,要么是套模板的幻灯片。但当我真正把那些 HTML 文件拖进浏览器,看到 Canvas 里几千个粒子跟着鼠标实时响应、帧率稳在 60 的时候,我意识到这次不太一样。它生成的压根不是传统意义上的“视频文件”,而是一个可交互的网页动画——用 HTML 加 Canvas 绘图引擎写出来的东西,录屏之后看起来就像视频,但本质上是代码在实时渲染。
这里得先厘清一个概念,免得新手被带偏。所谓“Opus 5.5 做的视频”,准确说是用 Claude 系列模型(Opus 5.5 是其中能力较强的一档)配合 Claude Code 这个命令行/桌面工具,生成包含 Canvas 绘图逻辑的 HTML 页面。Canvas 是浏览器原生提供的一块画布,你用 JavaScript 在上面画点、线、圆、图片,每秒钟重绘几十次,人眼看起来就是流畅动画。它不需要装任何渲染软件,一个<!doctype html>开头的文件,双击就能跑。
那为什么偏偏是现在火起来?我的判断是三个条件凑齐了:一是模型对 Canvas API 和物理公式的理解足够准,能写出可运行的复杂逻辑;二是 Claude Code 这类工具把“生成文件、保存、本地打开预览”这条链路打通了,不用来回复制粘贴;三是 HTML 文件天然易分享,发个文件别人就能看,传播成本几乎为零。这三者叠加,才有了“一夜刷屏”的效果。
这篇文章适合谁看?如果你是对前端动画好奇但没动过手的新手,我会从最基础的 Canvas 原理讲起,给你能直接抄的代码;如果你已经在用 Claude Code,我会分享怎么把它的输出调教得更稳、怎么打包多个 HTML、怎么避开那些让人抓狂的报错。全程不聊虚的,只讲我实际跑通的东西。
2. 核心原理拆解:Canvas 为什么能“画”出视频感
2.1 Canvas 绘图引擎到底在干什么
很多人第一次听到 Canvas 会懵,觉得是不是又是个新框架。其实它特别朴素,就是 HTML 里的一个标签:<canvas id="c" width="800" height="600"></canvas>。浏览器给它分配一块像素区域,然后你通过 JavaScript 拿到它的“上下文”(context),开始往上画东西。
关键点在于逐帧重绘。传统网页是一旦渲染好就静止的,而 Canvas 动画的思路是:清空画布 → 重新计算每个元素的新位置 → 重新画一遍 → 请求浏览器在下一帧再执行这个函数。这个循环通常用requestAnimationFrame来驱动,它会让浏览器在每次刷新屏幕前调用你的绘制函数,一般显示器是 60Hz,也就是每秒 60 次。60 次重绘连起来,就是动画。
我拿一个最简单的粒子系统举例。假设画布上有 500 个粒子,每个粒子有 x、y 坐标和 vx、vy 速度。每一帧里,我把 x 加上 vx,y 加上 vy,碰到边界就反向。然后清空画布,给每个粒子画一个半径 2 的圆。就这么点逻辑,跑起来就是一片漂浮的星点。Opus 5.5 生成的复杂视频,无非是在这个骨架上叠加了更多规则:粒子之间相互吸引、鼠标位置产生斥力、颜色随速度变化、拖尾效果用半透明矩形覆盖实现。
提示:Canvas 的坐标系原点在左上角,x 向右增大,y 向下增大。新手最容易在这里翻车,以为 y 向上是正方向,结果画出来的东西上下颠倒。
2.2 为什么用 HTML 而不是直接导出 MP4
这是被问得最多的问题。直接生成 MP4 不行吗?行,但成本和门槛完全不一样。生成视频文件需要编码器、需要处理音视频同步、文件体积大、分享还得上传。而 HTML 加 Canvas 的方案,本质是把“渲染指令”而不是“渲染结果”交给浏览器。
打个比方,MP4 像是把一部电影刻成光盘寄给你,你得有播放器才能看;HTML 加 Canvas 像是把菜谱和食材寄给你,你家的厨房(浏览器)现做现吃。前者文件大、不灵活,后者体积极小(一个复杂动画的 HTML 可能就几十 KB)、可交互、改一个参数整个效果就变。
而且 Canvas 动画天然支持鼠标和触摸事件。你鼠标移到粒子附近,粒子被推开;你点击画布,触发一次爆炸效果。这种交互性是录屏视频给不了的。所以当人们说“Opus 5.5 做的视频”时,他们真正兴奋的是这种可交互、可修改、体积极小的动态内容形态。
2.3 Claude Code 在其中扮演什么角色
Claude Code 可以理解成一个能直接操作你本地文件的 AI 助手。你告诉它“帮我写一个 Canvas 粒子动画,鼠标移动产生斥力”,它不只是把代码显示在聊天框里,而是可以直接在你的项目目录下创建index.html,把完整代码写进去。你打开浏览器就能看效果,不满意就继续让它改。
这个链路的价值在于省掉了复制粘贴和手动建文件。以前用网页版对话,你得复制代码、打开编辑器、新建文件、粘贴、保存、切到浏览器刷新,一套下来半分钟没了。Claude Code 把这几步压缩成一句指令。对于需要反复调试的动画来说,这个效率提升是数量级的。
我实测下来,Claude Code 在生成 Canvas 代码时有几个明显优势:它知道requestAnimationFrame的正确用法,不会用setInterval那种会掉帧的老写法;它理解物理公式,能写出带阻尼的弹簧效果;它还会主动处理devicePixelRatio,让动画在高分屏上不模糊。这些细节如果让新手自己查文档,没半天搞不定。
3. 从零跑通第一个 Canvas 动画
3.1 环境准备与 Claude Code 安装避坑
先说环境。你只需要两样东西:一个现代浏览器(Chrome、Edge、Safari 都行),以及 Claude Code 本身。Claude Code 有命令行版和桌面版,我两个都试过,命令行版更灵活,桌面版对不熟悉终端的人更友好。
安装过程中我踩过的坑列一下。Windows 上如果提示需要启用虚拟机平台相关的组件,那是它的运行依赖,按提示开启后重启即可。macOS 上一般比较顺,但要注意系统版本别太老。安装完成后,在终端输入claude如果提示“无法将 claude 项识别为命令”,八成是环境变量没配好,重新打开一个终端窗口通常能解决,还不行就检查安装路径有没有加到 PATH 里。
注意:安装和首次登录时,确保网络环境符合你所在地区的相关规定,使用官方支持的方式完成配置。遇到地区限制提示时,以官方文档说明为准。
装好之后,找个空文件夹,在终端里进入该目录,输入claude启动。第一次会引导你完成一些初始化设置,跟着走就行。我建议专门建一个canvas-demos文件夹,所有实验都放里面,方便管理。
3.2 让 Claude Code 生成第一个粒子动画
启动 Claude Code 后,我用的第一条指令是这样的:
创建一个 index.html,用 Canvas 画 800 个粒子,粒子随机分布, 每个粒子有随机速度,碰到画布边缘反弹,粒子之间距离小于 80 时 画一条半透明的连线,鼠标移动时对附近粒子产生斥力。等它写完,直接双击index.html,浏览器里就是一片会动的粒子网络。鼠标划过去,粒子被推开,连线跟着变化。整个过程不到一分钟。
这里有个细节值得说:为什么我强调“距离小于 80 画连线”?因为这是让画面从“一堆散点”变成“有结构的网络”的关键。没有连线,就是普通星空;有了连线,就有了神经网络、星系团那种高级感。这个阈值 80 不是随便定的,太小了连线稀疏看不出效果,太大了满屏都是线糊成一团。我试过 60、100、120,最后觉得 80 到 100 之间视觉最舒服。
代码结构上,核心就是三个部分:初始化粒子数组、每帧更新位置、每帧重绘。Claude Code 生成的版本通常还会加一个resize事件监听,让画布随窗口大小自适应。这个细节很重要,否则你全屏之后画布还是原来那么大,周围一圈空白。
3.3 关键参数调优:让动画从“能跑”到“好看”
能跑起来只是第一步,好看才是刷屏的原因。我总结几个决定观感的参数,以及我实测下来比较稳的取值。
| 参数 | 作用 | 推荐范围 | 调过头会怎样 |
|---|---|---|---|
| 粒子数量 | 决定画面密度 | 300 到 1000 | 超过 2000 明显掉帧 |
| 连线距离阈值 | 控制连线疏密 | 70 到 120 像素 | 太大画面糊成一片 |
| 粒子速度 | 决定运动节奏 | 0.3 到 1.5 | 太快像雪花屏,太慢像静止 |
| 斥力半径 | 鼠标影响范围 | 100 到 200 像素 | 太大整片被推飞 |
| 拖尾透明度 | 决定残影长度 | 0.05 到 0.2 | 太低全糊,太高没拖尾 |
拖尾效果单独说一下。实现方式不是真的记录历史位置,而是在每帧开始时,用一层半透明的黑色矩形覆盖整个画布,而不是完全清空。这样上一帧的画面会残留一点点,形成拖尾。透明度 0.1 意味着每帧只擦掉 10% 的旧内容,大概十几帧后旧画面才完全消失,视觉上就是一条淡淡的尾巴。这个技巧几乎所有粒子动画都在用,成本极低但效果拔群。
提示:如果你发现动画有卡顿,先降粒子数量,再降连线阈值。连线计算是 O(n²) 的复杂度,粒子数翻倍,计算量翻四倍,这是性能杀手。
4. 进阶玩法:从粒子到完整可视化项目
4.1 用 Canvas 画一张可交互的地铁线路图
粒子玩腻了之后,我试着让 Claude Code 做一个更实用的东西:地铁线路图绘制工具。这个需求来自热搜词里的“advanced abstract route canvas 地铁线路图绘制工具”。思路是把每条线路当成一条折线,每个站点当成一个圆点,支持拖拽画布和滚轮缩放。
这个项目比粒子动画复杂的地方在于坐标变换。你拖拽画布时,所有元素的绘制坐标都要加上偏移量;你缩放时,坐标要乘以缩放系数。如果直接在绘制时算,代码会乱成一团。正确的做法是维护一个全局的offsetX、offsetY和scale,在每帧绘制前用ctx.translate和ctx.scale统一应用。这样你画线路时用的还是原始坐标,浏览器帮你做变换。
Claude Code 在这个任务上表现不错,它知道用ctx.save()和ctx.restore()来隔离变换状态,避免影响后续绘制。我唯一要手动调的是缩放的中心点——默认缩放是以画布左上角为原点,体验很差,应该以鼠标位置为中心缩放。这个逻辑需要一点向量计算,我直接告诉它“以鼠标位置为缩放中心”,它就能改对。
4.2 打包多个 HTML 的管理思路
做着做着文件就多了,每个实验一个 HTML,文件夹里乱七八糟。这时候需要一点组织策略。我的做法是按主题建子文件夹,比如particles/、routes/、games/,每个文件夹里放一个index.html加可能的资源文件。然后根目录放一个总入口index.html,用简单的链接列表把所有实验串起来,方便自己回顾,也方便分享给别人。
如果你想让别人一次性看到所有作品,可以把它们嵌进一个页面里,用iframe标签。每个 iframe 指向一个子页面的 HTML,设置好宽高,就能在一个页面里平铺展示多个动画。不过要注意,iframe 里的 Canvas 动画同样吃性能,同屏放太多会卡,建议一次最多展示四到六个。
注意:打包分享时,确保所有文件用相对路径引用。绝对路径(比如
C:\Users\...)换台电脑就失效了,这是新手分享作品时最常见的翻车点。
4.3 把 HTML 转成其他格式的实用场景
有时候对方不方便打开 HTML,比如要发邮件或者贴进文档,就需要转换。热搜里提到的“html 转为 md”和“html 格式转换 wps 表格”就是这类需求。转 Markdown 比较简单,如果 HTML 里主要是文字内容,用一些转换工具或者让 Claude Code 写个脚本提取文本节点就行。但要注意,Canvas 动画转成 Markdown 就只剩一段文字了,动画本身是转不过去的,只能录屏。
转 WPS 表格的场景通常是 HTML 里有个表格数据,想导入表格软件。这时候关键是保留<table>结构,让转换工具能识别行列。如果 HTML 里的数据是用 Canvas 画出来的,那就没辙了,因为 Canvas 里只有像素,没有语义化的表格结构。这也是 Canvas 的一个局限:它画出来的东西对搜索引擎和辅助工具来说是“不可见”的。
5. 常见报错与排查实录
5.1 Claude Code 相关的高频问题
用 Claude Code 的过程中,我遇到过几类典型问题,整理成速查表方便对照。
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 终端提示找不到 claude 命令 | 环境变量未配置 | 重开终端,或手动将安装路径加入 PATH |
| 启动后卡在初始化 | 网络或配置问题 | 检查官方文档的配置要求,按说明完成 |
| 生成的代码运行报错 | 模型理解偏差 | 把报错信息原样贴回给它,让它修复 |
| 文件生成了但浏览器打不开 | 路径或文件名问题 | 确认文件后缀是 .html,路径无中文和空格 |
| 动画在高分屏上模糊 | 未处理像素比 | 让它加上 devicePixelRatio 适配逻辑 |
其中“把报错信息原样贴回去”是我用得最多的技巧。不要自己翻译报错,也不要只描述“它不工作”,直接把控制台里的红色文字完整复制给它。模型对具体错误信息的定位能力远强于模糊描述。我试过只贴一句Uncaught TypeError: Cannot read properties of null,它就能准确指出是获取 canvas 元素时 ID 写错了。
5.2 Canvas 本身的坑
Canvas 有几个经典陷阱,跟 AI 无关,是 API 设计本身导致的。第一个是画布尺寸和 CSS 尺寸不一致。你设了width="800",但 CSS 里又写了width: 100%,结果画布被拉伸,图形变形。正确做法是 Canvas 的 width 和 height 属性控制像素分辨率,CSS 控制显示大小,两者要么一致,要么按比例缩放。
第二个是清空画布的方式。新手常用ctx.clearRect(0, 0, width, height),这会把画布擦成全透明。如果你的页面背景是白色,看起来没问题;但如果背景是深色,擦成全透明后可能露出底下的颜色,导致闪烁。想要拖尾效果就用半透明矩形覆盖,想要干净重绘就用 clearRect,两者别混用。
第三个是移动端触摸事件。桌面端用mousemove,移动端得用touchmove,而且触摸事件的坐标获取方式和鼠标不同,要取touch[0].clientX。如果只写鼠标事件,手机上划半天没反应。Claude Code 生成的代码有时会漏掉触摸适配,需要你主动提一句“加上移动端触摸支持”。
5.3 性能问题的排查顺序
动画卡顿是另一个高频问题。我的排查顺序是:先看粒子数量,再看连线计算,最后看绘制调用。粒子数量是最直接的因素,降一半数量帧率立刻回升。连线计算是隐藏杀手,因为它涉及双重循环,粒子数 500 时每帧要算 25 万次距离,很吃 CPU。如果必须保留大量连线,可以改用空间网格优化,把画布分成小格,只计算相邻格子里的粒子对,计算量能降一个数量级。
绘制调用方面,频繁切换填充色和描边色也会拖慢速度。优化方法是把相同颜色的绘制批量处理,或者用离屏 Canvas 预渲染静态部分。不过对于大多数演示级动画,只要粒子数控制在 1000 以内,不做极端优化也能跑满 60 帧。
6. 我踩过的坑和几条实在建议
第一个坑是过度追求效果导致代码失控。我一开始让 Claude Code 加各种效果:粒子要有拖尾、要有发光、要随音乐律动、要支持手势缩放。结果生成的文件几百行,改一个参数牵一发动全身,最后自己都看不懂。后来我学乖了,一个文件只做一件事,粒子就纯粒子,线路图就纯线路图,需要组合时用 iframe 拼。这样每个文件都短小精悍,出问题也好定位。
第二个坑是忽略浏览器兼容性。我在 Chrome 上跑得好好的动画,发给用 Safari 的朋友,直接白屏。排查发现是某个较新的 Canvas API 在旧版 Safari 上不支持。解决办法要么降级用兼容写法,要么在代码里加特性检测,不支持时给个提示。Claude Code 默认按最新标准写,你得主动要求它考虑兼容性。
第三个坑是分享时忘了处理跨域。如果你的 HTML 里引用了外部图片或字体,本地打开没问题,发给别人可能因为跨域策略加载失败。最稳的做法是把所有资源内联进 HTML,图片转成 base64,字体用系统默认。这样单个文件自包含,走到哪都能跑。
最后分享一个提效小技巧:让 Claude Code 生成代码时,顺便让它写一段注释说明关键参数的作用和调整范围。这样过几天你回头看自己的文件,不用重新读代码就知道每个数字是干嘛的。我现在的习惯是每个动画文件顶部都有一段参数说明,调起来特别快。
这套东西的门槛比想象中低,一个下午就能从零做出能发朋友圈的动画。但要做好、做精,还是得理解背后的原理,不然只能停留在“让它生成什么就是什么”的阶段。我个人的体会是,把 Canvas 的坐标系、逐帧重绘、坐标变换这三件事搞明白,剩下的就是不断试参数和积累效果库了。