语义标签通过清晰的层级和边界定义提供动态扩展能力,而非自身具备扩展性;section需配标题且嵌套层级递进,article须自包含并全局唯一,main不可嵌套,aside须关联主内容。

语义标签本身不提供“扩展能力”,但能让你在不破坏结构的前提下,安全、可预测地插入新内容。 真正的灵活性来自语义层级的清晰划分和边界定义,而不是靠标签堆砌或 class 乱配。
为什么比更适合动态追加内容当你用 document.createElement('section') 插入新模块时,浏览器和辅助技术能立刻识别它是一个逻辑分块;而 div 即使加了 class="section",对屏幕阅读器、索引脚本、打印样式表来说,它仍是“无意义容器”——你得额外写 role="region"、aria-labelledby 才勉强模拟,且极易漏掉。
- 必须包含
<h2></h2>–<h6></h6> 才算有效:没标题的 section 在 Chrome DevTools 的 Accessibility 面板里直接消失,MutationObserver 也抓不到它的语义边界
- 嵌套时标题层级要递进:外层
<h2>安装指南</h2>,内层 section 就该用 <h3>Windows 步骤</h3>,不能全用 h2
- 避免用
section 包导航栏或页脚:这些区域已有 nav、footer,硬套反而让结构树混乱
如何让支持独立加载与缓存
article 天然适合被 RSS 解析器、PWA 缓存策略或服务端组件化方案识别为“可独立单元”。但前提是它真能独立存在——否则缓存后打开只剩半句话。
- 每个
article 必须自带完整上下文:至少含 <header></header>(含 <h1></h1> 或 <h2></h2>)、<time datetime></time>、作者信息(可用 <address></address>)
- 别把“相关推荐”列表整个包进一个
article:这违反自包含原则;应该用 main 包列表,每项用单独 article
- 服务端渲染时,确保
article 的 id 全局唯一:否则客户端 JS 拼接锚点或滚动定位会冲突
动态插入时,main 和 aside 的边界怎么守得住
main 只能出现一次,且不能嵌套在 header、nav、footer 内——这是硬性规则。动态插入内容若越界,会导致无障碍树断裂、SEO 权重错配。
- 插入前先检查父级:
if (target.closest('main, article')) { /* 安全 */ },否则拒绝插入或自动提升到 body 下
-
aside 必须与最近的 article 或 body 相关:比如评论区旁的“作者简介”,不能用来放全局广告横幅
- 用
IntersectionObserver 监听 section 时,记得过滤掉 aside 和 nav 区域:它们通常不参与主内容滚动索引
最容易被忽略的是:语义标签不是“开关”,而是“契约”。你写了 section,就得给它配标题;用了 article,就得让它能单独发到 Twitter 上不丢信息。动态扩展的前提,是静态结构已经诚实——否则加再多 JS 逻辑,也只是在补漏洞。
当你用 document.createElement('section') 插入新模块时,浏览器和辅助技术能立刻识别它是一个逻辑分块;而 div 即使加了 class="section",对屏幕阅读器、索引脚本、打印样式表来说,它仍是“无意义容器”——你得额外写 role="region"、aria-labelledby 才勉强模拟,且极易漏掉。
- 必须包含
<h2></h2>–<h6></h6>才算有效:没标题的section在 Chrome DevTools 的 Accessibility 面板里直接消失,MutationObserver也抓不到它的语义边界 - 嵌套时标题层级要递进:外层
<h2>安装指南</h2>,内层section就该用<h3>Windows 步骤</h3>,不能全用h2 - 避免用
section包导航栏或页脚:这些区域已有nav、footer,硬套反而让结构树混乱
如何让支持独立加载与缓存
article 天然适合被 RSS 解析器、PWA 缓存策略或服务端组件化方案识别为“可独立单元”。但前提是它真能独立存在——否则缓存后打开只剩半句话。
- 每个
article必须自带完整上下文:至少含<header></header>(含<h1></h1>或<h2></h2>)、<time datetime></time>、作者信息(可用<address></address>) - 别把“相关推荐”列表整个包进一个
article:这违反自包含原则;应该用main包列表,每项用单独article - 服务端渲染时,确保
article的id全局唯一:否则客户端 JS 拼接锚点或滚动定位会冲突
动态插入时,main 和 aside 的边界怎么守得住
main 只能出现一次,且不能嵌套在 header、nav、footer 内——这是硬性规则。动态插入内容若越界,会导致无障碍树断裂、SEO 权重错配。
- 插入前先检查父级:
if (target.closest('main, article')) { /* 安全 */ },否则拒绝插入或自动提升到body下 -
aside必须与最近的article或body相关:比如评论区旁的“作者简介”,不能用来放全局广告横幅 - 用
IntersectionObserver监听section时,记得过滤掉aside和nav区域:它们通常不参与主内容滚动索引
最容易被忽略的是:语义标签不是“开关”,而是“契约”。你写了 section,就得给它配标题;用了 article,就得让它能单独发到 Twitter 上不丢信息。动态扩展的前提,是静态结构已经诚实——否则加再多 JS 逻辑,也只是在补漏洞。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











