语义化标签如header、nav、main等默认并无margin,所谓“空隙”实为figcaption、标题、段落等子元素或父容器的样式及外边距合并所致。

浏览器给 header、nav、main、aside、footer 等语义化标签加默认 margin,根本原因不是“为了语义”,而是历史兼容和 UA stylesheet 的遗留行为——但实际情况是:它们绝大多数根本没有默认 margin。
为什么你看到“有 margin”?其实是其他元素在捣鬼
现代浏览器(Chrome、Firefox、Safari、Edge)对 header、nav、main 等标签的 UA stylesheet 中,默认只设了极小或为 0 的 margin 和 padding。你感知到的“空隙”,往往来自:
-
figure内部的figcaption带margin-top: 1em(不是figure自己) - 父容器(比如
body或某个div)本身有margin或padding - 嵌套在其中的标题(
h1–h6)、段落(p)、列表(ul)等自带 margin,而你没重置 - 用了 Normalize.css 或某些 UI 框架(如 Bulma),它们主动给语义标签加了 margin
figure 是个典型例外:它常被误认为“有默认 margin”
figure 标签本身在所有主流浏览器中 默认 margin 确实是 0,但它的常见使用场景(包裹 img + figcaption)会触发两个干扰源:
-
figcaption在多数 UA stylesheet 中有margin-top: 1em,造成“上空隙”错觉 - 如果
figure是 flex 容器的子项,而你又没设align-items: flex-start,figcaption的基线对齐可能拉高整个figure的视觉位置 - 部分旧版 reset.css(如早期 HTML5 Boilerplate)曾错误地给
figure加了margin: 1em 40px,这个习惯被沿用至今
别信“语义化就该有间距”的说法
HTML5 语义化标签的设计原则是不带视觉假设。W3C 明确说明:section、article、aside 等标签默认 display 为 block,但其余样式(包括 margin/padding)由 UA stylesheet 决定,且现代实现已趋于归零。
立即学习“前端免费学习笔记(深入)”;
- 真正带稳定默认 margin 的,只有老派内容型标签:
h1–h6、p、blockquote、pre、ul/ol - 用
* { margin: 0; padding: 0; }清全局,再单独给p设margin-bottom: 1rem,比依赖语义标签“自带间距”更可控 - 如果你在调试时发现
nav下方有空隙,先检查它里面的ul是否有margin-bottom,而不是怀疑nav本身
最易被忽略的一点:外边距合并(margin collapse)会让多个语义标签之间的“空隙”看起来忽大忽小——比如 header + main + footer 连续排列时,实际间距取决于它们内部第一个/最后一个块级子元素的 margin,而非标签自身。这点在响应式断点切换时尤其容易翻车。



















