ui-ux-guidelines
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUI/UX Implementation Details
UI/UX实现细节
Note: For high-level design rules (hit targets, focus rings, contrast, etc.), defer towhich fetches live standards from Vercel. This skill provides implementation-specific details.vercel-design-guidelines
注意: 如需了解高阶设计规则(点击目标、聚焦环、对比度等),请参考,它会从Vercel拉取最新的官方标准。本skill提供实现层面的专属细节。vercel-design-guidelines
Interactions
交互
Keyboard & Focus
键盘与聚焦
- MUST: Full keyboard support per WAI-ARIA APG
- MUST: Manage focus (trap, move, return) per APG patterns
- MUST: Group focus with where appropriate
:focus-within
- 必须:遵循WAI-ARIA APG规范提供完整的键盘支持
- 必须:按照APG模式管理焦点(捕获、移动、返回)
- 必须:合适场景下使用对焦点进行分组
:focus-within
Touch & Input
触控与输入
- MUST: to prevent double-tap zoom
touch-action: manipulation - MUST: Set to match design
-webkit-tap-highlight-color - MUST: Mobile font-size ≥16px to prevent iOS zoom, or use:
<input>html<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover">
- 必须:设置防止双击缩放
touch-action: manipulation - 必须:设置匹配设计规范
-webkit-tap-highlight-color - 必须:移动端字体大小≥16px以避免iOS自动缩放,或使用如下配置:
<input>html<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover">
Form Behavior
表单行为
- MUST: Hydration-safe inputs (no lost focus/value)
- NEVER: Block paste in /
<input><textarea> - MUST: Enter submits text input; in , Cmd/Ctrl+Enter submits
<textarea> - MUST: Keep submit enabled until request starts; use idempotency key
- MUST: Allow submitting incomplete forms to surface validation
- MUST: Errors inline next to fields; on submit, focus first error
- MUST: + meaningful
autocomplete; correctnameandtypeinputmode - SHOULD: Disable spellcheck for emails/codes/usernames
- SHOULD: Placeholders end with ellipsis and show example (e.g., )
sk-012345... - MUST: Warn on unsaved changes before navigation
- MUST: Compatible with password managers & 2FA
- MUST: Trim values to handle text expansion trailing spaces
- MUST: No dead zones on checkboxes/radios; label+control share hit target
- 必须:输入组件支持hydration安全(不会丢失焦点/输入值)
- 禁止:在/
<input>中阻止粘贴操作<textarea> - 必须:回车提交文本输入;在中,Cmd/Ctrl+回车提交
<textarea> - 必须:在请求发起前保持提交按钮可用;使用幂等键
- 必须:允许提交未完成的表单以展示校验结果
- 必须:错误信息内嵌展示在对应字段旁;提交后聚焦第一个错误字段
- 必须:设置属性和有意义的
autocomplete属性;使用正确的name和typeinputmode - 建议:对邮箱/验证码/用户名输入框禁用拼写检查
- 建议:占位符以省略号结尾并展示示例(例如)
sk-012345... - 必须:导航前如果有未保存的更改需要提示用户
- 必须:兼容密码管理器和双因素认证(2FA)
- 必须:对输入值进行去首尾空格处理,避免文本扩展产生的尾部空格问题
- 必须:复选框/单选框没有点击死区;标签和控件共享点击区域
State & Navigation
状态与导航
- MUST: URL reflects state (filters/tabs/pagination). Prefer nuqs
- MUST: Back/Forward restores scroll
- MUST: Links use /
<a>(support Cmd/Ctrl/middle-click)<Link>
- 必须:URL反映页面状态(筛选/标签页/分页)。推荐使用nuqs
- 必须:前进/后退操作恢复滚动位置
- 必须:链接使用/
<a>组件(支持Cmd/Ctrl/鼠标中键点击)<Link>
Feedback
反馈
- SHOULD: Optimistic UI with reconciliation; on failure show error or Undo
- MUST: Confirm destructive actions or provide Undo window
- MUST: Use polite for toasts/inline validation
aria-live - SHOULD: Ellipsis for follow-ups ("Rename...") and loading ("Saving...")
- 建议:使用乐观UI搭配状态校验;操作失败时展示错误信息或提供撤销入口
- 必须:破坏性操作需要二次确认或提供撤销窗口期
- 必须:对toast/内嵌校验使用polite模式的属性
aria-live - 建议:后续操作和加载状态使用省略号(例如"重命名..."、"保存中...")
Touch/Drag
触控/拖拽
- MUST: Delay first tooltip; subsequent peers no delay
- MUST: in modals/drawers
overscroll-behavior: contain - MUST: During drag, disable text selection and set on dragged element
inert
- 必须:首次展示tooltip添加延迟,后续相邻元素的tooltip无需延迟
- 必须:在模态框/抽屉中设置
overscroll-behavior: contain - 必须:拖拽过程中禁用文本选择,并为被拖拽元素设置属性
inert
Animation
动画
- SHOULD: Prefer CSS > Web Animations API > JS libraries
- MUST: Animations are interruptible and input-driven (avoid autoplay)
- MUST: Correct (motion starts where it "physically" should)
transform-origin
- 建议:优先选择CSS > Web Animations API > JS动画库
- 必须:动画可中断且由输入触发(避免自动播放)
- 必须:设置正确的(动画应该从"物理上"合理的位置开始)
transform-origin
Cross-Browser
跨浏览器兼容
- MUST: Apply CSS transforms to SVG children (), not parent
<g><svg> - MUST: Set and
transform-box: fill-boxon SVGtransform-origin: center - SHOULD: Use or
translateZ(0)for text anti-aliasing artifactswill-change: transform
- 必须:给SVG的子元素()而非父级
<g>应用CSS transform<svg> - 必须:给SVG设置和
transform-box: fill-boxtransform-origin: center - 建议:使用或
translateZ(0)解决文本抗锯齿异常问题will-change: transform
Layout
布局
- SHOULD: Optical alignment; adjust by +/-1px when perception beats geometry
- MUST: Deliberate alignment to grid/baseline/edges
- SHOULD: Balance icon/text lockups (stroke/weight/size/spacing/color)
- MUST: Verify mobile, laptop, ultra-wide (simulate at 50% zoom)
- MUST: Respect safe areas ()
env(safe-area-inset-*) - MUST: Avoid unwanted scrollbars; fix overflows
- 建议:采用视觉对齐;当视觉感知效果优于几何对齐时可调整±1px
- 必须:有意识地和网格/基线/边缘对齐
- 建议:平衡图标/文本组合(描边/字重/尺寸/间距/颜色)
- 必须:验证移动端、笔记本、超宽屏的展示效果(模拟50%缩放场景)
- 必须:适配安全区域()
env(safe-area-inset-*) - 必须:避免出现非预期的滚动条;修复溢出问题
Content & Accessibility
内容与无障碍
- SHOULD: Inline help first; tooltips last resort
- MUST: Skeletons mirror final content (avoid layout shift)
- MUST: matches current context
<title> - MUST: No dead ends; always offer next step/recovery
- MUST: Design empty/sparse/dense/error states
- SHOULD: Curly quotes (" "); avoid widows/orphans
- MUST: Tabular numbers for comparisons ()
font-variant-numeric: tabular-nums - MUST: Redundant status cues (not color-only); icons have text labels
- MUST: Use ellipsis character (not
...)... - MUST: on headings; include "Skip to content" link
scroll-margin-top - MUST: Resilient to user-generated content (short/avg/very long)
- MUST: Locale-aware dates/times/numbers/currency
- MUST: Use non-breaking spaces: ,
10 MBCmd + K - MUST: Detect language via header, NOT IP geolocation
Accept-Language
- 建议:优先使用内嵌帮助提示, tooltip作为最后备选方案
- 必须:骨架屏和最终内容结构一致(避免布局偏移)
- 必须:和当前页面上下文匹配
<title> - 必须:没有访问死路;始终提供下一步操作或错误恢复路径
- 必须:设计空状态/稀疏状态/密集状态/错误状态
- 建议:使用弯引号(" ");避免孤行/寡行
- 必须:对比场景下使用表格数字()
font-variant-numeric: tabular-nums - 必须:提供冗余的状态提示(不能仅用颜色区分);图标要有文本标签
- 必须:使用省略号字符而非三个点
…... - 必须:给标题设置;提供"跳转到内容"链接
scroll-margin-top - 必须:兼容各种长度的用户生成内容(短/中等/超长)
- 必须:日期/时间/数字/货币支持本地化适配
- 必须:使用非换行空格:、
10 MBCmd + K - 必须:通过请求头检测用户语言,而非IP地理位置
Accept-Language
Performance
性能
- SHOULD: Test iOS Low Power Mode and macOS Safari
- MUST: Measure reliably (disable extensions that skew runtime)
- MUST: Track and minimize re-renders (React DevTools/React Scan)
- MUST: Profile with CPU/network throttling
- MUST: Batch layout reads/writes; avoid reflows/repaints
- MUST: Mutations complete in <500ms
- SHOULD: Prefer uncontrolled inputs; make controlled loops cheap
- MUST: Virtualize large lists (virtua) or
content-visibility: auto - MUST: Preload only above-the-fold images; lazy-load rest
- MUST: Prevent CLS from images (explicit dimensions)
- SHOULD: for asset/CDN domains
<link rel="preconnect"> - SHOULD: Preload critical fonts; subset via
unicode-range - SHOULD: Move expensive work to Web Workers
- 建议:测试iOS低功耗模式和macOS Safari下的表现
- 必须:进行可靠的性能测量(禁用会影响运行时间的浏览器扩展)
- 必须:监控并最小化重渲染(使用React DevTools/React Scan)
- 必须:在CPU/网络节流条件下进行性能分析
- 必须:批量处理布局读/写操作;避免重排/重绘
- 必须:DOM变更操作在<500ms内完成
- 建议:优先使用非受控组件;降低受控组件循环的性能开销
- 必须:对长列表进行虚拟化(virtua)或使用
content-visibility: auto - 必须:仅预加载首屏图片;其余图片懒加载
- 必须:给图片设置明确尺寸避免CLS(累积布局偏移)
- 建议:给静态资源/CDN域名添加
<link rel="preconnect"> - 建议:预加载关键字体;通过进行字体子集化
unicode-range - 建议:将计算密集型任务转移到Web Workers执行
Design
设计
- SHOULD: Layered shadows (ambient + direct)
- SHOULD: Crisp edges via semi-transparent borders + shadows
- SHOULD: Nested radii: child <= parent; concentric
- SHOULD: Hue consistency: tint borders/shadows/text toward bg hue
- MUST: Accessible charts (color-blind-friendly palettes)
- MUST: Increase contrast on /
:hover/:active:focus - SHOULD: Set to match page background
<meta name="theme-color"> - MUST: Set on
color-scheme: darkin dark themes<html> - MUST: On Windows, set explicit and
background-coloroncolor<select> - SHOULD: Avoid gradient banding (use masks when needed)
- 建议:使用分层阴影(环境光+直射光)
- 建议:通过半透明边框+阴影实现锐利边缘
- 建议:嵌套圆角规则:子元素圆角≤父元素圆角;保持同心
- 建议:色调一致性:边框/阴影/文本的色调向背景色靠拢
- 必须:图表支持无障碍访问(使用色盲友好的配色方案)
- 必须:在/
:hover/:active状态下提高对比度:focus - 建议:设置匹配页面背景色
<meta name="theme-color"> - 必须:深色主题下给标签设置
<html>color-scheme: dark - 必须:在Windows系统下给设置明确的
<select>和background-colorcolor - 建议:避免渐变色带(必要时使用遮罩)
Common Violations
常见违规示例
Blocking paste
阻止粘贴操作
tsx
// Bad
<input onPaste={(e) => e.preventDefault()} />
// Good
<input type="email" autoComplete="email" />tsx
// Bad
<input onPaste={(e) => e.preventDefault()} />
// Good
<input type="email" autoComplete="email" />Non-semantic button
非语义化按钮
tsx
// Bad
<div onClick={handleClick}>Click me</div>
// Good
<button onClick={handleClick}>Click me</button>tsx
// Bad
<div onClick={handleClick}>Click me</div>
// Good
<button onClick={handleClick}>Click me</button>Windows select dark mode
Windows下select组件深色模式适配
tsx
// Bad
<select><option>Option 1</option></select>
// Good
<select className="bg-white dark:bg-gray-900 text-black dark:text-white">
<option>Option 1</option>
</select>tsx
// Bad
<select><option>Option 1</option></select>
// Good
<select className="bg-white dark:bg-gray-900 text-black dark:text-white">
<option>Option 1</option>
</select>