从理论到实践:gh_mirrors/skill2/skills核心组件设计原则全解析

从理论到实践:gh_mirrors/skill2/skills核心组件设计原则全解析

【免费下载链接】skills Skills for Design Engineers. 【免费下载链接】skills 项目地址: 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上运行。动画paddingmarginheightwidth会触发所有三个渲染步骤。

避免通过父元素的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下载)的经验,适用于任何组件:

  1. 开发者体验是关键。无需钩子、上下文或复杂设置。插入<Toaster />一次,从任何地方调用toast()。采用的摩擦越小,使用的人就越多。

  2. 好的默认值比选项更重要。开箱即美。大多数用户从不自定义。默认的缓动、时间和视觉设计应该是优秀的。

  3. 命名创造身份。"Sonner"(法语中"to ring"的意思)比"react-toast"感觉更优雅。在适当的时候,为了可记忆性而牺牲可发现性。

  4. 无形地处理边缘情况。当标签页隐藏时暂停提示计时器。用伪元素填充堆叠提示之间的间隙以保持悬停状态。拖动时捕获指针事件。用户永远不会注意到这些,这正是正确的。

  5. 对动态UI使用过渡,而不是关键帧。提示会快速添加。关键帧在中断时从零重新开始。过渡会平滑地重新定向。

  6. 构建出色的文档网站。让人们在使用产品之前触摸它、体验它、理解它。带有即用型代码片段的交互式示例降低了采用门槛。

实用工具与资源:提升设计工程技能

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.mdskills/review-animations/STANDARDS.md文件,深入了解设计工程的精髓,开始构建令人惊叹的用户界面。

【免费下载链接】skills Skills for Design Engineers. 【免费下载链接】skills 项目地址: https://gitcode.com/gh_mirrors/skill2/skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值