Claude 里的小螃蟹,现在住在我博客的里

Claude Anthropic Gridea Pro 主题开发 开发手记
Claude 里的小螃蟹,现在住在我博客的里

如果你最近在我的博客里多停留了一会儿,可能见过它:一只橙色的像素风小螃蟹,会从某条分隔线下面悄悄冒出来,在空白处走两步,掏出笔记本敲一会儿,或者举起一块写着「述尔」的小牌子,过一阵又缩回线下。

是不是很可爱?

它叫 Clawd,是 Anthropic 的吉祥物。

小螃蟹的六种动作

这篇说说它从哪来、会做什么,以及怎么把它放到你自己的网站上。

它从 Claude App 里来

Claude 的桌面 App 里藏着一个横版闯关小游戏,叫 Clawd Quest:操控小螃蟹跑跳、捡东西、完成一个个小任务——比如「天空忘了醒来,去把五颗日出火花找回来」(原文:The sky forgot to wake. Gather the five sunrise sparks.)。

它有生命值、有计分、有背景音乐,还有一个 Ultra 模式。这个游戏设计得相当用心。

翻 App 的安装包时我发现,游戏里小螃蟹的动作并不是视频或图片,而是用文本编码的像素画:每个动作是一张很小的网格(比如 24×17 格),配一个三五种颜色的调色板;第一帧记下整张网格,之后每一帧只记录「哪几个格子变了色」。这样一来,25 套动作加起来只有一百多 KB,压缩后传输不到 40KB。

既然是数据,就可以拿出来用代码重新画。我从中挑了 20 套:走路、横着爬、跑、东张西望、敲笔记本、敲台式机、草裙舞、冥想、思考、头顶亮灯泡、挥手、转晕……又按同样的格式画了两套原创动作:

  • 看书:双钳捧起一本蓝封面的书,眼睛垂下来一行一行扫读,读完翻页;
  • 举牌:举着一块木框小牌子上下晃。牌子上的字可以配置,在我这里写的是手绘的 9×9 像素字「述尔」。

它会做什么

自己找地方站。 每次出场,它会扫描当前屏幕里所有的横线——标题下的分隔线、文章里的 <hr>、列表的底线,以及图片、代码框的上边缘——找出线上方不压文字的那一段空白,从线下冒出来。

它能站的几种横线

按空间挑动作。 举牌、亮灯泡这类个子高的动作,只在上方空间够的地方做;当前位置放不下,它会先走到空旷的地方再做。

看书

跟着线走。 页面滚动时它站在线上跟着走;图片加载导致排版变化时也会跟着挪;线滚出屏幕后才退场,下次在新的屏幕里重新找线。

会互动。 鼠标主动凑过去,它要么挥手,要么转身就跑,身后没地方跑就钻回线下、从另一头冒出来;连着被追几次会转晕;站着不动时眼睛跟着鼠标转;点它一下会蹦起来,有时还撒一把彩带。

鼠标互动

设计上的考虑

做这只螃蟹时,我给自己定了一条原则:它是页面的住客,不是页面的主角。 博客是拿来读的,螃蟹再可爱也不能抢正文的戏。下面这些取舍都从这条出发。

站在线上,而不是飘在角落。 网页上常见的看板娘、宠物挂件大多固定在屏幕一角,和内容没有关系。而文章页本来就有很多横线:分隔线、列表底线、图片和代码框的边缘。让它把这些线当地面,它就像真的住在页面里,而不是贴在玻璃上。

只在看得见的地方出现。 每次都在当前屏幕里找线,而不是固定在页脚——放在页脚的话,大多数人根本滚不到那里。线滚出屏幕它才退场,滚动时跟着线走,不会悬在半空。

不挡内容。 只站在上方没有文字的那段空白里;个子高的动作要上方留足空间才做;它本身不拦截点击,下面的链接照样能点。屏幕里没有合适的线时(比如长文正文中间),它就先不出来。

出现要克制。 每次出场只做三五个短动作,然后缩回线下,隔几秒到十几秒再随机出现。大部分时间它不在,偶尔出现才有惊喜,一直在动反而让人烦。

互动只回应「主动」的靠近。 滚动页面时,鼠标和螃蟹的相对位置也会变,但那不是读者想逗它。所以只有鼠标真的在移动、并且朝它靠近时,它才挥手或逃跑,不会一滚动就跑掉。

像素要清楚。 像素画最怕被缩放糊掉,所以它按屏幕的物理像素取整倍数绘制,视网膜屏上边缘依然锐利。牌子上的字用比螃蟹细一倍的像素画,字能看清,牌子也不会比螃蟹还抢眼。

尊重访客的设置。 访客在系统里开启了「减少动态效果」时,它不会出现。

怎么用

代码已开源在 GitHub:Tespera/clawd-crab。

任何网页,一行接入:

<script src="https://cdn.jsdelivr.net/gh/Tespera/clawd-crab@0.1/dist/clawd-crab.iife.js" data-sign="HELLO" defer></script>

脚本走 jsDelivr 的 CDN,国内也能访问;样式和像素数据都打包在这一个文件里,不需要额外的 CSS。

配置都写在这个标签上,常用的几项:

写法 作用
data-sign="HELLO" 牌子上的字;data-sign="false" 关掉举牌
data-actions="walk,read,sign" 只表演这几个动作
data-exclude="desktop,hula" 去掉这几个动作
data-interactive="false" 关掉鼠标互动
data-scale="1.75" 螃蟹大小(桌面端),手机端用 data-mobile-scale
data-ignore=".no-clawd" 这些元素不当地平线

data-actions 和 data-exclude 里用的动作名称如下:

名称 动作 名称 动作
walk 走路 turning 转身
crabWalk 横着爬 point 指方向
lookAround 东张西望 dance 跳舞
laptop 敲笔记本 meditate 冥想
read 看书 thinking 思考
sign 举牌 lightbulb 亮灯泡
desktop 敲台式机 excited 兴奋
hula 草裙舞 hop 蹦跳
sway 摇摆 wave 挥手

冒出、缩回、站立,以及鼠标互动时的反应(逃跑、转晕、撒彩带)不在这张表里,始终都有;不想要互动就用 data-interactive="false" 关掉。

牌子上的字:内置了英文字母、数字和常用符号的 5×7 像素字体,直接写就行。中文需要自己提供点阵(每个字一组字符串,# 是笔画),仓库的 README 里有写法。

前端工程里用:

import { mountClawd } from 'clawd-crab';

const clawd = mountClawd({ sign: 'HELLO', exclude: ['desktop'] });
// 页面卸载时
clawd.destroy();

Electron 这类基于网页的 App 同理;原生 App 可以放在 WebView 里用。

关于版权

项目代码以 MIT 协议开源。但除了「看书」「举牌」两套是我画的,其余像素素材都来自 Claude App,Clawd 是 Anthropic 的吉祥物,这些素材的版权归 Anthropic 所有,并不在 MIT 授权范围内。放在个人博客上玩玩问题不大,商用之前请自己确认清楚。

最后,如果你在这页的某条线上看到了它,试着把鼠标慢慢挪过去。

评论