Default styles for h1 elements are changing.

h1 元素的默认样式正在改变

阅读时间 4 分钟

浏览器开始逐步更改嵌套 section 标题的默认 UA 样式。开发者应检查其网站是否依赖于特定情况下的 UA 样式,以避免意外结果和 Lighthouse 检查失败。在本博文中,我们将探讨即将发生的变化,如何识别您的页面是否存在此问题,以及一些关于符合规范和结构更良好的网站的提示。

变化内容

HTML 规范曾定义了一个大纲算法,该算法根据 <h1> 元素嵌套在多少 section 元素(<section><aside><nav><article>)内部,来赋予其一个隐含的语义标题级别。

浏览器的渲染方式是,section > h1 的字体大小和外边距与 <h2> 相同。section > section > h1 将被渲染为 <h3>,以此类推。默认渲染在浏览器的 UA 样式中实现,但在 辅助功能树(屏幕阅读器使用的)中并未体现标题级别。网站开始使用 section 元素,但并未预料到大纲算法会产生自动的标题级别。

总的来说,这造成了关于开发者何时可以使用 <h1> 元素的困惑,工具对 HTML 的处理方式不同,并且大纲算法被认为存在问题。大纲算法已于 2022 年从 HTML 规范中移除,但 UA 样式表规则仍然存在。默认样式中的规则正是浏览器厂商现在开始移除的部分。

css
/* where x is :is(article, aside, nav, section) */
x h1 { margin-block: 0.83em; font-size: 1.50em; }
x x h1 { margin-block: 1.00em; font-size: 1.17em; }
x x x h1 { margin-block: 1.33em; font-size: 1.00em; }
x x x x h1 { margin-block: 1.67em; font-size: 0.83em; }
x x x x x h1 { margin-block: 2.33em; font-size: 0.67em; }

例如

html
<body>
  <h1>Level 1</h1>
  <section>
    <h1>Level 2</h1>
    <section>
      <h1>Level 3</h1>
      <section>
        <h1>Level 4</h1>
      </section>
    </section>
  </section>
</body>

旧 UA 样式下的效果如下

Level 2 through Level 4 are progressively smaller.

新 UA 样式将呈现此外观

Level 1 through Level 4 all have the same size.

上面 HTML 示例在您浏览器默认样式下的效果是这样的

预期和时间表

除了浏览器样式的变化,Lighthouse 等页面审计工具现在会标记未使用 font-size 定义的 <h1> 为不良实践。以下是您可以预期的情况概览:

  • <h1> 将不再根据其周围的 section 元素(如 <section><article><nav><aside>)来调整其样式。UA 样式表将对 <h1> 应用相同的样式,没有隐含的样式会降级 <h1> 以匹配 <h2><h3> 等。
  • 如果 <h1><section><article><nav><aside> 中使用且未指定字体大小,Lighthouse 将标记一个警告。您需要留意 Lighthouse 的弃用警告 H1UserAgentFontSizeInSection。下一节将介绍处理此问题的提示。

关于何时发生此变化,更改将在以下浏览器中按此时间表进行

Firefox

  • 自 2025 年 3 月 31 日起,Firefox 将在 50% 的 Beta 138 用户上推出更改,以移除桌面版 articleasidenavsectionh1 的 UA 样式,然后在 4 月 14 日开始对所有 Beta 138 用户生效。计划在 Firefox 138 稳定版中对 5% 的用户推出,然后逐渐增加到 10% 的用户,最后在 Firefox 140 中在所有平台上发布。 (bug 1885509)。
  • 自 Firefox 136 起,开发者将在控制台中收到有关在 article/aside/nav/section 中未定义作者字体大小或外边距的 h1 的警告:(bug 1937568)。
  • 要在 Firefox 中测试新行为,请在 about:config 中将 layout.css.h1-in-section-ua-styles.enabled 设置为 false。

Chrome

  • 自 136 版本以来,Chrome 会对在 4 个元素(articleasidenavsection)中使用的 <h1> 元素(当 <h1> 使用默认的较小字体大小时)显示弃用警告。在 Chromium 中标记为弃用将降低 Lighthouse 得分,显示在“最佳实践”类别中:(issue 394111284)。

Safari

修复 Lighthouse 警告

Lighthouse 最近 继承了一项检查,该检查基于 Chromium 的 DevTools 警告,用于标记在 <section><article><nav><aside> 中未为 <h1> 元素指定 font-size 的网站。新规则称为 H1UserAgentFontSizeInSection,自 3 月份添加弃用警告以来开始出现。如果您看到 <h1> 警告,请确保您应用了明确的 <h1> 字体大小和外边距。以下是一些推荐的样式:

css
h1 {
  margin-block: 0.67em;
  font-size: 2em;
}

为了避免覆盖其他针对 <h1> 的样式规则,您可以使用 :where(),它具有零 特异性

css
:where(h1) {
  margin-block: 0.67em;
  font-size: 2em;
}

MDN 的标题元素页面现在包含 上面列出的使用说明,因此开发者有一个可见的地方可以查看此信息。

总结

以下是一些需要牢记的事项

  • 不要依赖默认浏览器样式来传达标题层次结构。请使用 <h2> 定义二级标题,<h3> 定义三级标题,依此类推,明确定义您的文档层次结构。
  • 始终为 <h1> 元素定义您自己的 font-sizemargin
  • 考虑更新您的 CSS 重置以适应此更改。
  • 使用 Lighthouse 和浏览器 DevTools 审计您的网站,以检查弃用用法。
  • 查阅 MDN 文档中关于 HTML Section 标题的 使用说明

另见