High
平滑滚动 Smooth Scroll
NavigationWeb
锚点链接应平滑滚动到目标区块,而非瞬间跳转。
✓ 在 html 元素上设置 scroll-behavior: smooth。
✗ 不要让页面无过渡地直接跳到锚点位置。
代码示例
✓ html { scroll-behavior: smooth; }✗ <a href='#section'> without CSS
Medium
固定导航遮挡 Sticky Navigation
NavigationWeb
固定导航不应盖住页面内容。
✓ 给 body 加上与导航等高的 padding-top。
✗ 不要让导航压住首屏区块的内容。
代码示例
✓ pt-20 (if nav is h-20)
✗ No padding compensation
Medium
当前项高亮 Active State
NavigationAll
当前所在页面或区块要有明确的视觉标识。
✓ 用颜色或下划线高亮当前导航项。
✗ 不要所有导航链接一个样式、不指示当前位置。
代码示例
✓ text-primary border-b-2
✗ All links same style
High
返回键行为 Back Button
NavigationMobile
返回操作必须符合用户预期。
✓ 用 history.pushState() 正确维护导航历史。
✗ 不要破坏浏览器或 App 的返回行为。
代码示例
✓ history.pushState()
✗ location.replace()
Medium
深链接 Deep Linking
NavigationAll
URL 应反映当前状态,便于分享和刷新恢复。
✓ 状态或视图变化时同步更新 URL(query 参数或 hash)。
✗ 不要让动态内容的所有状态共用一个静态 URL。
代码示例
✓ Use query params or hash
✗ Single URL for all states
Low
面包屑 Breadcrumbs
NavigationWeb
面包屑用于展示用户在站点层级中的位置。
✓ 站点层级达到 3 层及以上时使用面包屑。
✗ 不要在扁平的单层站点上加面包屑。
代码示例
✓ Home > Category > Product
✗ Only on deep nested pages
High
动效过多 Excessive Motion
AnimationAll
动画过多会分散注意力,甚至引发眩晕。
✓ 每屏最多给 1-2 个关键元素加动画。
✗ 不要给所有元素都加上动效。
代码示例
✓ Single hero animation
✗ animate-bounce on 5+ elements
Medium
动画时长 Duration Timing
AnimationAll
动画要跟手,不能拖沓。
✓ 微交互控制在 150-300ms。
✗ UI 动画不要超过 500ms。
代码示例
✓ transition-all duration-200
✗ duration-1000
High
减弱动效偏好 Reduced Motion
AnimationAll
必须尊重用户的系统动效偏好设置。
✓ 用 @media (prefers-reduced-motion: reduce) 提供降级方案。
✗ 不要忽略无障碍动效设置照常播放动画。
代码示例
✓ @media (prefers-reduced-motion: reduce)
✗ No motion query check
High
加载状态 Loading States
AnimationAll
异步操作期间必须给出进行中的反馈。
✓ 用 skeleton 屏或 spinner 占位。
✗ 不要让界面停在空白或冻结状态。
代码示例
✓ animate-pulse skeleton
✗ Blank screen while loading
High
hover 不适用触屏 Hover vs Tap
AnimationAll
触摸设备上没有 hover 状态。
✓ 主要交互一律用 click/tap 触发。
✗ 不要把重要操作只挂在 hover 上。
代码示例
✓ onClick handler
✗ onMouseEnter only
Medium
无限循环动画 Continuous Animation
AnimationAll
永不停止的动画会持续干扰注意力。
✓ 只在加载指示器上使用无限循环动画。
✗ 不要给装饰性元素加无限循环动画。
代码示例
✓ animate-spin on loader
✗ animate-bounce on icons
Medium
动画性能 Transform Performance
AnimationWeb
部分 CSS 属性会触发昂贵的重排重绘。
✓ 动画只改 transform 和 opacity。
✗ 不要动画 width/height/top/left。
代码示例
✓ transform: translateY()
✗ top: 10px animation
Low
缓动曲线 Easing Functions
AnimationAll
线性运动显得机械生硬。
✓ 入场用 ease-out,出场用 ease-in。
✗ UI 过渡不要用 linear。
代码示例
✓ ease-out
✗ linear
High
z-index 管理 Z-Index Management
LayoutWeb
层叠冲突会导致元素被意外遮挡。
✓ 定义一套 z-index 层级规范(10/20/30/50)。
✗ 不要随手写 z-[9999] 之类的超大值。
代码示例
✓ z-10 z-20 z-50
✗ z-[9999]
Medium
overflow 裁切 Overflow Hidden
LayoutWeb
隐藏溢出可能裁掉重要内容。
✓ 先确认内容能完整容纳,需要滚动时用 overflow-auto。
✗ 不要无脑套 overflow-hidden。
代码示例
✓ overflow-auto with scroll
✗ overflow-hidden truncating content
Medium
固定定位冲突 Fixed Positioning
LayoutWeb
多个 fixed 元素容易互相遮挡或无法触达。
✓ 为 fixed 元素预留安全区域并规划彼此位置。
✗ 不要随意堆叠多个 fixed 元素。
代码示例
✓ Fixed nav + fixed bottom with gap
✗ Multiple overlapping fixed elements
Medium
层叠上下文 Stacking Context
LayoutWeb
新的层叠上下文会重置内部的 z-index。
✓ 搞清楚哪些属性会创建新的层叠上下文。
✗ 不要指望 z-index 跨层叠上下文生效。
代码示例
✓ Parent with z-index isolates children
✗ z-index: 9999 not working
High
布局抖动 Content Jumping
LayoutWeb
内容加载后顶动布局的体验很糟。
✓ 用 aspect-ratio 或固定高度为异步内容预留空间。
✗ 不要给图片不写尺寸、任由内容撑动布局。
代码示例
✓ aspect-ratio or fixed height
✗ No dimensions on images
Medium
视口单位 Viewport Units
LayoutWeb
100vh 在移动端浏览器上会被工具栏影响。
✓ 用 dvh,或显式计入移动端浏览器 chrome 高度。
✗ 移动端全屏布局不要用 100vh。
代码示例
✓ min-h-dvh or min-h-screen
✗ h-screen on mobile
Medium
容器宽度 Container Width
LayoutWeb
行宽过大的正文很难阅读。
✓ 正文容器 max-width 限制在 65-75ch。
✗ 不要让正文铺满整个 viewport 宽度。
代码示例
✓ max-w-prose or max-w-3xl
✗ Full width paragraphs
High
触控目标尺寸 Touch Target Size
TouchMobile
过小的按钮很难准确点中。
✓ 触控目标最小 44x44px。
✗ 不要做只有图标大小的可点区域。
代码示例
✓ min-h-[44px] min-w-[44px]
✗ w-6 h-6 buttons
Medium
触控间距 Touch Spacing
TouchMobile
相邻触控目标挨太近容易误触。
✓ 相邻触控目标之间至少留 8px 间距。
✗ 不要把可点元素紧挨着排列。
代码示例
✓ gap-2 between buttons
✗ gap-0 or gap-1
Medium
手势冲突 Gesture Conflicts
TouchMobile
自定义手势会和系统手势打架。
✓ 主内容区避免使用横向滑动手势。
✗ 不要覆盖系统级手势。
代码示例
✓ Vertical scroll primary
✗ Horizontal swipe carousel only
Medium
点击延迟 Tap Delay
TouchMobile
移动端 300ms 点击延迟会让交互显得迟钝。
✓ 给可点元素加 touch-action: manipulation。
✗ 不要放任默认的移动端点击处理。
代码示例
✓ touch-action: manipulation
✗ No touch optimization
Low
下拉刷新 Pull to Refresh
TouchMobile
误触发的下拉刷新很打断操作。
✓ 不需要的区域用 overscroll-behavior: contain 关掉。
✗ 不要全局默认开启下拉刷新。
代码示例
✓ overscroll-behavior: contain
✗ Default overscroll
Low
触感反馈 Haptic Feedback
TouchMobile
适度的振动反馈能提升操作手感。
✓ 只在确认类和重要操作时触发振动。
✗ 不要每次点击都振动。
代码示例
✓ navigator.vibrate(10)
✗ Vibrate on every tap
High
focus 状态 Focus States
InteractionAll
键盘用户依赖可见的 focus 指示。
✓ 可交互元素保留清晰的 focus ring。
✗ 不要写 outline-none 却不提供替代样式。
代码示例
✓ focus:ring-2 focus:ring-blue-500
✗ outline-none without alternative
Medium
hover 状态 Hover States
InteractionWeb
可交互元素需要即时的视觉反馈。
✓ hover 时改变 cursor 并加轻微视觉变化。
✗ 不要让可点元素毫无 hover 反馈。
代码示例
✓ hover:bg-gray-100 cursor-pointer
✗ No hover style
Medium
按下状态 Active States
InteractionAll
点击瞬间就要给出反馈。
✓ 加 active 态视觉变化,如 active:scale-95。
✗ 不要在按下过程中没有任何变化。
代码示例
✓ active:scale-95
✗ No active state
Medium
禁用状态 Disabled States
InteractionAll
不可交互元素要一眼可辨。
✓ 降低透明度并把 cursor 改为 not-allowed。
✗ 不要让禁用态和正常态长得一样。
代码示例
✓ opacity-50 cursor-not-allowed
✗ Same style as enabled
High
按钮加载态 Loading Buttons
InteractionAll
异步提交期间要防止重复触发。
✓ 提交时禁用按钮并显示 loading 指示。
✗ 不要允许处理过程中反复点击。
代码示例
✓ disabled={loading} spinner✗ Button clickable while loading
High
错误反馈 Error Feedback
InteractionAll
操作失败必须让用户知道。
✓ 在出错位置附近给出明确的错误信息。
✗ 不要静默失败、不给任何提示。
代码示例
✓ Red border + error message
✗ No indication of error
Medium
成功反馈 Success Feedback
InteractionAll
操作成功也需要确认。
✓ 用 toast 或状态变化确认操作已完成。
✗ 不要让操作悄无声息地结束。
代码示例
✓ Toast notification or checkmark
✗ Action completes silently
High
二次确认 Confirmation Dialogs
InteractionAll
要防止误触发的破坏性操作。
✓ 删除等不可逆操作前弹确认 modal。
✗ 不要点一下就直接执行删除。
代码示例
✓ Are you sure modal
✗ Direct delete on click
High
颜色对比度 Color Contrast
AccessibilityAll
文字必须在背景上清晰可读。
✓ 正文对比度至少 4.5:1(WCAG AA)。
✗ 不要用 #999 配白底这种低对比度组合。
代码示例
✓ #333 on white (7:1)
✗ #999 on white (2.8:1)
High
不只靠颜色 Color Only
AccessibilityAll
信息不能只靠颜色传达。
✓ 颜色之外再补图标或文字说明。
✗ 不要只用红绿区分错误与成功。
代码示例
✓ Red text + error icon
✗ Red border only for error
High
图片替代文本 Alt Text
AccessibilityAll
图片需要文字替代内容。
✓ 为有信息量的图片写描述性 alt。
✗ 内容图片的 alt 不要留空或缺失。
代码示例
✓ alt='Dog playing in park'
✗ alt='' for content images
Medium
标题层级 Heading Hierarchy
AccessibilityWeb
屏幕阅读器依赖标题层级导航。
✓ 按 h1-h6 顺序逐级使用标题。
✗ 不要跳级,也不要为了字号大小滥用标题标签。
代码示例
✓ h1 then h2 then h3
✗ h1 then h4
High
ARIA 标签 ARIA Labels
AccessibilityAll
可交互元素需要可访问名称。
✓ 纯图标按钮加 aria-label。
✗ 不要让图标按钮没有任何文字标签。
代码示例
✓ aria-label='Close menu'
✗ <button><Icon/></button>
High
键盘导航 Keyboard Navigation
AccessibilityWeb
所有功能都应能用键盘完成。
✓ 让 Tab 顺序与视觉顺序保持一致。
✗ 不要制造键盘陷阱或 Tab 不可达的元素。
代码示例
✓ tabIndex for custom order
✗ Unreachable elements
Medium
屏幕阅读器 Screen Reader
AccessibilityAll
内容朗读出来也要说得通。
✓ 使用语义化 HTML 和正确的 ARIA 属性。
✗ 不要用一堆无语义的 div 堆页面。
代码示例
✓ <nav> <main> <article>
✗ <div> for everything
High
表单标签关联 Form Labels
AccessibilityAll
输入框必须有关联的标签。
✓ 用 label 的 for 属性关联,或用 label 包裹 input。
✗ 不要只靠 placeholder 当标签。
代码示例
✓ <label for='email'>
✗ placeholder='Email' only
High
错误播报 Error Messages
AccessibilityAll
错误信息要能被辅助技术播报。
✓ 错误容器加 role="alert" 或 aria-live。
✗ 不要只做视觉上的错误提示(如仅红框)。
代码示例
✓ role='alert'
✗ Red border only
Medium
跳过导航链接 Skip Links
AccessibilityWeb
键盘用户需要跳过重复导航。
✓ 在页面顶部提供「跳到主内容」链接。
✗ 导航密集的页面不要缺 skip link。
代码示例
✓ Skip to main content link
✗ 100 tabs to reach content
High
图片优化 Image Optimization
PerformanceAll
过大的图片会拖慢页面加载。
✓ 用合适的尺寸与格式(WebP),配 srcset 多档。
✗ 不要用 4000px 原图去显示 400px 的位置。
代码示例
✓ srcset with multiple sizes
✗ 4000px image for 400px display
Medium
懒加载 Lazy Loading
PerformanceAll
内容按需加载而非一次全量拉取。
✓ 首屏以下的图片和内容加 loading="lazy"。
✗ 不要让所有图片都 eager 加载。
代码示例
✓ loading='lazy'
✗ All images eager load
Medium
代码分割 Code Splitting
PerformanceWeb
过大的 bundle 拖慢首屏。
✓ 按路由或功能用 dynamic import() 拆包。
✗ 不要把所有代码打进一个 bundle。
代码示例
✓ dynamic import()
✗ All code in main bundle
Medium
缓存策略 Caching
PerformanceWeb
重复访问应该更快。
✓ 设置合理的 Cache-Control 响应头。
✗ 不要每个请求都回源。
代码示例
✓ Cache-Control headers
✗ Every request hits server
Medium
字体加载阻塞 Font Loading
PerformanceWeb
Web 字体可能阻塞文字渲染。
✓ 用 font-display: swap 或 optional。
✗ 不要出现 FOIT(字体加载期间文字不可见)。
代码示例
✓ font-display: swap
✗ FOIT (Flash of Invisible Text)
Medium
第三方脚本 Third Party Scripts
PerformanceWeb
外部脚本会阻塞渲染。
✓ 非关键脚本用 async 或 defer 加载。
✗ 不要在 head 里同步引入第三方脚本。
代码示例
✓ async or defer attribute
✗ <script src='...'> in head
Medium
包体积 Bundle Size
PerformanceWeb
JavaScript 过大会拖慢可交互时间。
✓ 用 bundle analyzer 持续监控并压缩体积。
✗ 不要放任 bundle 体积无限增长。
代码示例
✓ Bundle analyzer
✗ No size monitoring
Medium
渲染阻塞 Render Blocking
PerformanceWeb
CSS/JS 会阻塞首次绘制。
✓ 内联关键 CSS,其余延后加载。
✗ 不要把所有 CSS 都塞进 head 阻塞首屏。
代码示例
✓ Critical CSS inline
✗ All CSS in head
High
输入框标签 Input Labels
FormsAll
每个输入框都要有可见标签。
✓ 标签常驻显示在输入框上方或左侧。
✗ 不要用 placeholder 代替标签。
代码示例
✓ <label>Email</label><input>
✗ placeholder='Email' only
Medium
错误提示位置 Error Placement
FormsAll
错误提示应出现在问题旁边。
✓ 把错误信息显示在对应输入框下方。
✗ 不要把所有错误堆在表单顶部。
代码示例
✓ Error under each field
✗ All errors at form top
Medium
即时校验 Inline Validation
FormsAll
输入过程中或失焦时就该校验。
✓ 多数字段在 blur 时触发校验。
✗ 不要只在提交时才一次性校验。
代码示例
✓ onBlur validation
✗ Submit-only validation
Medium
输入类型 Input Types
FormsAll
输入框类型要匹配内容语义。
✓ 按内容使用 email/tel/number/url 等类型。
✗ 不要所有输入都写 type="text"。
代码示例
✓ type='email'
✗ type='text' for email
Medium
自动填充 Autofill Support
FormsWeb
要配合浏览器的自动填充能力。
✓ 正确设置 autocomplete 属性,如 autocomplete="email"。
✗ 不要到处写 autocomplete="off" 屏蔽自动填充。
代码示例
✓ autocomplete='email'
✗ autocomplete='off' everywhere
Medium
必填标识 Required Indicators
FormsAll
必填字段要标注清楚。
✓ 用星号或「(必填)」文字标出必填项。
✗ 不要让用户猜哪些字段是必填的。
代码示例
✓ * required indicator
✗ Guess which are required
Medium
密码可见切换 Password Visibility
FormsAll
输入密码时应允许查看明文。
✓ 提供显示/隐藏密码的切换按钮。
✗ 不要让密码永远只能是圆点。
代码示例
✓ Show/hide password button
✗ Password always hidden
High
提交反馈 Submit Feedback
FormsAll
表单提交要有明确的状态反馈。
✓ 提交后依次展示加载态和成功/失败结果。
✗ 不要点完提交按钮毫无反应。
代码示例
✓ Loading -> Success message
✗ Button click with no response
Medium
输入框可辨识 Input Affordance
FormsAll
输入框要看起来就是可输入的。
✓ 给 input 明确的边框或背景色。
✗ 不要做成看起来像纯文本的无边框输入框。
代码示例
✓ Border/background on inputs
✗ Borderless inputs
Medium
移动端键盘 Mobile Keyboards
FormsMobile
不同输入内容要唤起对应键盘。
✓ 用 inputmode 指定键盘类型,如 inputmode="numeric"。
✗ 不要所有输入都弹默认文本键盘。
代码示例
✓ inputmode='numeric'
✗ Text keyboard for numbers
Medium
移动优先 Mobile First
ResponsiveWeb
先做移动端,再向大屏增强。
✓ 默认写移动端样式,再用 md:/lg:/xl: 断点递进。
✗ 不要 desktop-first 再用 max-width 查询补移动端。
代码示例
✓ Default mobile + md: lg: xl:
✗ Desktop default + max-width queries
Medium
断点测试 Breakpoint Testing
ResponsiveWeb
要覆盖常见屏幕尺寸验证布局。
✓ 在 320/375/414/768/1024/1440 各测一遍。
✗ 不要只在自己的设备上测。
代码示例
✓ Multiple device testing
✗ Single device development
High
移动端可触控 Touch Friendly
ResponsiveWeb
移动端布局需要触控级别的目标尺寸。
✓ 在移动断点上放大按钮和可点区域。
✗ 不要在移动端沿用桌面尺寸的小目标。
代码示例
✓ Larger buttons on mobile
✗ Desktop-sized targets on mobile
High
正文字号 Readable Font Size
ResponsiveAll
文字在各设备上都要可读。
✓ 移动端正文最小 16px(text-base 起)。
✗ 不要用 text-xs 做正文。
代码示例
✓ text-base or larger
✗ text-xs for body text
High
viewport meta Viewport Meta
ResponsiveWeb
移动端必须声明 viewport。
✓ 写 <meta name="viewport" content="width=device-width, initial-scale=1">。
✗ 不要遗漏或写错 viewport meta 标签。
代码示例
✓ <meta name='viewport'...>
✗ No viewport meta tag
High
横向滚动 Horizontal Scroll
ResponsiveWeb
页面不应出现意外的横向滚动。
✓ 确保内容宽度不超出 viewport(max-w-full)。
✗ 不要让移动端出现横向滚动条。
代码示例
✓ max-w-full overflow-x-hidden
✗ Horizontal scrollbar on mobile
Medium
图片自适应 Image Scaling
ResponsiveWeb
图片应随容器缩放。
✓ 图片设 max-width: 100% 和 height: auto。
✗ 不要给图片写死像素宽度。
代码示例
✓ max-w-full h-auto
✗ width='800' fixed
Medium
表格适配 Table Handling
ResponsiveWeb
宽表格在移动端容易溢出。
✓ 套 overflow-x-auto 容器,或改成卡片布局。
✗ 不要让宽表格撑破页面布局。
代码示例
✓ overflow-x-auto wrapper
✗ Table overflows viewport
Medium
行高 Line Height
TypographyAll
合适的行高显著提升可读性。
✓ 正文行高取 1.5-1.75。
✗ 行高不要过挤(如 leading-none)或过松。
代码示例
✓ leading-relaxed (1.625)
✗ leading-none (1)
Medium
行长 Line Length
TypographyWeb
过长的行会让阅读疲劳。
✓ 每行限制在 65-75 个字符(max-w-prose)。
✗ 大屏上不要让文本满宽排布。
代码示例
✓ max-w-prose
✗ Full viewport width text
Medium
字号阶梯 Font Size Scale
TypographyAll
统一的字号层级便于快速扫读。
✓ 使用固定的模块化字号阶梯(12/14/16/18/24/32)。
✗ 不要随手写任意字号。
代码示例
✓ Type scale (12 14 16 18 24 32)
✗ Arbitrary sizes
Medium
字体切换抖动 Font Loading
TypographyWeb
字体加载完成时不应引起布局位移。
✓ 配置度量相近的 fallback 字体并用 font-display: swap。
✗ 不要不设 fallback 字体。
代码示例
✓ font-display: swap + similar fallback
✗ No fallback font
High
正文对比度 Contrast Readability
TypographyAll
正文需要足够的明暗对比。
✓ 浅色背景上用足够深的文字色。
✗ 不要浅灰背景配浅灰文字。
代码示例
✓ text-gray-900 on white
✗ text-gray-400 on gray-100
Medium
标题区分度 Heading Clarity
TypographyAll
标题要从正文中跳出来。
✓ 用明显的字号和字重差异区分标题。
✗ 不要让标题和正文看起来一样。
代码示例
✓ Bold + larger size
✗ Same size as body
High
加载指示 Loading Indicators
FeedbackAll
等待期间要持续展示系统状态。
✓ 超过 300ms 的操作显示 skeleton 或 spinner。
✗ 不要让界面在加载期间毫无状态。
代码示例
✓ Skeleton or spinner
✗ Frozen UI
Medium
空状态 Empty States
FeedbackAll
没有内容时也要引导用户。
✓ 给出说明文案和下一步操作入口。
✗ 不要留一片空白页面。
代码示例
✓ No items yet. Create one!
✗ Empty white space
Medium
错误恢复 Error Recovery
FeedbackAll
出错后要能帮用户走出来。
✓ 提供明确的下一步,如重试按钮加帮助链接。
✗ 不要只报错不给恢复路径。
代码示例
✓ Try again button + help link
✗ Error message only
Medium
进度指示 Progress Indicators
FeedbackAll
多步流程要让用户知道进行到哪一步。
✓ 显示步骤指示器或进度条,如「第 2 步 / 共 4 步」。
✗ 不要让多步流程完全没有进度信息。
代码示例
✓ Step 2 of 4 indicator
✗ No step information
Medium
toast 通知 Toast Notifications
FeedbackAll
toast 用于承载非关键的临时信息。
✓ toast 在 3-5 秒后自动消失。
✗ 不要做永不消失的常驻 toast。
代码示例
✓ Auto-dismiss toast
✗ Persistent toast
Medium
成功确认 Confirmation Messages
FeedbackAll
成功的操作要给出确认。
✓ 用简短的成功提示确认操作结果。
✗ 不要成功了却一声不吭。
代码示例
✓ Saved successfully toast
✗ No confirmation
Medium
文本截断 Truncation
ContentAll
超长内容要优雅处理。
✓ 用 line-clamp 截断并提供展开操作。
✗ 不要让长文本溢出或撑坏布局。
代码示例
✓ line-clamp-2 with expand
✗ Overflow or cut off
Low
日期格式 Date Formatting
ContentAll
日期要符合用户所在地区的习惯。
✓ 使用相对时间或 locale 感知的日期格式。
✗ 不要用 01/02/03 这种有歧义的写法。
代码示例
✓ 2 hours ago or locale format
✗ 01/02/03
Low
数字格式 Number Formatting
ContentAll
大数字要格式化后再展示。
✓ 加千分位分隔符或用缩写,如 1.2K、1,234。
✗ 不要直接输出 1234567 这种长串数字。
代码示例
✓ 1.2K or 1,234
✗ 1234567
Low
占位内容 Placeholder Content
ContentAll
开发期的占位内容也应贴近真实。
✓ 使用真实感的示例数据。
✗ 不要满屏 Lorem ipsum。
代码示例
✓ Real sample content
✗ Lorem ipsum
Medium
引导可跳过 User Freedom
OnboardingAll
用户应能自由跳过新手引导。
✓ 提供「跳过」和「上一步」按钮。
✗ 不要强制走完不可跳过的线性引导。
代码示例
✓ Skip Tutorial button
✗ Locked overlay until finished
Medium
搜索联想 Autocomplete
SearchWeb
联想补全能帮用户更快找到结果。
✓ 输入时防抖请求并展示联想下拉。
✗ 不要要求用户输完整再回车才有结果。
代码示例
✓ Debounced fetch + dropdown
✗ No suggestions
Medium
无结果页 No Results
SearchWeb
搜不到结果是常见的断头路。
✓ 显示「无结果」并给出替代搜索建议。
✗ 不要只丢一句「0 条结果」或一片空白。
代码示例
✓ Try searching for X instead
✗ No results found.
Low
批量操作 Bulk Actions
Data EntryWeb
逐条编辑效率太低。
✓ 提供多选和批量编辑(复选框列加操作栏)。
✗ 不要只提供逐行的单条操作。
代码示例
✓ Checkbox column + Action bar
✗ Repeated actions per row
High
AI 身份标注 Disclaimer
AI InteractionAll
用户有权知道自己在和 AI 对话。
✓ 明确标注 AI 生成的内容和 AI 助手身份。
✗ 不要用真人名字包装 AI、把 AI 伪装成人。
代码示例
✓ AI Assistant label
✗ Fake human name without label
Medium
流式输出 Streaming
AI InteractionAll
等待完整回复的过程太漫长。
✓ 逐 token 流式返回文本。
✗ 不要让用户对着 spinner 干等 10 秒以上。
代码示例
✓ Typewriter effect
✗ Spinner until 100% complete
High
注视反馈 Gaze Hover
Spatial UIVisionOS
VisionOS 元素应在 pinch 之前就响应眼动。
✓ 用 hoverEffect() 让注视中的元素放大或高亮。
✗ 不要在 pinch 之前保持完全静止无反馈。
代码示例
✓ hoverEffect()
✗ onTap only
Medium
深度层次 Depth Layering
Spatial UIVisionOS
空间 UI 需要 Z 轴深度把内容与环境分开。
✓ 使用玻璃材质和 z 轴偏移,如 .glassBackgroundEffect()。
✗ 不要用不透明的平板面板挡住真实视野。
代码示例
✓ .glassBackgroundEffect()
✗ bg-white
Medium
视频自动播放 Auto-Play Video
SustainabilityWeb
视频消耗大量流量和电量。
✓ 改为点击播放,或离屏时暂停(playsInline muted preload="none")。
✗ 不要自动循环播放高清视频。
代码示例
✓ playsInline muted preload='none'
✗ autoplay loop
Medium
资源体积 Asset Weight
SustainabilityWeb
过重的 3D 和图片资源会推高碳足迹。
✓ 压缩并懒加载 3D 模型,如用 Draco 压缩。
✗ 不要加载 50MB 贴图或未压缩的 .obj 原始文件。
代码示例
✓ Draco compression
✗ Raw .obj files
Low
AI 反馈闭环 Feedback Loop
AI InteractionAll
AI 需要用户反馈来持续改进。
✓ 提供点赞/点踩或「重新生成」入口。
✗ 不要只给只读的静态输出。
代码示例
✓ Feedback component
✗ Read-only text
High
动效敏感 Motion Sensitivity
AccessibilityAll
视差和滚动劫持会引发眩晕。
✓ 遵循 prefers-reduced-motion,关闭滚动特效。
✗ 不要强制对所有用户施加滚动动效。
代码示例
✓ @media (prefers-reduced-motion)
✗ ScrollTrigger.create()