Community图像github.com

atwalabs/cube-icons

为网页添加由 3D 立方体构建的动画像素图标,基于零依赖的 Cube Icons 引擎(2D Canvas,无需 WebGL)。立方体飞入构建图标、静止后飞散;提供 61 个现成图标、11 种外观(flat、soft、clay、candy、paper、outline、pixel、glass、neon、wire、holo)、滚动驱动构建、爆炸、磁吸和变形效果,以及像素文本字体。适用于需要立体像素、3D 立方体或“Minecraft 风格”动画图标、悬停构建对象的菜单、动画空状态、加载器、英雄区或功能卡片插图、滚动组装视觉效果,或手绘并嵌入网站的小型自定义像素图标。支持纯 HTML、React/Next.js、Vue、Svelte、Framer、Webflow 和 WordPress。

cube-icons 是什么?

Cube Icons 是一个轻量级的浏览器端库,用于在 `<canvas>` 上渲染由 3D 立方体构成的像素图标,核心引擎 `cubes.js` 仅约 9KB(gzip 压缩后),无任何外部依赖。它提供了 61 个预置图标,并支持通过简单的字符矩阵自定义绘制任意图标,同时内置像素字体功能。该库支持 11 种视觉外观(如平面、柔和、黏土、糖果、玻璃、霓虹等),并可通过丰富的 API 实现构建、爆炸、磁吸、滚动驱动、序列变形等交互动画。它不仅兼容纯 HTML 页面,也完美适配 React、Vue、Svelte 等现代框架,以及 Webflow 和 WordPress 等无代码平台。对于希望为网站添加独特、精致且高性能的 3D 像素动画效果的开发者来说,这是一个理想的工具。

兼容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/atwalabs/cube-icons/tree/HEAD/skill/cube-icons

Installed? Explore more 图像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Cube Icons

Cube Icons 在 <canvas> 上将微小的像素图画渲染为 3D 立方体。每个彩色像素变成一短摞立方体。引擎是 assets/cubes.js(约 9 KB gzip,无依赖),图标库是 assets/icons.js。一切都在浏览器中运行。

工作流程

  1. 放置它。 决定图标做什么:悬停时构建(菜单、按钮、卡片)、滚动时构建(章节、英雄区)、单次显示(空状态、加载器),或跟随指针(磁吸)。将真实文本保留在 canvas 旁边的 HTML 中。
  2. 安装。 将 assets/cubes.js 和 assets/icons.js 复制到项目的静态文件夹中,并使用两个 <script> 标签加载它们,icons.js 在前。或者从 CDN 加载:https://cdn.jsdelivr.net/gh/atwalabs/[email protected]/icons.js 和 .../cubes.js。在框架中,仅在浏览器端加载它们(参见 references/recipes.md 中的“Frameworks”)。
  3. 选择或绘制图标。 在匹配时使用内置名称(列表如下)。否则,按照下方的“绘制图标”方法,将图标绘制为一系列调色板键组成的行。
  4. 编写代码。 在设置了尺寸的 canvas 上创建一个舞台,然后调用 show、scroll、build、sequence 或 explode。从 references/recipes.md 中的匹配示例开始。
  5. 完成。 为 canvas 设置 CSS 宽度和高度,添加 role="img" 和 aria-label(如果是装饰性的则使用 aria-hidden="true"),在键盘焦点上也运行悬停效果,并在组件卸载时调用 stage.destroy()。

最小示例

<canvas id="hero-icon" style="width:360px;height:280px" role="img" aria-label="火箭"></canvas>
<script src="icons.js"></script>
<script src="cubes.js"></script>
<script>
  const stage = CubeIcons.stage(document.getElementById("hero-icon"), { look: "soft" });
  stage.show("rocket");
</script>

内置图标

close, bolt, sword, briefcase, person, phone, browser, envelope, chart, terminal, heart, star, rocket, bulb, camera, gamepad, music, globe, lock, folder, coffee, chat, clock, check, search, download, cursor, home, bell, gear, calendar, pin, wifi, battery, play, arrow, trash, pencil, code, key, bag, cart, gift, trophy, diamond, crown, book, headphones, umbrella, flag, sun, moon, cloud, tree, leaf, fire, planet, sparkle, smile, ghost, robot。

绘制图标

图标是一个等长字符串的数组,像图片一样从上往下读取。每个字符是一个调色板键;. 表示空白。

键颜色键颜色
B钴蓝色G绿色
W纸白色P淡紫色
K灰色C青色
L浅灰色M粉色
D近黑色N棕色
R红色O橙色
Y黄色

