← 笔记
2026 年 7 月 11 日阅读 3 分钟

一个标志的 12288 张脸

七个字母,27 种写法,中间用变形连起来。在它不再发抖之前,我掉进过三个坑。

三行 CHERNOV,每行由不同性格的字母拼成,中间一行是荧光色

这个站顶上的标志不是静止的。CHERNOV 七个字母,每个都画了好几种性格:严谨、像素、巴洛克、维多利亚、欧普艺术,一共 27 种写法。字母自己有主意,隔几拍就有一个决定变成另一副样子。不是瞬间切换,是变形,一个形状流进另一个形状,像液体。

这篇拆一下它是怎么做的,以及我掉进去的几个坑。

换帧为什么不够#

第一版就是 SVG 交叉淡入淡出。能跑,但是死的:图一换,人读到的是“卡了一下”,不是一个动作。让标志活过来的是轨迹本身。眼睛得看见严谨的衬线怎么一点点长成像素黑体,才会自己补出这个角色的性格。

变形跑在 flubber 上,一个路径插值库。但字母不能直接喂给它,麻烦从这里开始。

三个坑#

先说洞。e、o、r 这些字母的路径里有洞。只对外轮廓做插值,洞会被粘上,字母走到一半变成一坨墨。办法是把路径拆成子路径,在两种写法之间按启发式配对:填充色、面积、重心间距,然后子路径对子路径地变形,再加 fill-rule: evenodd,让洞一路上都还是洞。

多出来的形状是第二个坑。同一个字母,一种写法由两块组成,另一种由五块组成,多出来的三块往哪儿放?藏起来会被看见。flubber 有 combineseparate,多余的形状老实地从旁边那块里长出来,或者化进去。

最花时间的是节奏。所有字母一起变,是放礼花;按定时器轮着变,是节拍器。两样都无聊。所以标志有个“指挥”:独奏那个字母每 2.8 到 4.6 秒换一次,每隔五到七拍,整个词上滚过一道波,字母之间错开 110 毫秒。上面再叠一层很轻的缩放“呼吸”,让它在停顿的时候也不像块石头。这几个数字不是算出来的,是我看着顺眼定下来,中间改了很多遍。

互动区#

页脚里的标志交给访客:鼠标移到一个字母上,它就换一种写法。六个字母各有四种写法,v 只有三种,第四种它还没挣到。全部组合是 12288 种,下面的计数器老实地记着你已经看过多少种。

互动区的一帧:同一个词的三种不同组合
互动区的一帧:同一个词的三种不同组合

为什么要费这个劲#

标志是品牌里被看见最多的东西,也是最死的一个:通常就是一张钉在屏幕角上的图。我是亚历山大·切尔诺夫(Alexander Chernov),这个站从设计到代码都是我自己做的,我想让设计师的签名表现得像个设计师,坐不住,但知道分寸。没有功能的动效是装饰,这里的功能是标志在展示自己的幅度,而幅度正是作品集要卖的东西。

好动效回答的不是“怎么动才好看”,是“这个东西什么性格”。

技术细节:flubber 13KB,在 requestAnimationFrame 上用 easeInOutCubic 插值,遇到 prefers-reduced-motion 全部老实关掉。字母在 Figma 里画好,清成干净路径,每个字母存成单独的 SVG。