E2.03.3programmatic label association设计研究

标签与输入框的关联必须在语义上建立

别名: label for · accessible name · aria-labelledby · 字段无障碍名称

概念解释

看见标签在槽的旁边,并不等于辅助技术知道它们是一对。程序化标签关联(programmatic label association)要求在无障碍树里把名称绑到控件上:用 labelfor 指向控件 id,或用 aria-labelledby 指向名称节点。读屏器、语音控制和自动填充都读这棵树,不读你的排版。它解决的是「名称是否属于这个槽」,不是标签该顶置还是左置。

机制

视觉关联靠邻近和对齐,程序关联靠显式引用。缺了引用,读屏器进入槽时只能报「编辑框」,用户不知道要填什么,只能前后摸索。点标签本应把焦点移进槽——这是 label 元素的默认行为,也扩大了命中区;用普通 div 做的「看起来像标签」的字没有这层行为,视力完好的人点名称也会落空。占位符、图标、表头单元格都不是可靠的可访问名称来源。多个槽共用一段可见文字(「姓名」下面两个框)时,若只把文字绑到其中一个,另一个在树里就是匿名的。关联错位——for 指到了隔壁字段——比没有关联更危险,因为播报是错的,用户会按错误名称填。

怎么研究

用无障碍树检查器和读屏器走查:每个输入是否有可访问名称、名称是否与可见标签一致、点可见标签是否聚焦对应槽。自变量:关联方式(for / 包裹 / aria-labelledby / 只有占位符)、可见标签是否被 display:none 或切到屏外。因变量:名称暴露率、点标签命中率、读屏器用户完成表单的时间与错误。自动化规则能抓到「无名称」,抓不到「名称指错对象」;后者要用读屏器对照可见文字。实验室里视力完好的被试完全感觉不到这种失败。

边界

画布、自定义下拉、内容可编辑区域往往不在原生 label 模型里,必须另建可访问名称,不能假设「旁边有字」就够。隐藏可见标签、只留占位符的做法在树里也许能塞进名称,但名称会在输入后从视觉上消失,和程序关联不是同一件事。自动翻译若只改可见节点、不改 aria-label,会出现中英两套名称。验证码、文件选择等浏览器控件的可访问名称有时由用户代理合成,作者侧的关联会被覆盖或并置,需要在目标浏览器里实听。

怎么落地

  • 每个输入都用 label for 或等价的 aria-labelledby 绑到可见名称,不要用无引用的 div 冒充标签。
  • 保证点击可见名称会聚焦对应槽;点了没反应就说明关联没建成。
  • 检查无障碍树:名称字符串必须与可见文字一致,且不能串到隔壁字段。
  • 验证:关掉屏幕,只用读屏器填完整张表。每进入一格,播报的名称必须能让人决定填什么;再睁眼点每个标签,焦点必须落到它说明的那个槽。

延伸

  • 同组E2.03.1 顶置标签垂直占用大但扫描最快 · E2.03.2 左置标签节省高度但增加视线跳转
  • 相邻E2.04 占位符 · E2.21 只读、禁用与不可编辑的区分
  • 站内检索programmatic label association · accessible name · label for

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E2.03.3