标签必须且只能出现一次,用于标识页面唯一、独立、与主题直接相关的主要内容区域;它不可嵌套于、等分区元素内,否则会导致屏幕阅读器跳转失效、无障碍检测报错及SEO降权。

一个页面只能有一个 ,且它必须包裹「当前页面唯一、不可复用的核心内容」——不是视觉上居中那块,也不是最重要的那块,而是去掉导航、页眉、页脚、侧边栏后剩下的那部分。
为什么多个 会出问题
屏幕阅读器(如 NVDA、VoiceOver)把 当作“跳转到主要内容”的唯一快捷键入口。出现两个以上,工具会忽略全部或随机选一个,用户直接卡在导航里出不来。Lighthouse 和 axe 等无障碍检测工具会报 duplicate-main 错误,但浏览器 DevTools 不会警告,容易被忽视。
- SPA(React/Vue)项目里,常见错误是每个路由组件都写一个
,实际应只由最外层 Layout 或 App 组件包裹一次 - 服务端渲染(SSR)时若模板拼接出多个
,SEO 会降权——搜索引擎认为语义混乱,降低主内容可信度 - 即使加了
aria-hidden="true"也无效,规范不承认这种“隐藏绕过”
能不能嵌套在 或 里
不能。HTML5 规范明确定义: 区别不在样式或布局,而在机器可读的语义权重。浏览器和辅助技术不解析 class 或 id 名称, 最容易被忽略的一点:判断某块内容该不该放进 不能是 、、、 的后代元素。哪怕视觉上它“看起来在页脚上方”,结构上也必须平级于它们,且都在 直接子节点位置。
—— 屏幕阅读器可能完全跳过该
+ role="region" + aria-labelledby 替代,而不是硬塞
和 是原生语义标签,触发明确的 DOM 角色(role="main"),无需额外 ARIA 补充。
内容会被搜索引擎赋予更高相关性权重,尤其在标题、段落、列表等配合使用时main 的读屏软件能一键跳转;role="main" 才等效,且易遗漏
本身已含语义,不需要重复写 class="main-content" 或维护 CSS 命名一致性,别看它在页面上占多大位置,而要问——“如果我把这块复制粘贴到另一个网站,它还能独立成立吗?” 如果答案是否定的(比如带面包屑、带全局搜索框、带底部版权行),那就得切掉再放。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











