Web 界面指南
界面的成功来自成百上千个抉择。此清单是持续更新的、非穷尽的实践集合。多数指南与框架无关,部分条目针对 React/Next.js。欢迎反馈。
交互(Interactions)
- 键盘无处不在:所有流程都需可用键盘操作,并遵循 WAI-ARIA Authoring Patterns。
- 清晰的焦点:所有可聚焦元素都要显示可见的焦点环;优先用
,成组控件可用1
:focus-visible
。1
:focus-within
- 管理焦点:使用焦点陷阱,按 WAI-ARIA 规范移动并归还焦点。
- 视觉与点击目标一致:若视觉目标 < 24px,扩大命中区域 ≥ 24px;在移动端最小 44px。
- 移动端输入字号:
在移动端字体 ≥ 16px 以避免 iOS Safari 聚焦时自动放大;或设置1
<input>
限制缩放。1
meta viewport
- 尊重缩放:不要禁用浏览器缩放。
- 水合安全输入:水合后输入框不应丢失焦点或值。
- 允许粘贴:不要禁用
/1
<input>
的粘贴。1
<textarea>
- 按钮加载态:显示加载指示器并保留原标签文案。
- 最小加载显示时长:给骨架/菊花添加 150–300ms 的显示延迟与 300–500ms 的最小可见时长,避免闪烁;React 的
会自动处理。1
<Suspense>
- URL 即状态:把状态持久化到 URL,支持分享/刷新/前进后退(例如 nuqs)。
- 乐观更新:成功概率高时先更新 UI;待服务端回应再对账;失败则提示错误并回滚或提供撤销。
- 省略号规则:会引出后续输入的菜单项以”…”结尾(如”重命名…”)。
- 破坏性操作需确认:要求确认或提供可撤销窗口。
- 阻止控件双击放大:设置
。1
touch-action: manipulation
- 点击高亮可控:设置
。1
-webkit-tap-highlight-color
- 宽容交互:更大命中区、清晰可供性、可预测交互(如”预测锥”)。
- 提示气泡时序:一组内首个延迟,后续同组不延迟。
- 过滚动行为:在模态/抽屉等场景有意设置
。1
overscroll-behavior: contain
- 滚动位置持久:前进/后退应恢复上次滚动。
- 自动聚焦提速:桌面端且只有一个主要输入时自动聚焦;移动端很少自动聚焦以免键盘导致布局移动。
- 无”死区”:看起来可点的区域都应可点。
- 深链一切:筛选、标签页、分页、展开面板,凡是用
的状态都可深链。1
useState
- 干净拖拽:拖拽时禁用文本选择并应用
,避免同时触发选中/悬停。1
inert
- 链接就是链接:导航使用
/1
<a>
,不要用1
<Link>
/1
<button>
代替,以保留新开标签等浏览器行为。1
<div>
- 公告异步更新:对吐司/行内校验用礼貌的 aria-live。
- 本地化快捷键:适配非 QWERTY 键位并显示平台符号。
动效(Animations)
- 尊重
,提供低动效版本。1
prefers-reduced-motion
- 实现优先级:首选 CSS,其次 Web Animations API,再次 JS 库。
- 复合层友好:优先
/1
transform
,避免触发布局/重绘的属性。1
opacity
- 必要性检查:只在澄清因果或带来”恰到好处的愉悦”时使用动效。
- 缓动契合对象:根据变化的内容选择缓动。
- 可打断:用户输入可取消动画。
- 输入驱动:避免自动播放,响应用户动作。
- 正确的变换原点:从”物理上”的起点出发。
- 禁用
:只列出需要的属性(常见为1
transition: all
、1
opacity
)。1
transform
- 跨浏览器 SVG 变换:对
外包一层并设置1
<g>
。1
transform-box: fill-box; transform-origin: center;
布局(Layout)
- 光学对齐:当感知优于几何时,允许 ±1px 的微调。
- 有意对齐:每个元素都与某个网格/基线/边缘/视觉中心对齐,避免偶然摆放。
- 锁定组合的对比平衡:图标与文字并列时调节粗细/大小/间距/颜色以避免冲突。
- 响应式覆盖:在手机/笔电/超宽屏都验证;超宽用 50% 缩放模拟。
- 安全区:考虑刘海与内边距(safe-area 变量)。
- 避免多余滚动条:修正溢出,只渲染有用滚动条;macOS 可设”始终显示”以模拟 Windows。
- 让浏览器决定尺寸:优先 flex/grid/内在布局,避免 JS 测量引发抖动。
内容(Content)
- 优先行内帮助:工具提示是下下策。
- 稳定骨架屏:骨架应与最终内容结构一致,避免布局跳动。
- 精准页面标题:
需反映当前上下文。1
<title>
- 无死路:每个页面都提供下一步或补救路径。
- 所有状态都设计:空/稀疏/密集/错误态。
- 引号:优先弯引号(” “)。
- 避免”寡行/孤行”:整理换行与参差边。
- 比较用等宽数字:
或使用等宽字体(如 Geist Mono)。1
font-variant-numeric: tabular-nums
- 冗余状态提示:不要只靠颜色,还要有文字标签。
- 图标配标签:给非视力用户提供文本等价。
- 不要把”无障碍语义”漏掉:视觉可省标签,但无障碍名/标签仍需存在。
- 使用省略号字符:用
而不是1
…
。1
...
- 锚点标题:为可链接的标题设置
。1
scroll-margin-top
- 适应用户生成内容:布局能处理短/中/极长文本。
- 本地化格式:日期/时间/数字/分隔符/货币按用户本地化。
- 语言优先于位置:通过
与1
Accept-Language
检测语言,不要靠 IP/GPS。1
navigator.languages
- 无障碍内容:准确设置
,装饰性元素用1
aria-label
,并在可访问性树中验证。1
aria-hidden
- 仅图标按钮要命名:提供描述性的
。1
aria-label
- 语义优先于 ARIA:优先原生元素(
/1
button
/1
a
/1
label
)。1
table
- 标题层级与跳转链接:正确使用
,提供”跳至内容”链接。1
<h1–h6>
- 从 Logo 获取品牌资源:右击导航 Logo 可快速获取品牌资产。
- 不换行空格:单位、快捷键、名称用
粘连(如1
、1
10 MB
、1
⌘ + K
);不加空格可用1
Vercel SDK
。1
⁠
表单(Forms)
- Enter 提交:文本输入聚焦时,回车提交。
- 文本域行为:
提交;单独 Enter 换行。1
⌘/Ctrl+Enter
- 标签无处不在:每个控件都有
或等效关联。1
<label>
- 点击标签聚焦控件。
- 提交规则:提交开始前保持可点击;请求在途时禁用并显示加载,包含等幂键。
- 不要阻断输入:即便只接受数字也允许任意键入,再做校验反馈。
- 不要预先禁用提交:允许提交不完整表单以暴露校验。
- 控件无”死区”:复选/单选的控件与标签合并成大命中区。
- 错误就地显示:在字段旁显示;提交后聚焦首个错误。
- 自动填充:设置合适的
与有意义的1
autocomplete
。1
name
- 选择性拼写检查:对邮箱、代码、用户名等禁用拼写检查。
- 正确的
/1
type
:获得更好的键盘与校验。1
inputmode
- 占位符表示”空”:以省略号结尾。
- 占位符示例值:放示例或模式(如电话号码、API Key)。
- 未保存更改:离开前警告可能丢失数据。
- 密码管理器与 2FA:确保兼容,允许粘贴一次性验证码。
- 不要误触发密码管理器:搜索等非认证字段避免保留名;用
或更具体的 token(如1
autocomplete="off"
)。1
one-time-code
- 文本替换/扩展:某些输入法会加尾随空格;应自动裁剪避免造成误报。
- Windows 的
背景:显式设置1
<select>
与1
background-color
以避免暗色模式对比度问题。1
color
性能(Performance)
- 设备/浏览器矩阵:测试 iOS 省电模式与 macOS Safari。
- 可靠测量:禁用会增加开销或改变运行时的扩展。
- 追踪重渲染:最小化并加速重渲染(用 React DevTools/React Scan)。
- 降速剖析:对 CPU/网络做限速测试。
- 最小化布局工作量:批量读/写,避免不必要回流/重绘。
- 网络时延预算:
< 500ms 完成。1
POST/PATCH/DELETE
- 按键成本:优先非受控输入;若受控,保证回路足够便宜。
- 大列表:虚拟化(如 virtua 或
)。1
content-visibility: auto
- 明智预加载:首屏图片预加载,其余延迟加载。
- 图片不引发 CLS:为图片设置明确尺寸并预留空间。
- 预连接:对资源/CDN 域使用
(必要时加1
<link rel="preconnect">
)以降低 DNS/TLS 延迟。1
crossorigin
- 预加载字体:为关键文本预加载以避免闪烁与布局移位。
- 字体子集化:只运送需要的字符范围/变量轴以缩小体积。
- 避免主线程重活:把超长任务移到 Web Workers,别阻塞交互。
设计(Design)
- 分层阴影:用至少两层模拟环境光+直射光。
- 清晰边界:边框与阴影配合;半透明边框可增强边缘清晰度。
- 半径内外嵌:子元素圆角 ≤ 父元素且同心。
- 色相一致:非中性背景上,边框/阴影/文字往同一色相微调。
- 无障碍图表:使用色盲友好调色板。
- 最小对比:更偏好 APCA 而非 WCAG 2 以获得更符合感知的对比。
- 交互态提高对比:
/1
:hover
/1
:active
比静止态更高对比。1
:focus
- 浏览器 UI 与背景一致:设置
与页面背景对齐。1
<meta name="theme-color">
- 设置
:暗色主题在1
color-scheme
上设1
<html>
以匹配滚动条等设备 UI。1
color-scheme: dark
- 文本抗锯齿与变换:缩放文本会改变平滑;优先给包装容器做动画;必要时
/1
translateZ(0)
升层。1
will-change
- 避免渐变断带:必要时用遮罩改善。
Vercel 特定偏好(Vercel-specific)
这些偏好反映 Vercel 的品牌与产品选择,不是通用准则。
文案(Copywriting)
- 主动语态(例:”安装 CLI”,而非”CLI 将被安装”)。
- 标题/按钮用标题式大小写(Chicago);营销页用句式大小写。
- 清晰、简洁、最少用词。
- 优先用”&”而非”and”。
- 行动导向(例:”安装 CLI…”,而非”你将需要 CLI…”)。
- 名词一致,减少术语数量。
- 第二人称写作,避免第一人称。
- 占位符一致:字符串
;数字1
YOUR_API_TOKEN_HERE
。1
0123456789
- 计数用阿拉伯数字(如”8 次部署”)。
- 货币格式一致:同一上下文中要么 0 小数位,要么 2 位,不能混用。
- 数字与单位留空格(用不换行空格):如
。1
10 MB
- 默认积极表述:即便报错也用鼓励/可解的问题表述(如”出错了——重试或联系支持”)。
- 错误信息引导解决:不仅说明错在哪,还告诉如何修(如”API Key 不正确或过期,请在账号设置生成新 Key”),并配合明确的按钮/链接。
- 避免歧义:标签具体清晰(如用”保存 API Key”,别用”继续”)。
与 Agent 集成(Integrate with Agents)
提供一份
供 Agent 使用。将此文件与 Agent 搭配,以确保自动生成的界面遵循这些指南;建议审计所有生成的界面。页面提供下载链接。1
AGENTS.md