为获得更强大的 CSS 控制和特异性,给 body 元素添加 ID

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适合您旅程各个阶段的云产品。 立即开始使用 $200 免费积分!

假设您想将联系页面上的链接颜色更改为红色。 在其他所有页面上,它们都是蓝色的,但出于某种原因,在您的联系页面上将它们改为红色是有意义的。 有几种方法可以实现这一点。

  • 您可以为您的联系页面声明一个单独的样式表。 这不是理想的,因为它很冗余。 如果您进行任何其他更改,您将始终需要在主样式表和联系页面样式表上进行更改。
  • 您可以在该页面上的所有链接上添加一个唯一的类。 这不是理想的,因为它不是非常语义化,而且也很冗余。 为什么在页面上的每个链接上应用一个类,而它们从上下文角度来看与站点其他地方的链接并没有什么不同?
  • 最好的解决方案是为您的 body 元素添加一个唯一的 ID。 这完美地解决了问题。 您可以使用相同的样式表并使用单个 CSS 选择器定位您想要的目标链接。

 

如何实现

很简单,只需将 ID 应用于 body 标签即可

   ...
</head>

<body id="contact-page">
   ...

现在,以将联系页面上的所有链接颜色更改为红色为例,只需使用以下 CSS 代码

a { 
color: blue; 
}

#contact-page a {
   color: red;
}

 

更实用的例子

您明白了。 这项技术最实用的实现之一是在**导航**中。 看看这个导航示例

tabbednav.jpg

您看到论坛选项卡是如何成为“活动”选项卡了吗? 当然,这只是一个 CSS 的微小变化,可能是背景图片位置的微小调整。 XHTML 可能类似于这样

...
<li><a href="/fieldtips">Field tips</a></li>
<li class="active"><a href="/forums">Forums</a></li>
...

应用于列表项的“active”类会改变背景图片。 这将奏效,但是当我们切换到“Field Tips”页面时会发生什么? 我们将不得不从论坛选项卡中删除 active 类,并将其应用于“Field Tips”选项卡。 这很不方便。 这意味着导航块的代码在网站的每个页面上都是唯一的。 所以假设在以后我们想要添加一个“Contact”选项卡,我们将不得不修改每个页面的代码。 没什么乐趣。

让我们更聪明一点。 首先,我们不想在每个页面上都包含导航块代码,我们想要包含它,可能使用一个简单的 PHP 包含,就像这样

<?php include_once("nav.html"); ?>

 

但是,我们如何将“active”类应用于当前的导航列表元素呢?

这就是我们刚刚学习的将唯一 ID 应用于 body 元素的地方! 而不是仅将类应用于活动列表元素,让我们将唯一类应用于每个单独的列表项,并为我们的 body 元素提供一个唯一的 ID。

   ...
</head>

<body id="field-tips">
   ...
   <li class="fieldtips"><a href="/fieldtips">Field tips</a></li>
   <li class="forums"><a href="/forums">Forums</a></li>
   ...

现在,我们可以使用一些巧妙的 CSS 定位导航中的特定元素

#field-tips li.fieldtips, #forums li.forums {
   background-position: bottom;
}

这意味着导航块的代码可以**在每个页面上保持一致**,但只有该页面特有的导航元素才会受到此 CSS 的影响并“切换”到活动状态。

 

让我们变得更动态

读者 Brian 在如何使用 PHP 将唯一 ID 应用于 body 元素方面发表了一条很棒的评论

<body id="<?= basename($_SERVER['PHP_SELF'], ".php")?>">

这将返回正在执行的 PHP 文件的名称作为 ID(例如 body id=”index.php”)。 要省略 .php 部分,只需删除“.php”部分即可。

更多关于basename的信息。 更多关于$_SERVER的信息。