<main>标签是页面唯一主要内容入口,每页仅能有一个且不可嵌套于其他分区元素内,用于保障可访问性与SEO;其内容须为当前视图独有、不可复用,禁止包含全局导航、页脚等复用组件。
main 标签不是“可有可无的语义装饰”,它是浏览器和读屏软件(如 NVDA、VoiceOver)识别页面“唯一主要内容入口”的关键信号。用错或不用,直接影响可访问性与 SEO。
<main>
规范强制要求每页最多出现一次 <main>,且不得嵌套在 <article>、<aside>、<footer>、<header>、<nav> 等分区元素内。原因很实际:
<main> 会让屏幕阅读器困惑“到底哪块才是主舞台”<main> 区域的权重,甚至忽略其中内容<main> 位置,旧内容可能残留,新内容被跳过<main> 里能放什么、不能放什么它只该包裹“当前视图下独一无二、不可复用”的内容。判断标准很简单:如果这块内容复制粘贴到另一个页面还能原样用,那它就不该进 <main>。
<article>(博客正文)、<ol>(商品列表)、<form>(独立提交表单)、纯文本段落<nav>(全局导航)、<footer>(页脚版权)、<aside>(侧边推荐)、<header>(网站 Logo + 主导航)<header> 作为 <main> 的子元素是允许的——但仅限“本篇文章的标题与元信息”,不是整个网站头部IE 完全不支持 <main>,但现代项目基本已无须考虑;真正容易出问题的是动态渲染场景:
立即学习“前端免费学习笔记(深入)”;
v-if 或条件渲染切换 <main> 内容时,若没确保每次只存在一个有效实例,可能 DOM 中残留多个 <main>
<main> 若被包裹在 <div id="app"> 外层,而框架挂载点又在内部,会导致结构断裂document.querySelectorAll('main').length 快速验证是否超标最常被忽略的一点:它不是视觉容器,不带默认样式。很多人加了 <main> 却没配 CSS,结果发现布局没变化——这恰恰说明它干的是语义活,不是排版活。