还有一些特殊的声明值,可以赋给元素的任意属性,以便更好地控制层叠,分别是:inherit、initial、unset 和 revert。下面逐一进行考察。
细心的您可能已经注意到了,代码清单 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.14 给出了此页脚的 HTML 结构。将其添加到页面末尾,即关闭标签 </body> 的前面。普通网页在页脚和页头之间会显示更多内容,这里方便演示就不展开了。
代码清单 1.14 带链接的页脚
<footer class="footer">
© 2023 Wombat Coffee Roasters —
<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: auto 和 padding: auto 就是无效样式,因此看不到任何效果。您也可以花时间钻研一下这些属性的初始值,但使用 initial 更简单。
注意
样式
display: initial等价于display: inline,并且无论加到什么元素上,都不会产生display: block的效果。这是因为initial会重置为该属性(property)的初始值,而不是该元素(element)的初始值;inline才是display属性的默认值。在这种情况下,应该考虑使用关键字revert。
1.3.3 unset 关键字
关键字 inherit 和 initial 对于清除继承或非继承属性上设置的样式都非常有用。unset 关键字则是二者的结合:用于继承属性时,其值就是 inherit;用于非继承属性时,其值就是 initial。
当然,您也可以分别使用 inherit 和 initial 来实现目标,但是 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 关键字
关键字 initial 和 unset 基本上可以覆盖包括作者样式和用户代理样式表在内的所有样式。如果只想覆盖此前设置的作者样式,而保留用户代理样式不变。这就是关键字 revert 的用法。
示例页脚中,如果将所有三个属性设为 revert,则超链接的样式将变为带下划线的蓝色文字(即浏览器默认样式);但我们想要的是灰色字体,因此在关键字的选择上应该更仔细:仅将 revert 应用到 text-decoration 属性上。按照代码清单 1.18 更新样式并查看最终效果。
代码清单 1.18 revert 值的应用
.footer a {
color: unset;
background-color: unset;
text-decoration: revert; /* 撤销为用户代理样式 */
}
在本例中,这些关键字可能看起来有些多余,因为这些属性对您而言可能非常熟悉,直接给它们赋上需要的样式值即可;但是,当使用较新的 CSS 功能或遇到像 flexbox 这样、具有多个关键字的样式属性时,可能就没那么容易知晓其对应的默认值了。这时,这些关键字就派上用场了。此外,这么做还有一个额外的好处:可以巧妙地提醒今后的样式开发人员,您这里的意图旨在有效地撤消样式表中其他地方的样式。
警告
这些关键字都是普通的层叠值,意味着当优先级更高的其他选择器也指向同一个元素时,其样式值仍然可以被新样式覆盖。