
HTML 原生不支持 readonly 属性用于 checkbox/radio,而 disabled 会移出焦点流并暗示“非相关”,本文提供符合 WCAG 与 ARIA 实践的可访问只读方案:优先使用 aria-disabled="true" 配合 JavaScript 阻断交互,并辅以语义化标签与状态描述,确保屏幕阅读器用户清晰理解“值存在、状态固定、不可更改”。
html 原生不支持 `readonly` 属性用于 checkbox/radio,而 `disabled` 会移出焦点流并暗示“非相关”,本文提供符合 wcag 与 aria 实践的可访问只读方案:优先使用 `aria-disabled="true"` 配合 javascript 阻断交互,并辅以语义化标签与状态描述,确保屏幕阅读器用户清晰理解“值存在、状态固定、不可更改”。
在构建可复用表单组件时,常需呈现“已提交但需回溯查看”的只读状态——例如用户提交订单后查看确认页,或审批流程中查看历史填写项。此时,文本输入框可用 readonly 安全实现,但复选框(<input type="checkbox">)和单选按钮(<input type="radio">)却面临标准缺失的困境:HTML 规范明确禁止 readonly 属性用于这两类控件;aria-readonly 虽在 ARIA 1.2 中被允许,但实际浏览器与屏幕阅读器支持极不一致(如 NVDA + Firefox 对 aria-readonly="true" 的 checkbox 几乎无响应),无法作为可靠方案。
✅ 推荐方案:aria-disabled="true" + 交互拦截 + 语义增强
这是当前最平衡可访问性、语义准确性与兼容性的实践方案:
<label class="readonly-checkbox"> <input type="checkbox" id="newsletter-optin" name="newsletter" value="true" checked aria-disabled="true" aria-label="Newsletter subscription: selected (read-only)"><span class="label-text">Subscribe to our newsletter</span> </label>
// 阻断所有修改行为(click, space, enter)
document.querySelectorAll('input[type="checkbox"][aria-disabled="true"], input[type="radio"][aria-disabled="true"]')
.forEach(el => {
el.addEventListener('click', e => e.preventDefault());
el.addEventListener('keydown', e => {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
}
});
});
关键设计要点:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- ✅ 保留焦点可达性:
aria-disabled="true"不影响tabindex,控件仍可被键盘聚焦,满足 WCAG 2.4.3(Focus Order); - ✅ 准确传达语义:
aria-disabled明确表示“当前禁用但逻辑上属于表单一部分”,比原生disabled更贴合“相关但不可编辑”的业务意图; - ✅ 强化屏幕阅读器感知:通过
aria-label或<label></label>包裹明确声明状态(如"selected (read-only)"),避免仅依赖视觉样式; - ✅ 覆盖全交互通道:同时拦截
click和键盘事件(空格/回车),防止辅助技术绕过点击限制。
⚠️ 注意事项与进阶优化
-
视觉样式必须同步
仅靠aria-disabled不会自动改变外观。务必通过 CSS 显式呈现只读态,例如:[aria-disabled="true"] { opacity: 0.7; cursor: not-allowed; } /* 确保 :checked 状态样式仍可见 */ [aria-disabled="true"]:checked::before { background-color: #0078d7; } -
多选组(Radio Group)需额外标注
对于单选组,建议在容器层添加说明性文本,辅助理解上下文: 服务端验证仍是底线
前端只读仅为体验层防护,恶意用户仍可篡改 DOM。所有只读字段的值必须在服务端进行二次校验,确保与原始提交数据一致。-
替代方案对比(不推荐但需知)
- ❌
disabled:移出 tab 顺序,屏幕阅读器常读作“unavailable”或跳过,违背“相关但不可改”意图; - ❌ 纯静态 HTML(如
<span>✓ Subscribe</span>):丧失表单语义,无法被form.elements访问,破坏数据一致性; - ❌
onclick="return false":无 ARIA 支持,屏幕阅读器无法感知禁用状态,违反 WCAG 4.1.2(Name, Role, Value)。
- ❌
综上,aria-disabled="true" 配合事件拦截与语义化标注,是当前 Web 可访问性实践中针对只读复选框/单选按钮最成熟、最合规的解决方案。它在标准缺失的现实约束下,最大程度兼顾了技术可行性、残障用户理解力与开发可维护性。










