2.8 继承

就像你总是指望着腰缠万贯的老爸有一天会留给你一大笔遗产一样,CSS中的祖先元素也会向后代传递一样东西:CSS属性的值。还记得吗,我们在第1章讲文档层次结构时提到过,body是所有元素的老祖宗,所有标签都是它的后代。那么由于CSS继承的约定,如果我们为body像下面一样写一条规则

  1. body {font-family:helvetica, arial, sans-serif;}

那么,文档中的所有元素,无论它在层次结构中多么靠下,都将继承这些样式,以Helvetica字体(或者在Helvetica字体无效时以其他字体代替)显示各自包含的文本。继承给我们带来的效率是显而易见的,全站的主字体只要在某个上层元素上指定即可,无须在每一个标签上分别指定。而对于个别想使用不同字体的元素,只要个别设定font-family属性就好了。

CSS中有很多属性是可以继承的,其中相当一部分都跟文本有关,比如颜色、字体、字号。然而,也有很多CSS属性不能继承,因为继承这些属性没有意义。这些不能继承的属性主要涉及元素盒子的定位和显示方式,比如边框、外边距、内边距,这些下一章我们才会讲到。

举个例子吧,假设我们想创建一个边栏,在其中放一组链接。为此,我们用nav元素嵌套该组链接,并给nav应用了一种字号和一个边框效果,比如2像素宽的红色边框。不难想象,nav中的所有链接都继承它的字号很正常,可要是也继承它的边框就不合适了。当然,这些链接不会继承边框效果,因为border属性不能继承。

由于字体和文本样式是可以继承的,所以在使用相对字体单位(如百分比和em)时要格外小心。如果某个标签的字体大小被设置为80%,而它的一个后代的字体大小也被设置为80%,那么该后代中文本最终的字体大小将是64%(80%的80%)。这有时候可能并不是你想要的结果。第4章我们会详细介绍绝对和相对大小的利弊。

本书后面的例子还会继续向大家示范继承的作用,展示如何利用继承以最少的CSS代码达成预期效果。