HTML 与 Body 在 CSS 中的差异

Avatar of Geoff Graham
Geoff Graham 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费信用额度!

<html><body> 之间的区别很容易被忽略。它似乎是那些被认为是琐碎的事情之一。不可否认,我有一个坏习惯,就是将所有全局样式应用到 <body>,并且当这种情况不足时,我会毫不犹豫地转向 <html>

但是,确实存在差异,无论我们是 CSS 资深人士还是新手,了解这些差异都是一个好主意。我们将在本文中讨论这些差异,并考虑一些将一个元素的样式优先于另一个元素的实用应用。

HTML 与 Body 之间的关联

考虑一下基本 HTML 文档的标准结构

<!DOCTYPE html>
<html lang="en">

  <head>
    <!-- Metadata and such -->
  </head>

  <body>
    <!-- Where the content begins -->
  <body>

</html>

规范定义 <html> 作为文档的根元素,我们可以在上面的示例中清楚地看到:<html> 元素是所有其他元素的最顶层。由于没有比该层更高级的层级可以继承样式,因此这里就结束了。

从那里开始,<head><body> 构成了直接位于 <html> 内部的两个元素。事实上,规范定义 <body> 直接与 <head> 相反,因为它们是唯一需要区分的两个元素。

因此,这里最重要的是,<html> 是文档的根元素,其中 <body> 是包含在其中的子元素。事实上,在 CSS 中有一个 :root 选择器。它们的目标是完全相同的

:root {

}
html {

}

除了 :root 具有更高的特异性:(0, 0, 1, 0)vs(0, 0, 0, 1)。

因此,我们应该始终将全局样式放在 <html> 上,对吗?

我们很容易认为,我们希望在整个文档中继承的所有样式都应该直接应用于 <html>,因为它是的文档的根元素。<html> 在层次结构中优先于 <body>,因此它必须包含所有全局样式。

但这并不完全是事实。事实上,以下内容的内联属性在 规范中最初分配给 <body>

  • background
  • bgcolor
  • marginbottom
  • marginleft
  • marginright
  • margintop
  • text

虽然这些属性现在被认为已过时,但建议使用 CSS 代替,并使用其对应的 CSS 属性

内联属性 CSS 属性
background background
bgcolor background
background-color
marginbottom margin-bottom
marginleft margin-left
marginright margin-right
margintop margin-top
text font

鉴于这些 CSS 属性源于为 <body> 编写的内联属性,因此似乎将它们直接应用于 CSS 中的 <body> 也是合适的,而不是将它们推送到 <html> 元素中。

因此,我们应该始终将全局样式放在 <body> 上,对吗?

嗯,也不完全是。在某些情况下,将样式应用于 <html> 更有意义。让我们考虑一下其中的几种情况。

使用 rem 单位

rem 单位相对于文档根目录。例如,当编写类似于以下内容时

.module {
  width: 40rem;
}

rem 单位相对于 <html> 元素的 font-size,即文档根目录。因此,无论在根级别设置什么作为用户默认值,.module 类都将以此为比例进行缩放。

Jonathan Snook 有一篇经典文章,很好地说明了如何将 <html> 上的 font-size 设置为百分比可以在使用 rem 单位时用作重置。

古怪的 background-color

在 CSS 中,有一个 奇怪的事情,即 <body> 上的 background-color 会溢出整个视窗,即使元素本身的度量标准没有覆盖整个区域。除非在 html 元素上设置 background-color,否则不会发生这种情况。

如果目标是溢出,那么从一开始就将其设置在 html 元素上会很明智。

总结

希望这能阐明在 CSS 中使用 <html><body> 之间的关键区别。在 JavaScript 中也存在差异。例如,您不需要查询这两个元素,html 是 document.rootElement,body 是 document.body

我们当然可以在这两者之间做出更多技术上的区分,但这里的重点是提升我们对它们的理解,以便在编写 CSS 时做出更好的决策。

您还有其他例子吗?在这些例子中,将一个元素的样式优先于另一个元素更有意义?或者您是否有不同的标准来判断何时设置哪个元素的样式?欢迎在评论区告诉我们!

更多资源