关于 make-interfaces-feel-better
make-interfaces-feel-better 技能用于构建或审查 UI 代码时改进视觉、动效和性能细节。它提供具体的 CSS 与动画原则,并要求用表格整理变更。
主要功能
- 01应用同心圆角规则
- 02改善视觉对齐与表面层次
- 03设计可中断和分段动画
- 04优化排版与数字布局
- 05限制过渡属性和 will-change 用法
- 06用变更前后表格记录审查结果
适用场景
- 01润饰嵌套卡片和控件
- 02改善动态计数器与文本换行
- 03审查动画和交互细节
- 04记录供代码审查的 UI 变更
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ watermeloncorp/ watermelon-platform --skill make-interfaces-feel-better安装后在 Claude Code 中输入/make-interfaces-feel-better确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
animations.mdperformance.mdsurfaces.mdtypography.md详细介绍
让界面体验更佳的细节
优秀的界面很少只靠单一因素打造。通常是许多细节相互叠加,最终带来出色的体验。构建或审查 UI 代码时,请遵循以下原则。
快速参考
| 类别 | 适用场景 |
|---|---|
| 排版 | 文本换行、字体平滑、等宽数字 |
| 表面 | 边框圆角、视觉对齐、阴影、图像轮廓、点击区域 |
| 动画 | 可中断的动画、进入/退出过渡、图标动画、按压缩放 |
| 性能 | 过渡属性的精确指定、will-change 的使用 |
核心原则
1. 同心边框圆角
外层圆角 = 内层圆角 + 内边距。嵌套元素的圆角不匹配,是最常见的界面观感不协调问题。
2. 优先视觉对齐,而非几何对齐
几何居中看起来不协调时,请以视觉效果为准进行对齐。带图标的按钮、播放三角形和不对称图标都需要手动调整。
3. 用阴影代替边框
叠加多个透明的 box-shadow 值,营造自然的层次感。阴影适用于任何背景,而纯色边框则不然。
4. 使用可中断的动画
交互状态变化使用 CSS 过渡——它们可以在动画进行中被打断。关键帧则留给只运行一次的分阶段动画序列。
5. 拆分并错开进入动画
不要为单个容器添加动画。将内容拆分为语义区块,并为每个区块依次增加约 100ms 的延迟。
6. 采用轻柔的退出动画
使用较小的固定 translateY,而非完整高度。退出动画应该比进入动画更轻柔。
7. 使用贴合情境的图标动画
使用 opacity、scale 和 blur 为图标添加动画,而非切换可见性。请严格使用以下数值:缩放从 0.25 到 1,不透明度从 0 到 1,模糊从 4px 到 0px。如果项目的 package.json 中包含 motion 或 framer-motion,请使用 transition: { type: "spring", duration: 0.3, bounce: 0 }——bounce 必须始终为 0。如果没有安装动画库,请将两个图标都保留在 DOM 中(其中一个采用绝对定位),并使用 cubic-bezier(0.2, 0, 0, 1) 通过 CSS 过渡实现交叉淡化——这样无需依赖任何库,就能同时实现进入和退出动画。
8. 字体平滑
在 macOS 上,为根布局应用 -webkit-font-smoothing: antialiased,让文本显示更清晰。
9. 等宽数字
对任何动态更新的数字使用 font-variant-numeric: tabular-nums,避免布局偏移。
10. 文本换行
在标题上使用 text-wrap: balance。在正文上使用 text-wrap: pretty,避免出现孤行。
11. 图像轮廓
为图像添加低不透明度的细微 1px 轮廓,以保持层次感一致。浅色模式下必须使用纯黑色(rgba(0, 0, 0, 0.1)),深色模式下必须使用纯白色(rgba(255, 255, 255, 0.1))——不要使用 slate、zinc 等近黑色或任何带色调的中性色。带色调的轮廓会吸收下方表面的颜色,在图像边缘看起来像污渍。
12. 按压缩放
点击时轻微缩放至 scale(0.96),可让按钮带来触感反馈。始终使用 0.96。绝不要使用小于 0.95 的值——低于此值会显得过于夸张。添加 static 属性,以便在动画可能造成干扰时将其禁用。
13. 跳过页面加载时的动画
在 AnimatePresence 上使用 initial={false},避免首次渲染时播放进入动画。请确认这不会破坏有意设置的入场动画。
14. 绝不使用 transition: all
始终精确指定属性:transition-property: scale, opacity。Tailwind 的 transition-transform 涵盖 transform, translate, scale, rotate。
15. 谨慎使用 will-change
仅用于 GPU 可以合成的属性:transform、opacity、filter。绝不使用 will-change: all。只有在注意到首帧卡顿时才添加。
16. 最小点击区域
交互元素的点击区域至少需要 40×40px。如果可见元素较小,请使用伪元素扩展点击区域。绝不要让两个元素的点击区域重叠。
常见错误
| 错误 | 修正方法 |
|---|---|
| 父元素和子元素使用相同的圆角半径 | 计算 outerRadius = innerRadius + padding |
| 图标看起来没有居中 | 使用内边距进行视觉调整,或直接修正 SVG |
| 区块之间的边界生硬 | 使用带透明度的分层 box-shadow |
| 入场/退场动画突兀 | 拆分动画、错开播放,并让退场效果更轻柔 |
| 数字导致布局偏移 | 应用 tabular-nums |
| macOS 上的文字显得粗重 | 对根元素应用 antialiased |
| 页面加载时就播放动画 | 将 initial={false} 添加到 AnimatePresence |
元素使用 transition: all | 指定确切的属性 |
| 动画首帧卡顿 | 添加 will-change: transform(谨慎使用) |
| 小型控件的点击区域太小 | 使用伪元素扩展到 40×40px |
审查输出格式
始终使用带有 Before 和 After 列的 Markdown 表格展示更改。列出你所做的每一项更改,不要只列出其中一部分。切勿在表格之外用单独的“Before:”/“After:”行列出问题。按原则分组,在每个表格上方添加标题;每行只聚焦于一处差异,让读者能够快速浏览完整列表。
示例
同心圆角
| Before | After |
|---|---|
卡片和内部按钮(p-2)均使用 rounded-xl | 卡片使用 rounded-2xl(12 + 8),内部按钮使用 rounded-lg |
两个嵌套表面均使用 border-radius: 16px | 外层使用 24px,内层使用 16px,内边距为 8px |
等宽数字
| Before | After |
|---|---|
动画计数器使用 <span>{count}</span> | 使用 <span className="tabular-nums">{count}</span> |
| 计时器使用默认数字 | 在根元素添加 font-variant-numeric: tabular-nums |
按压时缩放
| Before | After |
|---|---|
<button className="..."> | 添加 active:scale-[0.96] transition-transform |
按压时使用 scale(0.9) | 提高到 scale(0.96)——低于 0.95 会显得夸张 |
如果某项改动不明显,表格行应注明具体文件和更改的具体属性。如果审查了某个原则但无需更改,则省略相应表格;空表格会造成干扰。
审查清单
- 嵌套的圆角元素使用同心圆角
- 图标在视觉上居中,而不只是几何居中
- 在适当的情况下使用阴影代替边框
- 入场动画经过拆分并错开播放
- 退场动画轻柔
- 动态数字使用 tabular-nums
- 已应用字体平滑
- 标题使用 text-wrap: balance
- 图片带有细微描边
- 在适当的情况下,按钮按压时会缩放
- AnimatePresence 对默认状态元素使用
initial={false} - 不使用
transition: all,只指定具体属性 -
will-change只用于 transform/opacity/filter,绝不使用all - 交互元素的点击区域至少为 40×40px
参考文件
- typography.md — 文本换行、字体平滑、等宽数字
- surfaces.md — 圆角、视觉对齐、阴影、图片描边
- animations.md — 可中断动画、入场/退场过渡、图标动画、按压时缩放
- performance.md — 过渡属性的指定、
will-change的使用