模拟的控件,我们需要投入更多精力。这些通常需要大量的ARIA(Accessible Rich Internet Applications)属性来模拟原生元素的行为和状态。比如,一个自定义的下拉菜单可能需要
role="combobox"
、
aria-haspopup="listbox"
、
aria-expanded
等,以及对选项的
role="option"
。这部分工作量不小,但却是确保可访问性的关键。
再来就是提示信息和帮助文本。有时候,一个输入框需要一些额外的说明,比如密码强度要求、输入格式等。这时,我们可以使用
aria-describedby
将这些说明与输入框关联起来。这样,当屏幕阅读器聚焦到输入框时,它会先读出标签,然后读出描述信息。
密码必须包含至少8个字符,包含大小写字母和数字。
最后,也是最重要的一点,是实际测试。光靠我们自己“觉得”可访问是不够的。我建议用VoiceOver(macOS/iOS)、NVDA(Windows)或JAWS(Windows)等主流屏幕阅读器,亲自走一遍你的表单。你会发现很多你意想不到的问题。
键盘导航与焦点管理在表单可访问性中扮演什么角色?
键盘导航和焦点管理,在我看来,是表单可访问性的“骨架”。如果用户不能通过键盘顺利地在表单中移动、输入和提交,那么这个表单基本上是不可用的。
核心在于
tabindex
属性和
浏览器的默认行为。所有可交互元素(链接、按钮、表单控件)默认都有一个
tabindex
值,可以被Tab键访问。我们应该尽量依赖这种默认的、逻辑的Tab键顺序,因为它通常与视觉顺序一致。
避免使用
tabindex="0"
以外的正整数值。当你设置
tabindex="1"
、
tabindex="2"
时,你实际上是在强行覆盖浏览器默认的Tab键顺序,这很容易出错,并且难以维护。我见过很多项目,为了实现某个特定的焦点顺序,滥用
tabindex
,结果导致键盘用户操作混乱。如果非要调整顺序,通常是调整HTML元素的DOM结构,而不是强行用
tabindex
。
视觉焦点指示器是另一个关键点。当用户使用Tab键在表单中移动时,必须有一个清晰的视觉提示来告诉他们当前焦点在哪里。浏览器默认的
outline
样式通常足够,但很多开发者为了“美观”会把它移除,却没有提供替代方案。这简直是自毁长城。一个好的焦点样式可以是这样的:
:focus {
outline: 2px solid blue; /* 或者其他醒目的颜色 */
box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.3);
}
/* 避免直接移除outline */
/* input:focus { outline: none; } 这种做法很危险 */焦点管理还涉及到动态内容。比如,当表单提交后出现错误信息,或者打开一个模态框时,焦点应该被合理地移动到新的、重要的内容上。如果错误信息在页面顶部,用户提交后焦点还在表单底部,屏幕阅读器用户可能根本不知道有错误发生。在这种情况下,将焦点程序化地移到第一个错误提示或者错误字段上,能大大提升用户体验。
表单错误提示如何设计才能对所有用户都友好?
一个友好的错误提示,远不止是把文字变红那么简单。它需要做到三点:清晰、具体、可访问。
首先,错误信息必须清晰且具体。不要只说“输入有误”,而是要说“用户名不能为空”或“密码长度至少为8个字符”。越具体,用户越容易理解并改正。我个人觉得,那种“请检查您的输入”的通用提示,基本等于没说。
其次,错误信息要及时且可见。当用户离开一个字段(
blur
事件)或者尝试提交表单时,就应该显示错误。而且,错误信息应该靠近它所关联的输入框,这样用户能快速定位。
最关键的是,错误信息必须可访问。这意味着它不仅要视觉可见,还要能被屏幕阅读器感知。我们可以通过以下方式实现:
aria-invalid="true"
: 当输入框内容无效时,给对应的
元素添加aria-invalid="true"
属性。屏幕阅读器会读出这个状态。
-
aria-describedby
: 将错误信息的
id
与输入框的aria-describedby
关联起来。这样,当屏幕阅读器聚焦到输入框时,会读出标签和错误信息。
请输入有效的邮箱地址。
注意这里的
role="alert"
,它会让屏幕阅读器立即播报这个错误信息,而无需用户手动聚焦。
-
错误汇总区域: 对于包含多个字段的复杂表单,我建议在表单顶部或提交按钮附近设置一个错误汇总区域。当表单提交失败时,这里列出所有错误,并提供指向对应字段的链接。这能让用户快速了解所有问题,并跳转到需要修改的地方。
aria-live="assertive"
确保屏幕阅读器会优先播报这个区域的内容。
焦点管理: 当表单提交失败且有错误时,将焦点程序化地移到第一个出错的字段,或者移到错误汇总区域。这能帮助键盘和屏幕阅读器用户快速开始修正问题。
这些措施结合起来,才能真正让表单的错误提示对所有用户都友好,避免他们陷入反复尝试和挫败的困境。毕竟,表单的设计目的就是为了收集信息,而不是成为一道道障碍。