标签必须且只能出现一次,用于包裹当前页面唯一、不可跨页复用的核心内容,不得嵌套于等语义元素内,须与它们同级并列于下,并通过开发者工具搜索验证唯一性。

一个 HTML 页面中,<main></main> 标签必须且只能出现一次,且它包裹的内容必须是当前 URL 对应的、不可跨页复用的核心内容——不是视觉上最显眼的区域,也不是最重要的模块,而是去掉页眉、页脚、导航、侧栏后“剩下的那部分”。
怎么确认页面只有一个 <main></main>
浏览器不报错,但 Lighthouse 会明确提示 Document has more than one main landmark,屏幕阅读器(如 NVDA、VoiceOver)可能跳过、随机选取或反复播报“主内容开始”。排查必须手动:
- 打开开发者工具(F12),在 Elements 面板按
Ctrl+F(Windows)或Cmd+F(macOS),搜索<main></main> - 检查匹配结果是否仅有一对
<main></main>和;特别注意 SPA 场景:React/Vue 组件里各自渲染<main></main>是常见错误 - 服务端模板(如 EJS、Twig)中,列表页和详情页共用同一套
<main></main>包裹逻辑,容易生成嵌套或并列的多个<main></main>
<main></main> 能不能嵌套在 <header></header> 或 <footer></footer> 里
不能。HTML5 规范明令禁止 <main></main> 作为 <header></header>、<footer></footer>、<nav></nav>、<aside></aside> 或 <article></article> 的后代元素。语义冲突会导致辅助技术失效,Lighthouse 直接报错 The element main must not appear as a descendant of the header element。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 正确结构必须是
<header></header>、<main></main>、<footer></footer>并列,同为的直接子元素 - 若发现
<header><main>...</main></header>这类写法,需整体剪切<main></main>并粘贴到层级,与<header></header>同级 -
<main></main>内部可以包含<header></header>,但仅限本页专属标题(如文章<h1></h1>和发布时间),不能是全站 Logo + 导航
<main></main> 里能放什么、不能放什么
<main></main> 的职责不是“看起来像主体”,而是“逻辑上不可复用”。判断标准非常实在:如果这块内容复制粘贴到另一个页面还能原样用,那它就不该进 <main></main>。
立即学习“前端免费学习笔记(深入)”;
- 允许:文章正文、产品详情、表单主体、本页专属评论区、动态路由加载的唯一内容块
- 禁止:
<nav></nav>、<footer></footer>、面包屑、版权信息、固定侧栏、登录入口、全局搜索框、含role="navigation"的容器 - SPA 中常见误用:把整个
<div id="app"> 标为 <code><main></main>;正确做法是只包裹路由切换后真正变化的那块内容(如<article></article>或<section></section>)最容易被忽略的点是:即使加了
aria-hidden="true",也不能绕过<main></main>的唯一性与嵌套限制——规范不认这种“隐藏绕过”,辅助技术照样失效。


















