为什么要在 HTML 元素上使用类或 ID?

Avatar of Chris Coyier
Chris Coyier

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

读者 Nicolas 写道

我经常看到对<body><html>元素的 ID 和类规范。 我很好奇为什么有人会这样做? 如果它对这两个元素都是唯一的,那么为什么不在 CSS 中指定 body 或 html 呢?

我相信 Nicolas 询问的是为什么你会这样做

<html class="happyNewYear">
.happyNewYear { background: url(/images/fireworks.jpg); }

当你也可以这样做的时候

html { background: url(/images/fireworks.jpg); }

…并跳过类名。毕竟,肯定只有一个<html>元素,对吧?

我理解 Nicolas 的观点。如果您查看源代码并单独查看页面,我可以看到<html>元素上的任何类或 ID 似乎都是多余的。事实上,这些顶级类非常有用。让我们回顾一下理论并查看一些实际示例。

多个页面,少量 CSS 文件

CSS 的理念是从标记中抽象出设计。网站上的 100 个页面都可能使用完全相同的 CSS 文件。这在很多方面都是高效的,其中之一是设计更改发生在一个地方,而不是一百个地方。顶级类可以用来识别当前正在查看的页面,从而将样式应用于其他页面可能不会获得的样式。

不同的页面,相同的 CSS 文件,不同的设计。并且由于这发生在尽可能高的级别元素上,您可以通过单个类 钩子 控制整个页面的设计。

WordPress

一个由 WordPress 提供支持的网站使用主题来显示页面。网站上的所有页面都是根据活动主题构建的。此主题中有一个名为 header.php 的文件,它输出所有页面的顶部,如文档类型、头部和打开的 body 和 html 标签。WordPress 有一个名为 body_class() 的函数,它输出大量特定于正在加载的页面类型的类。大多数主题都有一个这样的开头 body 标签

<body <?php body_class(); ?>>

在单个帖子页面上,输出可能如下所示

<body class="single single-post postid-8212 logged-in">

在主页上,输出可能如下所示

<body class="home blog">

现在,您可以使用许多钩子在 CSS 文件中根据页面类型以独特的方式设置样式。例如

.single h2 {
   font-size: 150%; /* Fonts bigger on single post pages */
}
.home aside {
   width: 100%;  /* Sidebar kicked to bottom of page on homepage */
}

我不完全确定为什么 WordPress 将其称为“body_class”,因为您可以(并且通常很有用)直接设置 HTML 元素的样式。仅供参考,您可以绝对将函数向上移动到 HTML 元素。

Modernizr

Modernizr 是一个 JavaScript 库,它也添加了顶级类。它在加载并运行时动态地将它们添加到 html 元素中。这些类象征着当前浏览器的功能。因此,虽然 WordPress 应用您可以用来使不同页面看起来不同的类,但 Modernizer 应用您可以用来使相同页面看起来不同的类,具体取决于浏览器功能。

这是 Modernizr 之后 html 元素可能的样子

<html class="js flexbox canvas canvastext no-webgl no-touch 
  geolocation postmessage websqldatabase no-indexeddb
  hashchange history draganddrop websockets rgba hsla 
  multiplebgs backgroundsize borderimage borderradius 
  boxshadow textshadow opacity cssanimations csscolumns 
  cssgradients cssreflections csstransforms no-csstransforms3d 
  csstransitions fontface video audio localstorage sessionstorage 
  webworkers applicationcache svg inlinesvg smil svgclippaths">

因此,现在您可能拥有根据功能以不同方式设置样式的 CSS

section {
  background: url(boring-fallback.jpg);
}
.multiplebgs section {
  background:
    url(logo.png) top left no-repeat,
    url(texture.jpg),
    url(top-edge.png) top left repeat-y;
}

其他任何东西?

我有一篇较旧的文章,其中 涵盖了相同的理念 以及使用此理念进行当前导航突出显示的经典技巧。查看它以获取其他一些提示。

如果您有一些其他使用顶级类的用例,请分享。