【CSS in Depth 2 精译】1.3 特殊值

88 阅读6分钟

还有一些特殊的声明值,可以赋给元素的任意属性,以便更好地控制层叠,分别是:inheritinitialunsetrevert。下面逐一进行考察。

细心的您可能已经注意到了,代码清单 1.12 给出的超链接样式与平常略有不同,文字颜色由传统的蓝色改为了白色字体、蓝色背景。这么做正是为了演示上述关键字的效果。

代码清单 1.12 链接样式

a:link {
  background-color: blue;
  color: white;
  text-decoration: none;
  padding: 2px;
}
a:visited {
  background-color: purple;
}
a:hover {
  background-color: transparent;
  color: blue;
  text-decoration: underline;
}
a:active {
  color: red;
}

1.3.1 inherit 关键字

有时,当继承的样式被层叠值中断后,又想让继承样式重新生效。此时可以使用 inherit 关键字来实现,强制目标元素从父元素继承所需样式。

假设要在示例页添加了一个浅灰色的页脚,页脚内有一些超链接,但不希望它们太显眼,毕竟页脚不是示例页的重点。这就要把页脚内的超链接设置为深灰色(如图 1.10 所示)。

1.10.1.png
图 1.10 继承灰色文本的使用条款链接

代码清单 1.14 给出了此页脚的 HTML 结构。将其添加到页面末尾,即关闭标签 </body> 的前面。普通网页在页脚和页头之间会显示更多内容,这里方便演示就不展开了。

代码清单 1.14 带链接的页脚

<footer class="footer">
  &copy; 2023 Wombat Coffee Roasters &mdash;
  <a href="/terms-of-use">Terms of use</a>
</footer>

早些时候给示例页上所有的超链接都设置了一些样式,它们也将对《使用条款》的超链接生效。要让页脚内的链接变为灰色,需要用以下代码覆盖原有样式。

代码清单 1.15 inherit 值的应用

.footer {
  color: #666;  /* 页脚文本设置为灰色 */
  background-color: #ccc;
  padding: 15px 0;
  text-align: center;
  font-size: 14px;
}
.footer a {
  color: inherit;  /* 指定文字颜色从页脚继承 */
  background-color: transparent;  /* 覆盖蓝色背景为透明 */
  text-decoration: underline;
}

上述代码的第二个规则集用一个名为 inherit 的层叠值覆盖了页脚超链接本来的颜色。这样就继承了父元素 <footer> 的颜色。

这么做的好处是,一旦页脚的样式发生任何改动(例如修改第二个规则集,或者被其他样式覆盖),页脚超链接的样式也会同步跟进。例如,页脚文字在某些页面是较深的灰色,其中的超链接也会随之切换为深灰色。

此外,还可以使用 inherit 关键字来强制继承一个通常不会被继承的属性,比如边框或内边距,尽管在实际开发过程中鲜有用武之地。

1.3.2 initial 关键字

有时可能需要撤销某个元素的样式,正如代码清单 1.15 中撤销背景色那样的效果。此时就可以用关键字 initial 来实现目标。

每一个 CSS 属性都有一个初始值或默认值。如果将样式属性赋值为 initial,则可以将其手动设为该属性的默认样式,好比硬复位了该样式。

设置透明背景不要写成 background-color: transparent,而是使用 initial 值。根据以下代码更新样式。由于 transparent 是背景色属性 background-color 的初始值,最终效果将与上一段代码相同:

代码清单 1.16 initial 值的应用

.footer a {
  color: inherit;
  background-color: initial;  /* 将背景色重置为初始值 */
  text-decoration: underline;
}

这样做的好处是不必考虑太多:想移除一个元素的边框,使用 border: initial 即可;想让元素恢复为默认宽度,使用 width: initial 就搞定了。

可能您已经习惯了用 auto 值来实现诸如此类的重置效果;事实上使用 width: auto 确实也行,因为 width 的默认值本就是 auto

但值得注意的是 auto 并非所有属性的默认值,对许多属性而言,auto 值甚至是无效的。例如 border-width: autopadding: auto 就是无效样式,因此看不到任何效果。您也可以花时间钻研一下这些属性的初始值,但使用 initial 更简单。

注意

样式 display: initial 等价于 display: inline,并且无论加到什么元素上,都不会产生 display: block 的效果。这是因为 initial 会重置为该属性(property)的初始值,而不是该元素(element)的初始值; inline 才是 display 属性的默认值。在这种情况下,应该考虑使用关键字 revert

1.3.3 unset 关键字

关键字 inheritinitial 对于清除继承或非继承属性上设置的样式都非常有用。unset 关键字则是二者的结合:用于继承属性时,其值就是 inherit;用于非继承属性时,其值就是 initial

当然,您也可以分别使用 inheritinitial 来实现目标,但是 unset 用起来更简单,可以避免用错关键字。在示例的页脚上,您可以使用 unset 来修复超链接的字体及背景颜色。

代码清单 1.17 unset 值的应用

.footer a {
  color: unset;  /* 给能被继承的属性一个 inherit 值 */
  background-color: unset; /* 给不能被继承的属性一个 initial 值 */
  text-decoration: underline;
}

这样,文字颜色就设为了 inherit,使其能够继承页脚的灰色字体;而背景色设为了 transparent,它刚好是 background-color 属性的初始值。

注意:恢复链接的下划线样式仍然需要通过 text-decoration: underline 来实现。此时 unset 并不生效,因为 text-decoration 属性的初始值是 none 而非 underline 。请务必牢记:CSS 属性(CSS property)本身的初始值始终保持不变;它不受目标元素具体类型的影响。要“撤消”之前设置的 text-decoration 样式,需要用到另外一个关键字。

1.3.4 revert 关键字

关键字 initialunset 基本上可以覆盖包括作者样式和用户代理样式表在内的所有样式。如果只想覆盖此前设置的作者样式,而保留用户代理样式不变。这就是关键字 revert 的用法。

示例页脚中,如果将所有三个属性设为 revert,则超链接的样式将变为带下划线的蓝色文字(即浏览器默认样式);但我们想要的是灰色字体,因此在关键字的选择上应该更仔细:仅将 revert 应用到 text-decoration 属性上。按照代码清单 1.18 更新样式并查看最终效果。

代码清单 1.18 revert 值的应用

.footer a {
  color: unset;
  background-color: unset;
  text-decoration: revert; /* 撤销为用户代理样式 */
}

在本例中,这些关键字可能看起来有些多余,因为这些属性对您而言可能非常熟悉,直接给它们赋上需要的样式值即可;但是,当使用较新的 CSS 功能或遇到像 flexbox 这样、具有多个关键字的样式属性时,可能就没那么容易知晓其对应的默认值了。这时,这些关键字就派上用场了。此外,这么做还有一个额外的好处:可以巧妙地提醒今后的样式开发人员,您这里的意图旨在有效地撤消样式表中其他地方的样式。

警告

这些关键字都是普通的层叠值,意味着当优先级更高的其他选择器也指向同一个元素时,其样式值仍然可以被新样式覆盖。