警告框必须设 role="alert" 和 aria-live="assertive",确保屏幕阅读器即时播报;关闭按钮须为语义化 button 并管理焦点;颜色对比度需达 4.5:1,错误信息须文字明确表达;aria-live 区域须预定义且更新时清空重写。

警告框必须有明确的 role="alert" 和实时可感知的语义
没有 role="alert" 的 div 不会被屏幕阅读器识别为警告,用户可能完全错过关键提示。仅靠颜色(如红色边框)或图标(❗)无法满足 WCAG 2.1 的 1.4.1(使用颜色)和 4.1.3(状态消息)要求。
- 必须添加
role="alert",且该元素不能是display: none或visibility: hidden—— 否则 ARIA 属性失效 - 推荐用
aria-live="assertive"配合role="alert",确保内容变化时立即中断当前朗读并播报 - 避免把
role="alert"放在动态插入的容器内部(比如嵌套在div class="modal-body"里),应直接作用于最外层警告内容容器 - 不要用
aria-hidden="true"包裹警告文本,哪怕它只是临时显示 —— 这会直接屏蔽语音输出
关闭按钮需满足键盘可操作 + 焦点管理 + 语义化
WCAG 2.1 要求所有功能组件必须支持键盘操作(2.1.1),且交互后焦点不能丢失(2.4.3)。单纯用 × 文本或 SVG 图标而不提供可聚焦、可朗读的按钮,会导致键盘用户无法关闭,屏幕阅读器用户不知其用途。
- 关闭按钮必须是
<button type="button"></button>,不能是<span></span>或<a href="#"></a> - 添加
aria-label="关闭此警告"(不可省略为aria-label="关闭",缺乏上下文) - 点击/回车/空格触发关闭后,焦点应回到触发警告的操作源(如提交按钮),或至少移到警告框前一个可聚焦元素 —— 不能留在已移除的 DOM 上
- 若警告框通过 CSS 动画淡出,需在
transitionend后再从 DOM 移除,否则屏幕阅读器可能来不及播报“已关闭”
颜色对比度与非色彩依赖的信息传达
仅靠红色背景 + 白色文字不等于合规。WCAG 1.4.3 要求普通文本最小对比度 4.5:1;同时,错误类型必须通过文字(如“错误:”)、图标(带 aria-hidden="true")或位置(如紧邻表单控件上方)明确表达,不能只靠颜色区分。
- 检查
background-color与color的实际对比度(可用浏览器插件 axe 或 WAVE),深红 #d32f2f 在白底上对比度约 3.8:1,不达标;建议改用 #c62828 或搭配深灰文字 - 在警告文本开头加前缀,例如
<span>警告:您的密码强度不足</span>,而非仅靠样式暗示严重性 - 如果用了感叹号图标,必须设
aria-hidden="true",并确保替代文本已由正文承载,否则屏幕阅读器会重复朗读“感叹号 警告:……” - 禁用纯 CSS 的
::before { content: "⚠️" }生成图标 —— 多数屏幕阅读器不读取伪元素内容
动态插入警告时需主动触发 aria-live 区域更新
很多前端框架(React/Vue)默认把新警告渲染进已有容器,但若该容器未预先声明 aria-live,或更新时未触发 DOM 变化(如仅修改 innerText),屏幕阅读器将静默忽略。
-
aria-live容器必须在页面加载时就存在,不能 JS 创建后才挂载属性 - 推荐结构:
<div aria-live="assertive" aria-atomic="true" class="sr-only"></div>,配合 CSS.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } - 插入新警告文本时,先清空再写入(
el.textContent = msg),而非追加(el.append(...)),否则aria-atomic="true"无法保证整段重读 - 避免在
aria-live区域内放链接、按钮等交互元素 ——assertive模式下焦点不会自动进入,反而造成键盘陷阱
真正难的不是写对那几行 ARIA 属性,而是确保每次状态变更都同步触达所有感官通道 —— 尤其当警告来自异步校验、网络错误或表单提交后重定向时,DOM 更新节奏和朗读时机稍有偏差,就会漏掉关键信息。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











