Spark Joy 像素风 UI 完整落地指南
给一个怀旧主题的页面配界面时,最容易破功的是浏览器原生按钮的圆角与默认焦点框——像素风 UI 的难点不在画格子,而在于用几行 CSS 把按压反馈补全。开源项目 Spark Joy 收录了两千多条设计资源,其中复古 8 位视觉方向的组件,值得先落到按钮、空状态、新手引导三处。
硬阴影与网格:复古反馈为什么有效
把它想成机械键盘。按下一个键,你其实收到两段反馈:行程中的阻力,和触底那一刻的咔哒声。复古界面是把这声"咔哒"翻译成视觉——整像素的网格、一屏内有限的配色,以及一块不糊的硬阴影。阴影加粗边框一起,就是"按下去了"的证据,比模糊投影更容易被眼睛抓住。配色通常不超过四五档,颜色越少,状态层级越清楚,用户扫一眼就知道哪个能点、哪个危险。下面这几行变量,先替你把约束锁死,避免每处组件各挑各的颜色:
/* 用变量锁死网格单位与 8 位配色,后续组件只引用 */
:root {
--px: 4px; /* 一格,位移和阴影都按它的倍数走 */
--ink: #1a1a1a;
--paper: #f6f1e7;
--accent: #e4572e;
}
三步落地,把反馈铺满页面
有了"阴影 + 位移"这条骨架,按页面从高频到低频逐个补即可。
步骤 1:为按钮加硬阴影与按压位移
按钮是你点得最多的元素,先让它在按住时"吃进"一格、松开再弹回,反馈才像游戏而不是网页:
/* 解决"按钮按下去没有反应"的问题 */
.quest-btn {
padding: .6rem 1rem;
border: 3px solid var(--ink);
box-shadow: calc(var(--px) * 1.5) 0 0 var(--ink);
transition: transform 60ms steps(2, end);
}
/* 按住时右下移一格,阴影随之收窄,形成触底感 */
.quest-btn:active {
transform: translate(6px, 0);
box-shadow: 0 0 0 var(--ink);
}
位移和阴影都取 --px 的整数倍,整页按钮按下时节奏一致,不会各动各的。
步骤 2:给空数据区写叙事化插画文案
列表为空时别只丢一句"暂无数据"。用一块像素插画加一句带动作的话,把等待变成下一步的提示:
<!-- 解决"空列表一片空白、用户不知道做什么" -->
<section class="empty-farm">
<svg width="96" height="96" aria-hidden="true">
<rect x="40" y="72" width="16" height="16" fill="#8a5a2b"/>
<path d="M48 40V72M48 52l16-8M48 58l-16-8"
stroke="#2f9e44" stroke-width="4" fill="none"/>
</svg>
<p>这块地还空着</p>
<button class="quest-btn">种下第一颗种子</button>
</section>
插画只画两三块色块就够,真正的信息量在那句话里;文案带上一个动词,用户才知道下一步该做什么。
步骤 3:用可勾选任务清单做新手引导
模态框一次灌输太多,不如把引导拆成几条可勾选的小任务,完成一条点亮一条,进度本身就是激励:
// 用可勾选任务替代一次性弹窗
const tasks = [
{ id: "till", label: "放置一块耕地", done: false },
{ id: "shop", label: "去商店买一把锄头", done: false },
];
function markDone(id) {
const t = tasks.find((x) => x.id === id);
if (t) t.done = true;
if (tasks.every((x) => x.done)) toast("今天收工啦");
}
任务控制在三条以内,超过就拆成两天,避免一上来就被吓到。
资源速查:从样式底座到配色素材
上面三处代码引用的组件都能在项目 README 里按小节查到,按用途分成底座、反馈、素材三组,基本够撑起一个完整的复古页面。
- 可换的复古样式底座:NES.css、PSone.css、98.css、System.css,直接引入即有成组的 8 位组件;System.css 偏苹果复古,适合工具类页面。
- 反馈与动效素材:Buttons、Loading Spinners、React Gamification 三小节,分别对应步骤 1 的按压、步骤 2 等待时的加载、完成时的奖励动画。
- 素材与配色:Pixel Art、Palette Generators、Empty states,用来补插画和统一色板;配色生成器导出的变量可直接接到开头那组
:root。
性能也是隐形反馈,PERF.md 里的图片压缩和资源提示能让这些动效不掉帧。
常见误区:错误做法到正确做法
- 用抖动效果铺满整屏 → 只在关键图标边缘少量使用,大面积留干净底色。
- 高 DPI 屏幕上直接放大像素图 → 加
image-rendering: pixelated保住硬边。 - 不同像素密度的图标混在一起 → 统一到同一网格尺寸再上。
- 整站都做成 8 位风 → 只在点缀组件上用,主体保留常规样式以保证可用性。
约束换来清晰,反馈换来温度。从一块按钮的硬阴影改起,先把按压位移做对。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



