BLOG
表单报错提示怎样写得清楚又不打断操作
表单错误不是一句“提交失败”就结束,提示必须指出位置、原因和下一步。
表单报错提示的目标不是“告诉用户错了”,而是让用户知道错在哪一项、为什么错、以及下一步该做什么。一条好的报错信息,应该让用户不用回忆、不用猜测、不用来回切换页面,就能直接修正问题并继续提交。这看起来是文案问题,实际上涉及HTML结构、CSS状态表达和JavaScript校验逻辑的配合。
报错信息的基本结构
一条完整的表单报错,至少包含三个信息:哪个字段出了问题、问题的具体原因、如何修正。比如“邮箱格式不正确”比“请输入有效邮箱”更有用,因为前者告诉用户当前输入不符合规则,后者只提示了期望结果。更完整的写法是“邮箱格式不正确,请使用类似 name@example.com 的格式”,但要注意,示例地址本身不能误导用户。
在HTML层面,报错信息需要和对应的输入框建立明确的关联关系。使用 <label for="email"> 关联输入框的 id,再用 aria-describedby 将报错文本关联到输入框,屏幕阅读器用户就能在聚焦到输入框时听到对应的错误提示。这个关联关系是视觉设计之外的基础设施,没有它,颜色和图标对键盘用户和读屏用户都不起作用。
```html
<label for="email">邮箱</label>
<input type="email" id="email" name="email" aria-describedby="email-error">
<p id="email-error" role="alert">邮箱格式不正确,请检查后重新输入</p>
```
这里 role="alert" 的作用是让屏幕阅读器在报错出现时主动播报,而不是等用户重新聚焦到输入框才发现。需要注意,role="alert" 只应该在错误真正出现时动态插入,如果页面加载时就存在,读屏软件可能会在页面打开时立即播报,反而干扰用户浏览其他内容。
报错出现的位置与时机
报错文本放在输入框下方,而不是输入框上方或页面底部。用户视线自然地从输入框向下移动,这个位置最容易注意到。如果报错集中在页面顶部,用户需要记住错误内容再回到对应字段,增加了认知负担。如果报错出现在输入框上方,用户修改时视线会被遮挡或需要跳过报错文本才能看到输入框。
提交时校验和失焦时校验的取舍也影响体验。提交时统一校验,用户可能一次性看到多个错误,处理起来有压力;失焦时立即校验,用户可能还没输完就被打断。常见的做法是:必填项在失焦时校验是否为空,格式类校验在提交时统一执行。这样既不会在用户输入过程中频繁打断,又能在提交前给出完整的错误清单。
一个容易出错的地方是:用户修正了某个字段的错误后,报错文本是否立即消失。如果用户已经输入了符合格式的内容,但报错还留在页面上,用户会怀疑自己的修改是否生效。正确的行为是,在输入框的 input 事件中重新校验该字段,一旦合法就移除报错文本和错误状态样式。
视觉状态不能只靠颜色
红色边框和红色文字是表单错误的常见表达,但色觉障碍用户可能无法区分红色和正常状态的颜色。WCAG 2.1 的成功标准 1.4.1 要求,颜色不能作为传达信息的唯一手段。因此,报错状态需要同时使用图标、文字或边框粗细变化来辅助表达。
一个可行的方法是:输入框边框变为红色或深色,同时左侧或右侧出现一个警告图标,报错文字本身也包含图标字符或前缀符号。但要注意,图标不能依赖特定的颜色才能被理解,比如一个灰色感叹号在红色背景上可能不够醒目。图标和文字的组合,加上边框变化,才能覆盖更多用户。
窄屏场景下,报错文本可能被挤压成多行,这时需要确保报错文本的 line-height 足够,且输入框下方的空间能容纳展开后的报错内容。如果报错文本是绝对定位的,在窄屏上可能覆盖到下一个输入框,需要检查不同宽度下的布局表现。
服务端校验与前端校验的分工
前端校验负责即时反馈格式问题,服务端校验负责最终的数据合法性。两者不能互相替代。前端校验可以拦截大部分明显错误,但服务端必须再次校验,因为用户可能绕过前端直接提交请求,或者前端脚本加载失败导致校验逻辑没有执行。
当服务端返回错误时,前端需要把错误信息映射到对应的字段上。这要求服务端返回的数据结构包含字段标识和错误信息,比如:
```json
{
"errors": {
"email": "该邮箱已被注册",
"password": "密码长度至少为8位"
}
}
```
前端拿到这个结构后,将错误文本插入到对应字段的报错位置,并更新 aria-describedby 关联。这里常见的错误是服务端返回的字段名和前端HTML中的 name 属性不一致,导致错误无法定位到具体字段。前后端约定字段名时,应直接使用表单的 name 值作为键名。
网络中断或请求超时的情况下,用户点击提交按钮后没有任何响应,这是最糟糕的体验。提交按钮在请求发出后应立即变为禁用状态并显示“提交中”,请求失败后恢复可用并显示“提交失败,请检查网络后重试”。这个错误提示不属于任何字段,可以放在表单顶部或按钮附近,用 role="alert" 播报。
边界情况与常见故障
键盘操作是表单校验中容易忽略的场景。Tab 键遍历表单时,焦点移动到有错误的输入框,报错文本应该能被读屏软件读出。如果报错文本是通过 CSS 伪元素生成的,屏幕阅读器无法读取,必须使用真实的文本节点。另外,当用户按 Enter 提交表单时,如果某个字段校验失败,焦点应该移动到第一个出错的字段,而不是停留在提交按钮上。
长文本输入框的报错位置需要额外考虑。比如一个“个人简介”字段,允许输入500字,当字数超限时,报错如果出现在文本域下方,用户可能需要滚动才能看到。这时可以考虑在文本域的右上方显示字数计数和超限提示,但要注意,这个提示必须和文本域建立关联,否则读屏用户无法感知。
另一个容易出错的场景是密码确认字段。用户输入新密码后,确认密码字段报错“两次输入的密码不一致”,用户需要回到第一个密码字段查看自己输入了什么。如果两个字段距离较远,用户来回切换的成本很高。可以考虑在确认密码字段的报错中,同时提示“请重新输入与上方一致的密码”,但不要显示实际密码内容。
报错文案的写法
报错文案应该使用用户能理解的语言,而不是技术术语。“格式不正确”不如“请输入8位以上数字和字母组合”具体,但后者需要根据实际规则来写。如果规则是“密码至少8位,包含字母和数字”,报错就应该直接说明这个规则,而不是笼统地说“密码强度不足”。
避免使用“非法字符”“无效输入”这类带有指责意味的表述。“无效”描述的是状态,但用户不知道怎样变成有效。更好的表述是“只能使用字母、数字和下划线”,直接告诉用户允许的字符集。
对于必填项为空的情况,“此项必填”或“请填写此项”都比“不能为空”更友好。“不能为空”是系统视角的表述,“请填写此项”是用户视角的指令。两者传达的信息相同,但语气不同。
检查与验收
完成表单报错功能后,需要检查以下几个方面:用 Tab 键遍历整个表单,确认每个输入框的报错都能被读屏软件读出;切换不同屏幕宽度,确认报错文本不遮挡其他字段;模拟网络中断,确认提交按钮能恢复可用并显示错误提示;输入合法内容后,确认报错文本会立即消失。
还需要检查一种情况:用户提交后,页面刷新或跳转再返回,之前填写的表单数据是否保留。如果数据丢失,用户需要重新填写所有字段,这是比报错本身更严重的体验问题。浏览器刷新后表单数据是否保留取决于页面是否使用了浏览器的表单恢复机制,或者前端是否将数据暂存在 sessionStorage 中。如果项目没有特殊要求,至少应保证报错后页面不刷新,让用户在原页面直接修改。
评论
登录后可发表评论。