让图标看起来舒服的规则:

  • 8–16 列宽,6–14 行高。 每行长度相同。更大则失去块状感;舞台默认容纳 900 个立方体(单元格 × 深度)。
  • 先画轮廓。 在用单一颜色添加细节之前,先使轮廓可辨认;通过快速浏览各行来检查。
  • 轮廓与填充: 在填充色周围使用较深或对比鲜明的轮廓(K、D),然后加一个重点细节(金色搭扣、红色旗帜、蓝色窗户)。
  • 对称 对于对称的物体(奖杯、铃铛、面孔):镜像每一行。
  • 避免孤立的单个单元格,除非是眼睛或火花等特意设计的细节。
  • 要按名称放置,将其添加到库中:Object.assign(window.CUBE_ICONS, { badge: [...] })。或者直接将行数组传递给 stage.show(rows)。
  • 自定义颜色: 图标可以携带额外的调色板键,格式为 { colors: { a: "#eb234f", b: "#79a93e" }, rows: ["..aa..", "bbbbbb"] }。为此使用小写字母。除非需求指定了精确颜色,否则优先使用内置调色板。

示例(一个咖啡杯):

coffee: [
  "..W..W.....",
  "...W..W....",
  "...........",
  "KKKKKKKKK..",
  "KWWWWWWWKKK",
  "KWWWWWWWK.K",
  "KWWWWWWWKKK",
  "KWWWWWWWK..",
  ".KKKKKKK...",
],

对于文字,使用 CubeIcons.text("你好", { color: "B" }):这是一个 5 行的像素字体,支持 A–Z、0–9 以及 . , : ! ? - + ' & /。

最重要的选项

CubeIcons.stage(canvas, {
  look: "soft",      // flat (默认) · soft · clay · candy · paper · outline · pixel · glass · neon · wire · holo
  view: "front",     // front (默认) · iso
  depth: 2,          // 立方体深度,1–5
  gap: 0.06,         // 立方体之间的间隙,0–0.4
  tint: null,        // 一种品牌墨水色,例如 "#2f3cff":每种颜色都会以其深浅重新绘制
  ease: "expo",      // expo (默认,柔和着陆) · cubic · back · elastic · linear
  duration: 700,     // 每个立方体飞行的毫秒数
  stagger: 260,      // 每个立方体的随机延迟毫秒数
  spin: 0.25,        // 飞行时旋转的圈数
  from: "auto",      // auto · below · above · left · right · center
  magnet: 0,         // 指针附近的立方体向前弹出(尝试 1.5)
  glow: 0,           // 立方体周围的光晕,0–1(在深色页面上搭配 tint 效果很好)
  float: 0,          // 空闲时的运动,0–1:图标摇摆和浮动,松散的立方体漂移
  tilt: true,        // 深度随鼠标倾斜
});

将外观与页面匹配:soft、clay、candy、paper 和 outline 适合浅色页面;glass、neon 和 holo 适合深色页面;带浅色 tint 的 wire 适合深色或彩色区域;pixel 是任何地方都适用的扁平复古像素艺术。完整的选项和 API 表格见 references/api.md。

方法

  • stage.show(icon):构建一个图标(名称或行数组)。显示不同的图标会变形为它。
  • stage.clear():飞散并淡出。
  • stage.build(icon, progress):部分构建,0–1,从最底行开始。通过滚动、上传进度、定时器来驱动它。
  • stage.explode(clientX?, clientY?):撞散立方体;它们会重新归位。
  • stage.burst():立方体冲向观看者并淡出(用于菜单或页面过渡)。
  • stage.scatter(count, { icon }):在 canvas 上散布松散的立方体;之后的 show() 会将它们聚集成图标。
  • stage.set(options)、stage.destroy()。
  • CubeIcons.scroll(stage, icon, { mode: "scrub" | "trigger" })、CubeIcons.sequence(stage, icons, { every })、CubeIcons.still(canvas, icon, options) 用于静态缩略图。

常见错误

  • 没有 canvas 尺寸。 canvas 需要 CSS 宽度和高度,否则渲染为 0 像素高。
  • 脚本顺序。 在调用 show() 并传入名称之前加载 icons.js,在调用 CubeIcons 之前加载 cubes.js。
  • 服务端渲染。 永远不要在 Next.js、Nuxt 或 SvelteKit 中于模块顶层接触 CubeIcons;在 effect 或挂载钩子中创建舞台。
  • 立方体太多。 20×20 的图标在深度 3 下是 1200 个立方体;降低深度、绘制更小的图标,或提高 max 值。
  • 仅悬停。 还需要在 focus 上触发,这样键盘用户也能看到效果。

参考

  • references/recipes.md:即用型代码,涵盖菜单、按钮、空状态、变形序列、爆炸、磁吸、文本、功能卡片、滚动区域以及每种框架。
  • references/api.md:所有选项、方法和辅助函数,含默认值。
  • assets/cubes.js、assets/icons.js:引擎和图标库,供复制到项目中。

相关技能