普通标签原生具备无障碍支持,但滥用href="#"、用模拟链接、空href等会破坏其语义;修复应优先保留原生,必要时用aria-label补充图标或模糊文案链接,禁用状态需同步aria-disabled="true"与tabindex="-1"。

普通 <a></a> 标签本身就有无障碍基础,但只要加了 JavaScript、改了默认行为、或用了非标准结构,就极容易让屏幕阅读器“读不出目标”“跳不过去”“点不了也聚焦不了”。关键不在加多少 ARIA,而在别破坏原生语义。
为什么有些链接在 NVDA 或 VoiceOver 里完全不被识别
常见原因不是没写 aria-label,而是直接破坏了 <a></a> 的本质:
<a href="#" onclick="goToPage()>首页</a>:href 值为#且没配role=" link>,会被读成“未命名链接”或直接跳过</a><div onclick="location.href='...'>首页</div>:彻底抛弃<a>,即使加role=" link>,也无法通过 Tab 键进入,键盘用户根本碰不到 <li> <code><a href="">首页</a>:空href在部分浏览器中会触发页面顶部跳转,且被读作“当前页面”,语义全失- 图标链接无文字:
<a href="/cart" aria-label="购物车"><svg>...</svg></a>(不能只靠alt或 title) - 链接文本模糊:“点击这里”“详情”“更多”——必须用
aria-label补充明确目标,例如aria-label="查看《HTML无障碍实践》全文" - 复用相同文案但指向不同资源:比如多个“下载”按钮,需用
aria-labelledby="download-btn-1-title download-btn-1-desc"组合出唯一上下文 - 禁用状态链接:
<a href="/report" aria-disabled="true" tabindex="-1">生成报告</a>(注意:不能只靠 CSS 灰掉,必须加aria-disabled和tabindex="-1") - 插入后立即调用
element.setAttribute('tabindex', '0')(仅当它本不该在自然 Tab 顺序中时) - 如果该链接是操作结果(如“发送成功 → 查看消息”),建议用
aria-live="polite"包裹区域,让读屏器主动播报新增链接 - 避免用
innerHTML注入含链接的 HTML 片段——可能丢失事件绑定或aria-属性;改用document.createElement('a')显式设置所有属性 - 动态加载的分页链接(如“下一页”),要确保每次更新后
aria-current="page"准确落在当前项上,并移除旧项的该属性
修复原则:能用原生 <a href="xxx"></a> 就绝不用 div + JS 模拟;必须拦截默认行为时,保留有效 href(如 href="/page")再 event.preventDefault()。
什么时候必须加 aria-label 或 aria-labelledby
原生链接文本本身可读性差时才需要补充,不是“为了加而加”:
立即学习“前端免费学习笔记(深入)”;
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
⚠️ 别混用 aria-label 和 <label></label>:后者只适用于表单控件;<a></a> 只认 aria-label / aria-labelledby / 自身文本三者之一,优先级固定,混用反而导致某些读屏器重复播报或跳过。
JavaScript 动态插入的链接怎么保证可访问
DOM 插入后若不手动管理焦点和语义,新链接对键盘和读屏器就是“不可见”的:
Chrome DevTools 的 Accessibility Inspector 能立刻验证:右键链接 → “Inspect Accessibility Properties”,重点看 Role 是否为 link、Name 是否是你期望的文本、States 中 disabled 或 hidden 是否准确同步。
最常被忽略的一点:链接的视觉焦点样式必须可见且符合 WCAG 对比度要求。哪怕语义全对,一旦 :focus 被 CSS 重置为 outline: none 又没提供替代样式,键盘用户就彻底迷失——这不是 ARIA 能补救的。


















