🎮 从 NES 到现代 Web —— 我用 Vue 3 打造了一套像素风组件库,支持自定义 Paint Worklet

4,972 阅读3分钟

🎮 从 NES 到现代 Web —— 我用 Vue 3 打造了一套像素风组件库,支持自定义 Paint Worklet

如果你也喜欢像素美术、喜欢组件化开发,欢迎点个 Star ⭐️ 支持我一下:

👉 GitHub 地址 @mmt817/pixel-ui


QQ_1747188438586.png

1️⃣ 项目初衷

红白机、GameBoy 游戏,那种块状像素 UI 总让人心驰神往。现在虽然是现代 Web 时代,但像素风 UI 的美学依然令人着迷。

现有的 8-bit 风组件库 NES.css 是一个 CSS 框架, 它只需要 CSS,不依赖于任何 JavaScript, 核心绘制逻辑都是基于 box-shadow 实现, 但在不同浏览器环境, 浏览器缩放时,box-shadow 的浮点偏移值经过缩放后无法精准对齐物理像素网格,导致渲染出现间隙。子像素定位、像素舍入误差和 box-shadow 本身不适合精细拼接渲染等原因造成了一些困扰

QQ_1747188289846.png

NES.css

于是我决定用 Vue 3 + TypeScript + UnoCSS + CSS Houdini 打造一款组件库 —— 让像素风重回前端视野

项目地址👇
📦 github.com/maomentai81…

组件库首页👇
📎 maomentai817.github.io/pixel-ui/


2️⃣ 技术选型

技术栈用途
Vue 3 + <script setup>组件化开发核心
TypeScript类型系统增强开发体验
UnoCSS原子化 CSS,灵活配置样式类
CSS Houdini自定义 Paint Worklet 渲染像素边框
Storybook + VitePress组件展示 + 文档系统
Vitest测试组件逻辑与渲染
pnpm + Monorepo高效构建与多包管理

3️⃣ 项目亮点

✅ 像素风自定义组件

内置组件包括:

  • PxButton
  • PxCard
  • PxCollapse
  • PxAnimationFrame
  • PxProgress

支持:

  • 像素边框、像素阴影、圆角控制
  • 样式属性通过 @property 属性动态控制
  • 支持 plain, disabled, color 等状态
  • 支持颜色主题自动计算

✅ 像素风字体内置

  • 内置 8bit 像素字体
  • 保证整体复古 UI 一致性

✅ Paint Worklet 动态渲染边框

使用 CSS Houdini 的 paint(pixel-box) 绘制像素边框:

// 自定义边框渲染逻辑
registerPaint('pixel-box', class {
  paint(ctx, size, props) {
    // 基于变量渲染像素感边框
  }
})

通过变量如 --px-border-radius, --px-border-size, --px-shadow-depth 实现丰富的视觉效果。

✅ 动态 GIF 动画组件

通过 PxAnimationFrame 组件播放 GIF 图动画:

  • 支持帧控制、阶段切换
  • 拖拽交互支持
  • 基于 super-gif 控制 canvas 区域

✅ Markdown API 自动生成

我们为组件文档开发了 api-table 插件:

通过读取 types.ts 文件内 jsDoc 注释信息, 自动渲染为 md-table, 如 enum object Function 等复杂形式, 结合 vp-api-typing(基于 PxTooltip组件) 实现类似 element-plus markdown-tooltip 的表现形式

    interface ButtonProps {
        /**
         * @property type
         * @type enum - primary | success | warning | danger | base
         * @description 按钮类型
         * @default base
         */
        type?: ButtonType
        /**
         * @property plain
         * @type { boolean }
         * @description 是否为朴素按钮
         * @default false
         */
        plain?: boolean
    }

插件会自动生成:

QQ_1747190029682.png 支持对 Props Slots Events Expose 结构进行ast解析


4️⃣ 效果预览

🖼 预览图:

QQ_1747189461090.png

QQ_1747189626792.png

QQ_1747189657079.png

QQ_1747189683643.png

5️⃣ 快速上手

安装组件库:

    pnpm add -D @mmt817/pixel-ui

使用方式:

    // main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import PixelUI from '@mmt817/pixel-ui'
    import '@mmt817/pixel-ui/dist/style.css'

    createApp(App).use(PixelUI).mount('#app')

组件使用示例:

<template>
  <px-card>
    <template #prepend>
      <px-icon icon="face-thinking-solid" size="30"></px-icon>
    </template>
    <template #header>HEADER</template>
    xxxx
    <template #footer>FOOTER</template>
    <template #append>
      <px-button>APPEND</px-button>
    </template>
  </px-card>
</template>


6️⃣ 项目规划与 TODO

✅ 已完成:

  • 支持自定义 PaintWorklet 绘制组件
  • 像素边框 + 阴影 + 渐变支持
  • Storybook/VitePress 文档系统
  • 单元测试与 API 文档自动生成

📌 规划中:

  • 像素风深色模式自动切换
  • 更多组件支持
  • 像素白板绘制工具
  • 多语言文档支持

7️⃣ 开源地址 & Star 支持

项目仓库地址:

👉 github.com/maomentai81…

npm地址:

👉 github.com/maomentai81…

欢迎大家:

  • 🌟 点个 Star
  • 🐛 提 Issue
  • 🤝 提 PR
  • 📢 分享给像素控朋友!

🙏 最后

这个组件库是我对像素 UI 的一次致敬与再创造。

如果你也喜欢这种风格,欢迎来体验并提出建议,一起打磨一个属于 Web 世界的像素 UI 工具集!


喜欢的话不妨点个赞👍 + 收藏🔖
关注我,后续我还会继续分享更多组件开发 & CSS Houdini 实战经验!


后续

# 用 CSS Houdini 打造像素风组件的边框魔法 —— 解构 pixel-ui 的 PixelBox