必须是的直接子元素,因为屏幕阅读器只认为页面主体内容的唯一可信锚点,且硬性要求其为的直接子元素;一旦被其他元素包裹,辅助技术就完全忽略它。

为什么必须是的直接子元素
因为屏幕阅读器(如 NVDA、VoiceOver)只认 <main></main> 作为页面主体内容的唯一可信锚点,且硬性要求它必须是 的直接子元素。一旦被 <div class="wrapper"> 或 <code><section></section> 包裹,辅助技术就完全忽略它。
常见错误:<div id="app"><main>...</main></div>;正确写法只能是:<header></header><main></main><footer></footer>,三者并列于 下。
- 验证方式:在控制台执行
document.querySelector('main').parentElement === document.body,返回true才算合格 - 缺失
<main></main>时,屏幕阅读器退而求其次找role="main",再找不到就从第一个<h1></h1>开始算正文——但页眉里常有<h1></h1>,结果用户平均要按 7–12 次“下一项”才能触达真正正文 -
<main></main>内容必须是对用户有独立价值的核心信息,不能只放广告位或空占位符
多个
<nav></nav> 自带 role="navigation",但屏幕阅读器不识别 class 名或位置,只依赖语义角色和显式名称。多个 <nav></nav> 标签若没标注,NVDA/VoiceOver 全部朗读为“导航”,用户无法区分主导航、页脚导航或面包屑。
- 正确写法:
<nav aria-label="主导航">...</nav>、<nav aria-label="页脚导航">...</nav> - 避免用
<div role="navigation"> 替代 <code><nav></nav>:前者需手动加tabindex="0"才能聚焦,漏了键盘用户根本进不去 -
<nav></nav>内部至少得有一个可聚焦元素(如<a></a>、<button></button>),纯文本链接(如首页 | 关于)会被当普通段落处理,D 键跳转失效











