从理论到实践:gh_mirrors/skill2/skills核心组件设计原则全解析
【免费下载链接】skills Skills for Design Engineers. 项目地址: https://gitcode.com/gh_mirrors/skill2/skills
gh_mirrors/skill2/skills是一个专注于设计工程师技能的开源项目,提供了丰富的组件设计原则和动画标准,帮助开发者构建既美观又实用的用户界面。本文将深入解析该项目的核心组件设计原则,从哲学理念到实践技巧,为你呈现一套完整的设计工程方法论。
设计工程的核心哲学:细节决定体验
设计工程不仅仅是实现功能,更是通过无数看不见的细节来打造卓越的用户体验。gh_mirrors/skill2/skills项目基于Emil Kowalski的设计工程理念,强调三个核心哲学:
品味是培养的,而非天生的 🎨
良好的设计品味不是与生俱来的,而是通过学习和实践培养的。项目鼓励开发者研究优秀界面的设计原理,逆向工程动画效果,深入思考"为什么某些设计感觉更好"。这种对细节的关注和持续学习的态度,是提升设计能力的关键。
看不见的细节会产生复利效应 🔄
大多数用户不会有意识地注意到界面中的每一个细节,但正是这些细节的总和决定了整体体验。正如Paul Graham所说:"所有那些看不见的细节结合起来,产生了令人惊叹的效果,就像一千个几乎听不见的声音和谐地歌唱。"
美感是一种杠杆 🚀
在功能相似的软件中,美感成为了差异化的关键因素。gh_mirrors/skill2/skills项目认为,美感是一种未被充分利用的杠杆,可以帮助产品在竞争中脱颖而出。
动画决策框架:从必要性到实现细节
动画是UI设计中不可或缺的一部分,但并非所有元素都需要动画。项目提供了一个清晰的动画决策框架,帮助开发者做出明智的选择。
1. 是否应该动画?频率决定一切
动画的必要性首先取决于用户看到它的频率:
| 频率 | 决策 |
|---|---|
| 每天100次以上(键盘快捷键、命令面板切换) | 从不添加动画 |
| 每天数十次(悬停效果、列表导航) | 移除或大幅减少动画 |
| 偶尔出现(模态框、抽屉、提示) | 标准动画 |
| 罕见/首次出现(引导页、反馈、庆祝) | 可以添加趣味动画 |
重要原则:永远不要为键盘触发的动作添加动画。这些动作每天重复数百次,动画会使它们感觉缓慢和脱节。Raycast没有打开/关闭动画,这对于每天使用数百次的工具来说是最佳体验。
2. 动画的目的:明确才能有效
每个动画都必须有明确的目的,有效的动画目的包括:
- 空间一致性:如提示框从同一方向进入和退出,使滑动关闭感觉直观
- 状态指示:如变形的反馈按钮显示状态变化
- 解释说明:如展示功能工作原理的营销动画
- 反馈:如按钮按下时缩小,确认界面接收到用户操作
- 防止突兀变化:无过渡地出现或消失的元素会感觉破碎
如果动画的目的只是"看起来很酷",且用户会经常看到它,那么就不应该添加这个动画。
3. 缓动函数选择:感觉比数学更重要
选择合适的缓动函数可以极大地影响动画的感觉:
- 进入或退出 →
ease-out(开始快,感觉响应迅速) - 屏幕上移动/变形 →
ease-in-out - 悬停/颜色变化 →
ease - 恒定运动(跑马灯、进度条) →
linear - 默认 →
ease-out
关键建议:不要在UI上使用ease-in。它开始缓慢,延迟了用户正在观察的确切时刻。200ms的ease-out感觉比200ms的ease-in更快。
内置的CSS缓动函数通常效果较弱,项目推荐使用更强的自定义曲线:
--ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* 用于UI的强ease-out */
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* 用于屏幕移动的强ease-in-out */
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS风格抽屉曲线(Ionic) */
4. 动画持续时间:快即是美
UI动画的持续时间直接影响用户对响应速度的感知:
| 元素 | 持续时间 |
|---|---|
| 按钮按下反馈 | 100–160ms |
| 工具提示、小弹出框 | 125–200ms |
| 下拉菜单、选择器 | 150–250ms |
| 模态框、抽屉 | 200–500ms |
| 营销/说明动画 | 可以更长 |
规则:UI动画应保持在300ms以内。180ms的下拉菜单比400ms的感觉更响应。更快的加载指示器会让加载感觉更快(实际时间相同)。
组件构建原则:打造令人愉悦的交互体验
gh_mirrors/skill2/skills项目提供了一系列组件构建原则,帮助开发者创建既美观又实用的UI元素。
按钮必须有响应感 🔘
按钮是最基本的交互元素,必须在按下时提供即时反馈。项目建议在:active状态添加transform: scale(0.97):
.button {
transition: transform 160ms ease-out;
}
.button:active {
transform: scale(0.97);
}
这种微妙的缩放(0.95-0.98)适用于任何可按压元素,让UI感觉真正在倾听用户。
永远不要从scale(0)开始动画 🚫
现实世界中没有东西会完全消失然后重新出现。从scale(0)动画的元素看起来像是凭空出现的。
正确的做法是从scale(0.9)或更高值开始,结合不透明度:
/* 错误 */
.entering {
transform: scale(0);
}
/* 正确 */
.entering {
transform: scale(0.95);
opacity: 0;
}
即使是几乎可见的初始缩放,也能让入场感觉更自然,就像一个即使放气也有可见形状的气球。
让弹出框知道其来源位置 🎯
弹出框应该从其触发元素缩放进入,而不是从中心。默认的transform-origin: center几乎对所有弹出框都是错误的。例外:模态框,它们应该保持transform-origin: center,因为它们不锚定到特定触发元素——它们出现在视口中心。
/* Radix UI */
.popover {
transform-origin: var(--radix-popover-content-transform-origin);
}
/* 基础UI */
.popover {
transform-origin: var(--transform-origin);
}
用户是否单独注意到差异并不重要。在总体上,看不见的细节会变得可见。它们会产生复利效应。
使用CSS过渡而非关键帧实现可中断UI 🔄
CSS过渡可以在动画过程中被中断和重新定向,而关键帧动画会从零开始重新启动。对于任何可以快速触发的交互(添加提示、切换状态),过渡会产生更平滑的结果:
/* 可中断 - 适合UI */
.toast {
transition: transform 400ms ease;
}
/* 不可中断 - 避免用于动态UI */
@keyframes slideIn {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
性能优化:流畅动画的关键
美观的动画如果导致性能问题,反而会损害用户体验。项目提供了一系列性能优化技巧。
只动画transform和opacity 🚀
这两个属性跳过布局和绘制,在GPU上运行。动画padding、margin、height或width会触发所有三个渲染步骤。
避免通过父元素的CSS变量驱动子元素变换 ⚠️
在父元素上更改CSS变量会重新计算所有子元素的样式。在有许多项目的抽屉中,更新容器上的--swipe-amount会导致昂贵的样式重计算。应该直接在元素上更新transform:
// 不好:触发所有子元素的重计算
element.style.setProperty('--swipe-amount', `${distance}px`);
// 好:只影响这个元素
element.style.transform = `translateY(${distance}px)`;
CSS动画在负载下优于JS 📊
CSS动画在主线程外运行。当浏览器忙于加载新页面时,使用requestAnimationFrame的Framer Motion动画会丢帧,而CSS动画保持流畅。对预定动画使用CSS;对动态、可中断的动画使用JS。
Web Animations API:兼顾控制与性能 🎮
Web Animations API (WAAPI) 提供了JavaScript控制和CSS性能的结合。硬件加速、可中断,且不需要库:
element.animate([{ clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0 0)' }], {
duration: 1000,
fill: 'forwards',
easing: 'cubic-bezier(0.77, 0, 0.175, 1)',
});
无障碍设计:动画的包容性考量 ♿️
好的设计应该对所有人都友好,包括那些对动画敏感的用户。
prefers-reduced-motion媒体查询
动画可能导致晕动症。减少动画意味着更少和更温和的动画,而不是零动画。保留有助于理解的不透明度和颜色过渡,移除移动和位置动画:
@media (prefers-reduced-motion: reduce) {
.element {
animation: fade 0.2s ease;
/* 没有基于transform的运动 */
}
}
const shouldReduceMotion = useReducedMotion();
const closedX = shouldReduceMotion ? 0 : '-100%';
触摸设备上的悬停状态
触摸设备在点击时会触发悬停,导致误报。应该使用媒体查询限制悬停动画:
@media (hover: hover) and (pointer: fine) {
.element:hover {
transform: scale(1.05);
}
}
Sonner原则:构建受喜爱的组件 💖
这些原则来自构建Sonner(每周1300万+ npm下载)的经验,适用于任何组件:
-
开发者体验是关键。无需钩子、上下文或复杂设置。插入
<Toaster />一次,从任何地方调用toast()。采用的摩擦越小,使用的人就越多。 -
好的默认值比选项更重要。开箱即美。大多数用户从不自定义。默认的缓动、时间和视觉设计应该是优秀的。
-
命名创造身份。"Sonner"(法语中"to ring"的意思)比"react-toast"感觉更优雅。在适当的时候,为了可记忆性而牺牲可发现性。
-
无形地处理边缘情况。当标签页隐藏时暂停提示计时器。用伪元素填充堆叠提示之间的间隙以保持悬停状态。拖动时捕获指针事件。用户永远不会注意到这些,这正是正确的。
-
对动态UI使用过渡,而不是关键帧。提示会快速添加。关键帧在中断时从零重新开始。过渡会平滑地重新定向。
-
构建出色的文档网站。让人们在使用产品之前触摸它、体验它、理解它。带有即用型代码片段的交互式示例降低了采用门槛。
实用工具与资源:提升设计工程技能
gh_mirrors/skill2/skills项目不仅提供理论指导,还包含了实用工具和资源,帮助开发者提升设计工程技能。
动画调试技巧 🔍
-
慢动作测试:以降低的速度播放动画,发现全速时不可见的问题。临时将持续时间增加到正常的2-5倍,或使用浏览器DevTools动画检查器减慢播放速度。
-
逐帧检查:在Chrome DevTools(动画面板)中逐帧浏览动画。这揭示了协调属性之间在全速时无法看到的时间问题。
-
在真实设备上测试:对于触摸交互(抽屉、滑动手势),在物理设备上测试。通过USB连接手机,通过IP地址访问本地开发服务器,并使用Safari的远程开发工具。
组件审查清单 ✅
审查UI代码时,检查以下常见问题:
| 问题 | 修复 |
|---|---|
transition: all | 指定确切属性:transition: transform 200ms ease-out |
scale(0) 入场动画 | 从scale(0.95)和opacity: 0开始 |
UI元素上的ease-in | 切换到ease-out或自定义曲线 |
弹出框上的transform-origin: center | 设置为触发位置或使用Radix/Base UI CSS变量(模态框除外 - 保持居中) |
| 键盘动作上的动画 | 完全移除动画 |
| UI元素上持续时间>300ms | 减少到150-250ms |
| 没有媒体查询的悬停动画 | 添加@media (hover: hover) and (pointer: fine) |
| 快速触发元素上的关键帧 | 使用CSS过渡实现可中断性 |
负载下的Framer Motion x/y属性 | 使用transform: "translateX()"实现硬件加速 |
| 相同的进入/退出过渡速度 | 使退出比进入更快(例如,进入2s,退出200ms) |
| 元素同时出现 | 添加交错延迟(项目之间30-80ms) |
结语:细节成就卓越
gh_mirrors/skill2/skills项目提供的核心组件设计原则,强调了细节在创建卓越用户体验中的重要性。从动画决策到组件构建,从性能优化到无障碍设计,每一个方面都体现了"看不见的细节会产生复利效应"的核心理念。
通过将这些原则应用到实际项目中,开发者不仅能创建出视觉上吸引人的界面,还能打造出真正让用户感到愉悦和高效的交互体验。记住,在软件世界中,当功能已经足够好时,品味和细节成为了真正的差异化因素。
要开始使用gh_mirrors/skill2/skills项目,只需克隆仓库:
git clone https://gitcode.com/gh_mirrors/skill2/skills
探索项目中的skills/emil-design-eng/SKILL.md和skills/review-animations/STANDARDS.md文件,深入了解设计工程的精髓,开始构建令人惊叹的用户界面。
【免费下载链接】skills Skills for Design Engineers. 项目地址: https://gitcode.com/gh_mirrors/skill2/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



