1、标记代码的部件:标签、元素和属性
与其他标记语言一样,XHTML的关键,是标签( tag)。标签是经过编码的符号,用于分隔和区分内容的不同部分, 并告知浏览器它所处理的是什么类型的内容。
XHTML中的标签包围在一对尖括号(<和>)之间,以便将它们与普通文本明确区分开。 第一个尖括号(<)标明了标签的开头,随后是特定的标签名(tag name),最后以一个反向的尖括号(>)结束。例如,下面是表示段落的开头的XHTML标签:
注意, 标签名使用的是小写, 这是XHTML的要求。标签名在HTML中不区分大小写(许多 Web 作者把它们写为大写,以便让标记代码更易读) , 但在XHTML中必须是小写(这是XHTML区别于HTML的那些更严格的规则之一)。
大多数标签都配对使用:1个开标签[opening tag,也叫开始标签(start tag)],用于标明一 个内容片段的开始,还有一个闭标签[ closing tag,也叫结束标签( end tag),用于标明其结束。
这对标签和它们之间的一切形成一个完整的元素(element)。元素是 XHTML 文档的基本组成要素。老版本的HTML中有些元素不需要闭标签,因为一个新的开标签的出现暗示了前一元素的结束和新的一个元素的开始。但是在XHTML中,所有元素都必须结束于一个闭标签一 更准确地说,是几乎所有。
某些标签表示空元素(empty element),它们没有内容一实际上也不能有内容。空元素不需要结束标签,但是在XHTML中要通过在代表整个元素的一个单独的标签的尾部使用一个结尾斜线(trailing slash)来“自闭合” 。例如,下面的标签代表一个换行。它是一个空元素,在浏览器呈现文档时,会强迫后面的文本折到一个新行上:
结尾斜线之前的空格不是非有不可,但是它能希助较老的浏览器正确理解标签,因为如果没有这个空格,有些罕见的旧式浏览器不能发现标签的结束尖括号。有些空元素被称为替换元素 (replaced element),它们实际上并不由图形浏览器自己呈现,而是被替换为一些别的内容。在HTML中,空元素不应当包含结尾斜线。
元素的开标签可以带有一些属性(attribute),以提供有关该元素的更多信息——一些该元素应有的特定属性(property)。属性由属性名 (attribute name)和随后的属性值(attribute value) 组成,如下所示: Hello, world!<∕p>
这一段落具有一个值为“greeting”的class属性,这个属性将它与其他没有这一属性的段落区别开来。属性的名和值用一个等号(=) 连接起来,并且值要用一对引号括
起来。XHTML中所有属性值都必须用引号括起来,用单引号或双引号均可。在HTML中属性值用不用引号括起来都行,但在XHTML Strict中则必须括起来。有些
属性在HTML中不需要有值[没有值的属性被称为最小化属性(minimized attribute)],但在XHTML中所有属性都必须有值——最小化属性是不允许的。与标签名一样,属性名在XHTML中必须是小写,但在HTML中则不区分大小写。属性值则总是不区分大小写的,特别是因为有些值可能需要使用大写字母。即便如此,为了一
致性起见,只要可以用小写就最好用小写。
元素的开标签可以具有多个属性,它们彼此用空格隔开。属性只允许出现在开标签中(或空元素的单一的、自闭合的标签中) 。某些元素必须指定某些属性,而其他属性则是可有可无的,一切取决于该元素本身。下图说明了XHTML元素的基本组成部分:
2、块级元素和行内元素
元素可分为两大基本类型:块级的和行内的。块级元素(block-levelelement)包含有一大块内容,应该被显示在自己的行上,它们可以用来将长长的文本分割为一些段落、标题和列表等可管理的部分。行内(inline)元素通常包含一串较短的文本,并且被呈现在同一行上其他文本的旁边,如句子中一些着重强调的词就可以被标记为行内元素。
所有非空的块级元素都能包含文本和行内元素,它们中的大多数还可以包含其他块级元素。相比之下,非空的行内元素则只能包含文本或其他行内元素。例如,em 元素是行内元素,用于对其中的文本加以强调;而p元素是块级元素,用于标明文本段落。因为em是行内元素,不能包含块级元素,所以下面的例子是错误、无效的: Hello, world!<∕p><∕em>
3、嵌套元素 Helloj worldl<∕p><∕em> Hello, world I<∕em><∕p>
元素可以层层嵌套,每个元素都存在于其包含元素中。它们必须正确嵌套, 每个闭
标签都要以正确次序出现,以便在闭合一个内层元素的包含元素之前先闭合这个内层元素。下面的标记代码是不正确地嵌套在一起的几个元素的例子:
确保元素的正确嵌套,应该总是以与它们打开的次序相反的次序闭合它们:
4、空白符
在作为纯文本创建XHTML文档时,可以随意编排其格式。换行和缩进可以让标记代码在编辑文档的过程中更具可读性。对嵌套的块级元素进行缩进有助于看清特定
元素开始和结束的位置,并避免发生嵌套错误或忘记用正确的闭合标签结束元素的情况。
有时你可能想保留内容中额外的空格、制表符、换行符,如在页面上编排诗歌或计算机代码的格式的时候。元素pre正是用于这种描述多段预先编排过格式的文本的场合。
5、标准属性
讲述一个元素时,会列出它的必需属性和可选属性。但是有些通用属性几乎可以用于任何元素(并且基本上都是可选的)。
①核心属性——这类属性包含关于元素的一般性信息,可以包含在几乎任何元素的开标签内。
class:表示特定元素所属的一个类或一组类。同属一类的元素可以共享一些呈现性特征,而且对元素进行分类对于客户端脚本编程也会有用。类名几乎可以是任何你喜欢的文字,但只能由字母、数字、连字符(-)和下划线( _)组成,其他标点符号或特殊符号是不允许的。可以有多个元素属于同一类。此外,一个元素也可以属于不止一个类,此时属性值中的多个类名用空格分隔。
id:为元素指定一个唯一性的标识符。id 可以是几乎任何简短文字,但它在一个文档中必须是唯一的,不能有多个元素共用一个标识符。id 属性不能含有除连字符(-)和下划线 ( _)之外的任何标点符号或特殊符号。其中第一个字符必须是字母,而不能是数字或任何其他字符。
style:为元素指定 CSS 属性。这被称为内联样式定义( inline styling) 。虽然 style属性对大多数元素都有效,但应该避免使用,因为它把内容和表现混在了一起。
title:为元素提供一个文本标题。许多图形化浏览器将title属性的值显示在“工具提示”(即当用户的鼠标指针逗留在所呈现的元素上方时出现的那个小小的浮动窗口)中。
②国际化属性——包含关于用于书写元素内容的自然语言(如英语、法语、拉丁语等)的信息。它们几乎可以包含在任何元素中,特别是那些所包含文本使用的语言不同于文档其他部分的元素。
③焦点属性
当某些元素一尤其是链接和表单控件一处于预激活状态时,被称为拥有焦点( focus), 因为浏览器的“注意力”集中在该元素身上,准备激活它。可以为一些元素设置下列焦点属性以增强其对于用键盘在网页上导航的人的可用性。
6、添加注释
在文档中嵌入注释往往很有用。它们不会被浏览器显示,但是你(或其他人)在查看源标记代码时可以看到。注释可以包含如对文档为何要以特定方式进行组织的说明、文档的修改指南或改动历史记录这类东西。XHTML中的注释使用一种特别的标签结构:
<!--Use an h2 for subheadings-->
<h2>Adding Comments<∕h2>
一段注释始于。浏览器不会呈现任何出现在这些标记符号之间的内容或元素,即便注释跨越多行。注释也可用于在测试网页时暂时“ 隐藏” 一部分标记代码:
<!-- Hiding this for testing
<h2>Adding Comments<∕h2>
End hiding -->
虽然注释不会被浏览器显示出来,但是它们依然随着其余的标记代码一起被发送,而且访问者查看网页的源代码时也可以看到它们。不要期望注释能完全保密,也不要依赖它们来永久性地删除或禁用任何重要的内容或标记代码。
7、XHTML 文档
先前我们反复使用文档(document)和页面(page)这两个词,你也许会以为它们可以互换使用。但一般说来,当说到文档的时候,我们所谈论的是含有XHTML 源代码的那个纯文本文件, 而页面则是图形浏览器呈现这个文档所得到的可见结果。文档是你创作的东西, 而页面则是你(以及网站的访问者)将看到和使用的东西。
一个有效、合式的XHTML文档必须符合严格的结构,并按确切的格局安排一些必需的组成部分。下面的代码中所有必需的部分都出现在正确的位置。
<!DOCTYPE html PUBLIC "-∕∕W3C∕∕DTD XHTML 1.0 Strict∕∕EN"
"http:∕∕www.w3.org∕TR∕xhtml1∕DTD∕xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml1" lang="en" xml:lang="en">
<head>
<title>My first web page<∕title>
<∕head>
<body>
<p>XHTML is easy!<∕p>
<∕body>
<∕html>
尽管看上去很简单,这确实是个完整、有效、合式的文档。你创建的每个网页都将从与其类似的框架开始。
8、Doctype
XHTML文档开始于一个文档类型声明(Document Type Declaration,简写为 doctype)。这是 一种必需的组成部分,它声明了文档的类型及其所遵守的标准规则集。XHTML的每种“ 风味” 都有自己相应的文档类型声明。
<!DOCTYPE html PUBLIC -∕∕W3C∕∕DTD XHTML 1.0 Strict//EN"
"http:∕∕www.w3.org∕TR∕xhtml1∕DTD∕xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-∕∕W3C∕∕DTD XHTML 1.0 Transitioπal∕∕EN"
"http:∕∕www.w3.org∕TR∕xhtml1∕DTD∕xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-∕∕W3C∕∕DTD XHTML 1.0 Frameset∕∕EN"
"http:∕∕www.w3.org∕TR∕xhtml1∕DTD∕xhtml1-frameset.dtd">
文档类型声明是一种标签,但是尽管也使用尖括号,它并不是XHTML元素,因此并不需要一个闭标签或结尾斜线。实际上,它根本不是文档的标记代码的一部分。它只是向用户代理传达关于文档的信息,助其判断所处理的文档的类型并按照恰当的规则呈现页面。
你的XHTML文档中的文档类型声明必须严格按我们刚才所展示的那样书写,包括其大小写形式和引号,但不必折为两行。
文档类型切换:遵从模式与怪异模式
当浏览器下载了HTML或XHTML文档后,它必须做出一系列程序化的假定,以便解析文档的标记代码并应用作者的CSS代码中建议的表现样式。一个页面也许在一个图形化浏览器中呈现得很完美,但在另一个浏览器中却乱成一锅粥。
这种窘境导致了文梢类型声明切换(doctype switch)的出现。如果一个文档包含有完整、正确的文档类型声明,那么现代的浏览器可以认为整个文档是合式的并且遵守Web标准。于是浏览器可以在一种遵从标记语言和CSS的既定标准的模式下呈现页面。这种模式称为遵从模式 (compliance mode)或严格模式(strict mode)。如果文档中没有文档类型声明,或者声明不完整或不正确,则浏览器将假定所处理的是一个旧式文档,并转而采用其宽松和宽容的旧式呈现模式。这种模式称为怪异模式(quirks mode),有时也叫兼容模式(compatibility mode),因为它旨在适应非标准的、未正确构建的标记代码的种种怪癖。较老的浏览器缺乏内置的文档类型声明切 换功能,因此只能使用其过时的怪异模式。
在现代的Web浏览器中,为了正确地启用遵从模式,必须在文档的第一行加入一条完整的文档类型声明,在它之前只允许有空白符。出现在文档类型声明之前的任何标记代码、文本甚至注释都将导致大多数现代浏览器进入怪异模式并产生常常不可预见的结果。当文档使用遵从模式呈现的时候,用CSS设计网站要容易得多,其结果也更为一致。因此,一条完整、正确的文档类型声明是非常必要的。并且,因为文档类型声明也是有效Web文档的必需部分,所以只要文档是正确的,新式浏览器总会用遵从模式来呈现它们。
9、元素
实际的标记代码从文档类型声明后面的html元素开始。它是整个文档的容器,被踪为根元素(rootelement)。html元素没有自己特有的属性,纯粹是一个用于定义文档的开始和结尾的容器。出现在这个元素之外的任何元素或内容(除了并非元素的文档类型声明) 都将导致整个文档无效。
命名空间(namespace)是XML语言中规定元素和属性名称的地方。XML是一种可扩展标记语言,允许作者定义自己的自定义元素和属性。例如,对于一个关于动物的文档来说,一个具有species属性的animal元素会很有用,这些自定义名称可以定义在一个特别的命名空间中。另一方面,XHTML1.0具有一套预定义的元素和属性名称集,其命名空间的正确URL为http://www.w3.org/1999/xhtml。XHTML文档中的命名空间通过html元素的xmlns属性声明。
标准的lang和xml:lang属性对于html元素是可选的(正如对于大多数其他元素一样)。因为它是根元素,所有其他元素都是其后裔,这里的语言声明将会传递到文档中的所有其他元素,所以建议指定这两个属性。
10、其他部分
文档的其他部分由head和body元素组成。head元素包含关于文档自身的信息(包括必需的title元素),而body元素则包含所有最终由浏览器呈现并供访问者浏览和使用的内容。
总而言之,XHTML文档的基本结构非常简单,只需要一条文档类型声明、一个根元素、一个具有title元素的head元素,还有一个body元素。
11、文档树
可以把XHTML文档的结构想象为一棵倒置的树,其枝干代表文档的元素。这棵树发端于顶部的根元素,并向下延伸出所有其他元素。它更像是一个家谱图,而不是一棵枝繁叶茂的木质的树。出于这个原因,家谱学中的术语常被用于描述元素之间的关系。
12、CSS基础
CSS能够为页面添加样式,增强和改进内容的外观。提供结构的是XHTML,每个元素都标明了内容中的一个不同部分,而属性则传达了关于元素的更多信息。CSS是影响这些XHTML元素的呈现外观的另外一层要素。颜色、字体、文本大小、背景以及元素在页面上的布局都属于内容的表现方面的因素,都能通过巧妙运用CSS来加以控制。
13、CSS 规则剖析
如果说元素是标记代码的构建块料的话,那么CSS的构建块料则是规则( rule)。它是一个指令集,浏览器可以按照其指示基于所提供的描述性的值改变XHTML元素的外观。一条CSS规则由几个部分组成,如下图所示:
属性的值说明了应被应用到选定的元素上的特定样式。可接受的值取决于属性本身,有些属性可以有用空格分隔的多个值。
样式声明位于一对大括号"{” 和“ }"之间。可以为一个选择符指定多个样式声明,以便用一条规则改变元素表现样式的多个方面。属性与其值之间用冒号( : )分隔,样式声明以一个分号( ; )结尾。分号可以把多个样式声明分隔开,但是如果规则中只有一个样式声明,那么分号是可选的。一系列样式声明中的最后一个也是如此。为谨慎起见,养成在每一个样式声明的后 面都加上一个分号(即使只有一个样式声明)的习惯不是件坏事。
如果CSS代码没有遵守这些基本结构和语法,例如,漏掉了闭合括号或分隔属性和值的冒号, 那么整条规则甚至整个样式表都可能会失灵。就像XHTML一样,样式表应该是合式的和正确构造的。W3C 提供了1个验证服务(http://jigsaw.w3.org/css-validator/) ,它可以帮助你发现样式表中的错误。
14、CSS 选择符
选择符,用于从XHTML文档中选择元素。选择符有许多种,各有其不同的具体性
(specificity),可以确定一大批元素或仅仅几个元素。具体性是度量选择符的作用范围的手段。所谓作用范围,换句话说,指的是选择符选择了多少元素在CSS的设计原则中,比较具体的选择符将凌驾于较不具体的选择符之上并取而代之。具体性是 CSS中较为含糊和难以掌握的概念之一,但也是这种语言中最强大的特性之一。
* { color: blue; }
em ( color: red; }
.info { color: purple; }
#introduction { color: green; }
:link { color: blue; }
:visited ( color: purple; }
:active ( color: red; }
:hover ( color: green; )
:focus ( color: orange; }
:link
伪类选择所有超链接元素。:visited
伪类选择那些所指向的目标已经被访问过的链接(已访问过的链接被记录于响浏览器内在的访问历史记录中)。:active
伪类选择处于活动状态的链接。所谓处于活动状态,指的是在被激活期间(当用 鼠标点击链接时,或当焦点位于链接上并按下回车键时)。: hover
伪类选择用户的定点设备“悬浮”于其上方的元素。虽然任何元素都能处于有定点设备悬浮其上的状态,但是这一伪类最常用于链接(不过,某些老式浏览器只支持把这一伪类用于链接而不是其他元素)。:focus
伪类选择拥有焦点的元素。某些浏览器不支持:focus
,特别是Windows下的IE 6。但是,IE实际上(不正确地)将: active
伪类当做: focus
伪类对待,不过这仅针对链接,不适用于其他元素。
:active “激活”: 鼠标点击标签,但是不松手时。
:focus 是某个标签获得焦点时的样式(比如某个输入框获得焦点)。
#introduction em { color: yellow; }
#introduction.info p*{color: pink; }
p.info { color: blue; }
p#introduction a.info:hover { color: silver; }
p, h1, h2 { color: blue; }
将同样的颜色值应用到 p、h1和h2元素的每一个实例。p#intreduction em, a.info:hover, h2.info ( color: gold; }
选择的是id值为introduction的段落的后代中的所有em元素、属于info类且处于有定点设备悬浮其上的状态的所有链接,以及属于info类的所有h2元素(二级标题)(记住,一个类中可以包含不同类型的元素) 。15、具体性与层叠
各种选择符都分配有一个确定的具体性级别,用于度量它将会影响到的XHTML元素的可能数目。看看下面两条CSS规则,其中一条有一个元素选择符,而另一条有一个类选择符:
h2 ( color: red; }
.title ( color: blue; }
再看看下面的XHTML代码片段,它有一个属于title类的h2元素:Specificity and the Cascade<∕h2>
第1条规则选择所有h2元素,第2条规则选择所有属于title类的元素。因为所示元素同时满足这两条选择标准,所以导致了两条CSS规则之间的冲突。图形化浏览器必须在两条规则中选择听从其中一条,以确定标题最终的颜色。在CSS中,比较具体的选择符会胜过较不具体的选择符。 因为类选择符比元素选择符更具体,第2条规则有更高的具体性,所以标题将被呈现为蓝色。
现代的Web浏览器按照一套复杂的方案来计算选择符的具体性,只要记住下列几条规则,你很少需要去计算选择符的具体性数值:
□ 全体选择符完全不具备具体性。
□ 元素选择符比全体选择符更具体。
□ 类或伪类选择符比元素选择符更具体。
□ ID选择符比类和伪类选择符更具体。
□ 内联的style属性中声明的CSS属性具有最高的具体性。
组合选择符和后代选择符中的具体性可以被累加。每一种基本选择符类型都有一个与众不同的具体性方面的权重。一个具有两个类的选择符比具有一个类的选择符更具体,一个具有一个ID的选择符比一个具有两个类的选择符更具体,如此等等。计算具体性的算法的设计保证了不可能发生一大批较不具体的选择符压过一个较具体的选择符这样的事。无论多少元素选择符都不可能比一个类选择符更具体,无论多少类选择符都不可能比一个 ID选择符更具体。即使你用上百个元素选择符拼凑出一个复杂的选择符来,另一条只有一个ID选择符的规则都将盖过它。
理解了具体性,你就能构造精确地选择目标元素的CSS规则。
如果有两个选择符以同一个元素为目标,并且它们具有相同的具体性, 那会有
什么结果。例如:
.info h2 ( color: purple; }
h2.title { color: orange; }
如果有一个h2元素属于title类,并且它还是另一个属于info类的元素的后代,那么这两条规则都可以用于这个h2元素。
假定多个选择符具有相同的具体性,在此情况下,由于浏览器会按遇到样式声明的次序应用它们,所以后面的声明会盖过前面的声明。无论后一个声明出现在同一个规则中、出现在同一个样式表中另一个位置靠后的规则中,还是出现于在前一个声明所在的样式表的后面下载的另一个样式表中,结果都一样。
CSS的名字就来自它的这种特性,多个样式表彼此层叠(cascade),叠加出浏览器中最终的表现结果。前面的例子中的那个h2元素将呈现为橙色,因为第2条规则将盖过第1条。
下面是另一个例子:p { color: black; color: green; }
这条规则包含两个样式声明;但是段落将会被呈现为绿色,因为绿色的前景色声明在层叠顺序中后出现。
具体性和层叠的这种有时会很复杂的相互作用一开始可能会让人觉得CSS难以驾驭,但是一旦你理解了基本规则,它就变成了一种习性。
16、将样式表附加到文档
为了用CSS控制网页的样式,需要把样式表连接到文档。当图形化浏览器下载XHTML文档并进行解析时,会自动寻找指示它如何呈现各种元素的CSS规则。在文档中加入样式表有几种方法,它们各有其优缺点。
<h2 style="color:red;">Good eats for hungry geeks<∕h2>
<p style="color: gray;">Our fresh pizzas, hearty pasta dishes,and
succulent desserts are sure to please. And don't forget about our
daily chalkboard specials!<∕p>
然而你应该避免使用内联样式。它们把表现性因素与标记代码混在一起,因而失去了使用CSS的主要
优点之一。它们还有高度的冗余性,因为你不得不反复声明同样的样式属性以实现一 致的表现结果。要是将来你想修改网站,例如,把所有标题从红色改为蓝色,你得在每一个文档中找到每一个标题并加以修改。对于一个复杂的大型网站来说,这是一项令人望而却步的任务。
不过,内联样式在极少数情况下也许是一种有效的手段,但这些情况非常罕见,应该首先考虑其他解
决方案,把内联样式视为在其他方案都不可行的情况下才使用的最后一招。
<!DOCTYPE html PUBLIC "-∕∕W3C∕∕DTD XHTML 1.0 Strict∕∕EN" "http:∕∕www.w3.org∕TR∕xhtmll∕DTD∕×htmll-strict.dtd">
<html ×mlns≡"http:∕∕www.w3.org/1999/xhtml" lang="en", ×ml:lang="en">
<head>
<title>Spaghetti and Cruft:Our Menu<∕title>
<style type="text∕css">
h2{color: red;}
p{color: gray;}
<∕style>
<∕head>
<body>
<h2>Good eats for hungry geeks<∕h2>
<p>0ur fresh pizzasi hearty pasta dishes, and succulent desserts are sure to please. And don't forget about our daily chalkboard specials!<∕p>
<∕body>
<∕html>
在文档的head部分嵌入样式表在一定程度上实现了表现性因素与结构化内容的分离,而且这些规则将应用于整个文档。但是,如果打算一次把样式应用到多个页面,这就不是一种有效的方法了。 网站中其他
文档也得有自己的嵌入式样式表,因此以后再修改网站的表现形式时,将需要修改其中的每一个文档。
XHTML文档通过head中的link元素来链接外部样式表。
<!DOCTYPE html PUBLIC "-∕∕W3C∕∕DTD XHTML 1.O Strict∕∕EN",http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
" lang="en" xml:lang="en">
Spaghetti and Cruft : Our Menu<∕title>
" type=" text∕css" href≡"styles.css"∕>
<∕head>
<body>
<h2>Good eats for hungry geeks<∕h2>
<p>0ur fresh pizzas, hearty pasta dishes, and succulent desserts are sure to please. And don't forget about our daily chalkboard specials!<∕p>
<∕body>
<∕html>
当图形化浏览器下载并开始处理文档的时候,将按链接的指示获取并处理外部样式表,然后自动按照
其中的规则呈现页面。外部样式表只下载一次,然后由浏览器缓存起来,用于后面的页面。这使XHTML文档变得更加轻便,提升了整个网站的速度。
17、层叠顺序
一个文档可以链接多个不同的CSS文件,每个样式表在文档的head中都有一个对应的link元素。根据网站的复杂程度,你也许会把适用于整个网站的普通规则放到一个样式表中,让网站某个部分中的页面除了这个样式表之外再链接到另一个定义专用于这些页面的规则的样式表。你也可能更喜欢按样式的用途来拆分样式表,例如,用一个样式表定义颜色和背景,另一个样式表定义页面布局。
内联、嵌入和外部样式表这3种方法可以结合使用,但不值得提倡。如果网站中只有一个页面需要一些额外的规则,可以选择仅在这个文档中加入一个嵌入式样式表。 在某些很少见的场会, 你也许想挑一个元素予以特别对待,并为其添加内联样式。在几乎所有情况下,外部样式表都是最佳方案:它们消除了表现性的标记代码,提升了网站的性能,而且更容易维护。
有这么多来自不同来源的CSS规则,不可避免地会发生一些重叠。具体性机制能够解决部分问题:较具体的选择符胜过一般性的选择符。然而仅有具体性机制还不足以解决图形化浏览器在呈现网页时可能会遇到的所有样式冲突。在具体性机制束手无策时,就需要层叠顺序(cascade order)机制插手来摆平问题了。
CSS规则按其出现的先后顺序被应用到内容上:后面的规则盖过前面的。各个样式表的下载也有特定的顺序。对于外部样式表,其顺序取决于其link元素在文档中出现的顺序。后链接的样式表中的规则盖过先链接的样式表中的规则。嵌入到文档的style元素中的规则在所有外部样式表之后处理。如果文档中嵌入了多个样式表(各位于其style元素中) ,则后面嵌入的样式表盖过前面的。内联到元素的style属性中的样式声明的应用顺序更在嵌入式样式表之后。
除作者样式表(author style sheet)之外,每种现代图形化Web浏览器都有其用以定义各种元素的默认外观的内置样式表。如果浏览网页时不使用任何作者提供的CSS样式,那么所看到的就是用浏览器样式表(browser style sheet)呈现的结果。浏览器样式表在层叠顺序中最先出现,因此所有作者提供的样式都将盖过这些默认样式。让事情变得更复杂的是,许多Web浏览器允许最终用户附加自己的自定义样式表,即用户样式表(user style sheet) 。它在层叠顺序中第2个出现, 因此将盖过浏览器的默认样式,但不能盖过作者的样式。
各种样式来源的层叠顺序可总结如下:
(1) 浏览器样式表。
(2) 用户样式表。
(3) 外部作者样式表(按其被链接的顺序) 。
(4) 嵌入式作者样式表(按其出现的顺序) 。
(5) 内联作者样式。
层叠机制也适用于每个样式表内部,最靠近内容的样式获胜。最后声明的值就是呈现内容时所应用的值。
18、 !important
在某些非常罕见的情况下,具体性机制和层叠机制都不足以保证想要的值能被应用,此时可以用特殊关键字! important (连同前面的感叹号) 强迫浏览器给予这个值高于其他所有值的地位。 这是一个强大而又危险的工具,只宜用作解决在你的控制之外的样式冲突的最后手段(例如,当你不得不与使用了你无法直接修改的内联样式的第3方标记代码打交道时) 。
! important指示必须出现在样式属性值之后,在分号之前。如下所示:
h1 ( color: red ! important; }
用 ! important声明的属性值,无论其在层叠顺序中的位置如何以及其选择符的具体性如何, 都会被应用到所呈现的内容,除非有另一个也使用! important声明的值与它冲突。在后一种情况下,具体性和层叠机制又将发挥作用。有一个重要的例外应该注意:用户样式表中的! important值总是优先使用,甚至会盖过作者样式表中的! important 值。这种机制把最终权力交给用户。
19、编排 CSS 的格式
外部样式表与XHTML文档一样都是纯文本。只要遵守基本的语法,你可以随意编排 CSS文档的格式。
在CSS中额外的空格和回车会被忽略。浏览器不在乎纯文本看起来是个什么样子,只在乎它在技术上是否是合式的。在编排CSS的格式这个问题上,最重要的因素是你的个人偏好。 规则有两种常见的书写格式:舒展型(extended)和紧凑型(compacted)。
舒展格式把规则的选择符和样式声明写在不同的行上,许多作者觉得这种格式更易读,也更易处理。这种格式能让人一眼就看清每个属性在哪里开始和结束,其缺点在于编辑和阅读长长的复杂样式表时需要上下滚动。
hl, h2, h3{
color: red;
margin-bottom:.5em;
}
hl {
font-size: 150%;
}
h2 {
font-size: 130%;
}
h3 {
font-size; 120%;
border-bottom: lpx solid gray;
}
紧凑格式把每条规则压缩到一行上。这可以减少在文本编辑器中所需的纵向滚动,但是当规则在一行上包含了大量样式声明时却又会产生横向滚动的需要。下述代码展示了同一批规则, 它们各被压缩为一行,多余的空格也被删除了。
hl,h2,h3{color:red;margin-bottom:.5em;}
hl{font-size:150%;}
h2{font-size:130%;}
h3(font-size:120%;border-bottom:1px solid gray;}
紧凑格式的另一个好处是可以稍微降低文件的大小。空格、制表符和回车符都作为字符存储在电子文件中,每多一个字符就会在客户必须下载的文件的总体大小上增加1个字节。由于所有那些多余空白符的影响,一个长长的样式表采用舒展格式时其文件可能会比采用紧凑格式时大许多。为了兼顾最大可读性和最小文件尺寸这两个目标,有些作者在编写样式表时使用舒展格式,然后在把它移到运营中的Web服务器上时用自动化处理的方法把所有CSS代码压缩为一行。
在紧凑格式的规则中,在样式声明和值之间添加一点空格,将规则的行扩宽一些,这样做至少能让其更易读一点。由于找不到一个更好的词,我们姑且把这种格式称为半紧凑型(semicompacted)。
h1, h2, h3 { color: red; margin-bottom: .5em; }
hl { font-size: 150%; }
h2 { font-size: 130%; }
h3 ( font-size: 120%; border-bottom: ip× solid gray; }
最终选择取决于你,你可以用自己喜欢的格式创作自己的样式表。
20、CSS 注释
为样式表添加注释的理由与在XHTML中使用注释的理由相同:进行注解、向其他Web开发人员传达指示、测试期间暂时隐藏或禁用样式表的一部分。CSS中的注释始“/”,终于"/"气 浏览器不会解析位于这些标记符号之间的任何内容。与XHTML中的注释一样,CSS注释可以跨越多行。
∕* These base styles apply to all heading levels. */
h1, h2, h3, h4, h5, h6 { color: red; margin-bottom: .5em; }
/* Adjust the size of each∙ */
hl { font-size: 150%; }
h2 { font-size: 130%; }
h3 ( font-size: 120%; }
/* Temporarily hiding these rules
h4 { font-size: 100%; }
h5 { font-size: 90%; }
h6 { font-size: 80%; }
End hiding *∕