Codex 可以很快生成一个外观完整的注册、结账或联系表单,但“能点击提交”不等于每个人都能完成任务。可访问表单需要同时处理标签、分组、说明、键盘顺序、错误文本、焦点去向和提交反馈。本教程把这些要求整理成七步工作流,让 Codex 在现有设计系统内生成 UI,并用 Playwright 与 axe-core 留下可重复的验证证据。

如果业务规则、错误文案或提交后的去向尚未确定,先找产品、法务或后端确认。Codex 能实现规则、发现冲突和补测试,但不应替团队猜测必填条件、数据用途或授权边界。
把目标路由、现有组件、字段规则和测试命令交给 Codex,要求先不修改文件。审计应回答:每个控件有没有真实 label,相关选项是否使用 fieldset 与 legend 分组,帮助文本和错误文本是否与输入框程序化关联,Tab 顺序是否符合视觉与任务顺序,以及提交后焦点会去哪里。
先不要修改代码。阅读 AGENTS.md、目标表单、设计系统组件和现有测试。输出: 1. 每个字段的可访问名称、说明和必填规则; 2. 键盘顺序与提交后焦点去向; 3. 仅靠颜色、placeholder 或图标表达的信息; 4. 业务规则中仍需人工确认的项目。 不要新建组件库,不要改变接口,不要输出任何凭证。
W3C WAI 建议用 label 标识控件,用 fieldset 与 legend 组织相关选项,并为完成表单提供清晰说明。优先选择原生 input、select、textarea 和 button;只有原生控件无法表达交互时才使用 ARIA。placeholder 可以给示例,但不能代替始终可见的标签。
<label for="email">电子邮箱(必填)</label> <p id="email-hint">用于接收确认邮件,不会公开。</p> <input id="email" name="email" type="email" required autocomplete="email" aria-describedby="email-hint email-error" /> <p id="email-error" hidden></p>

WCAG 2.2 的错误识别要求:自动检测到输入错误时,要指出出错项目并用文本描述错误。不要只把边框变红,也不要只写“格式错误”。更好的文案是“电子邮箱:请输入完整地址,例如 name@example.com”。校验后设置 aria-invalid,并用 aria-describedby 连接错误文本;页面有多个错误时,可在表单顶部增加错误摘要与锚点。
function applyError(input, error, message) {
input.setAttribute("aria-invalid", "true");
error.textContent = message;
error.hidden = false;
}
// 不好:格式错误
// 更好:电子邮箱:请输入完整地址,例如 name@example.com
页面加载就显示一屏红字会制造噪音;只在最终提交时才发现十个错误又会增加返工。通常可以在字段离开焦点后提示格式问题,在提交时汇总所有阻断错误,用户修改后再及时撤销已解决的提示。把未填写、正在编辑、校验失败、提交中、完成或服务端失败都写进状态表,并明确每一状态的焦点、文案与可用操作。
| 状态 | 界面反馈 | 焦点与操作 |
|---|---|---|
| 未填写 | 标签、必填与格式说明可见 | 按任务顺序进入首字段 |
| 正在编辑 | 保留输入,避免无意义打断 | 不自动跳焦点 |
| 校验失败 | 文本错误 + 视觉标记 | 提交后到摘要或首个错误 |
| 提交中 | 公布忙碌状态,防重复提交 | 不清空输入 |
| 完成 / 失败 | 结果清楚、可恢复 | 焦点到确认信息或错误区域 |

OpenAI 的前端用例强调先理解仓库与设计系统,再在真实浏览器中检查多个尺寸。下面的提示词把表单任务写成“输入—边界—证据”,可直接替换方括号内容使用。
任务:在【路由】实现【表单名称】,复用现有设计系统。 输入:字段与业务规则【粘贴或链接】;错误文案【列表】;提交接口【schema】;目标尺寸 390 / 768 / 1440。 语义:所有控件有可访问名称;相关选项用 fieldset/legend;说明和错误与字段关联;必填信息不只靠颜色或星号。 交互:覆盖未填写、编辑、无效、提交中、成功和服务端失败;Tab 顺序自然;提交失败不丢输入;提交后焦点去向明确。 边界:不改接口和业务规则;不新增 UI 框架;不删除焦点样式;不做无关重构。 证据:运行 lint、typecheck、unit、Playwright + axe;给出键盘路径、三档截图、失败项和仍需人工确认的问题。先只读审计并给最小修改计划,再开始改文件。
Playwright 官方示例使用 @axe-core/playwright 扫描页面,并提醒自动检查只能发现部分 WCAG 问题。测试至少覆盖表单初始状态、一个错误提交、键盘修正和成功提交;选择器优先使用 role、label 与可访问名称,这也会反向检验语义是否正确。
import { test, expect } from "@playwright/test";
import AxeBuilder from "@axe-core/playwright";
test("signup form is keyboard usable", async ({ page }) => {
await page.goto("/signup");
await page.getByRole("button", { name: "创建账号" }).click();
const email = page.getByLabel("电子邮箱(必填)");
await expect(email).toBeFocused();
await expect(page.getByText(/请输入完整邮箱地址/)).toBeVisible();
const results = await new AxeBuilder({ page }).analyze();
expect(results.violations).toEqual([]);
});

关闭测试辅助,使用真实浏览器从页面顶部开始,只用 Tab、Shift+Tab、Enter、Space、方向键和 Escape 完成任务。确认焦点始终可见,缩放到 200% 后没有内容遮挡,错误能被理解并修复,成功或失败消息能被感知;有条件时再用 VoiceOver、NVDA 或 TalkBack 复核可访问名称和动态通知。
请在真实浏览器执行并报告证据: 1. 只用键盘完成一次成功提交; 2. 制造三个错误,记录焦点顺序和读到的错误文本; 3. 在 200% 缩放与 390px 宽度复测; 4. 检查控制台、失败请求和资源 404; 5. 把每个失败写成:页面 / 操作 / 期望 / 实际。 修复后重跑相同路径,不要用视觉截图代替键盘与读屏判断。
用 Codex 生成表单 UI,真正的效率来自把可访问性前置成任务结构:先审计语义和业务规则,再实现标签、分组、错误与焦点,最后用自动测试稳定复现、用真实用户路径做判断。这样生成的才不是一张“看起来能填”的表单,而是更多人真的能完成的产品流程。
本文由「设计创意1984」整理编辑,转载请注明出处。
关注设计创意1984,持续获取设计趋势、AI创作方法与创意灵感。


via:OpenAI:Build responsive front-end designs(官方)、W3C Web Accessibility Initiative:Forms Tutorial(Eric Eggert、Shadi Abou-Zahra 等)、W3C WAI:Understanding SC 3.3.1 Error Identification(AG WG)、MDN Contributors:Constraint Validation API、Microsoft Playwright:Accessibility testing(官方文档)
本文由 设计创意1984 作者:admin 发表,转载请注明来源!