在本指南中,展示了定义简单的样式表是很容易的。要了解这一指南,你需要对HTML有一点了解(参见[HTML40])并掌握一些基本的桌面出版术语。
我们以一短小的HTML文档作为开始:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Bach's home page</TITLE> </HEAD> <BODY> <H1>Bach's home page</H1> <P>Johann Sebastian Bach was a prolific composer. </BODY> </HTML>
要将H1元素的文本颜色设置为蓝色,你可以写出如下的CSS规则:
H1 { color: blue }
一条CSS规则包含两个主要的部分:选择子('H1')以及声明('color: blue')。声明包含两个部分:属性('color')和值('blue')。虽然上述的例子中,只是影响了用来渲染HTML文档所需的属性中的一个,其本身已经构成了一个样式表。和其它的样式表相结合(样式表的结合是CSS的基本特性),就可以确定文档最终的呈现。
HTML 4.0规范定义了HTML文档中如何指定样式表规则:可以是在HTML文档中,或者通过一个外部样式表。把样式表置入文档中,可以使用STYLE元素:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Bach's home page</TITLE> <STYLE type="text/css"> H1 { color: blue } </STYLE> </HEAD> <BODY> <H1>Bach's home page</H1> <P>Johann Sebastian Bach was a prolific composer. </BODY> </HTML>
为了获得最大程度上的灵活性,我们推荐作者指定外部样式表;不用修改HTML文档就可以对样式表加以修改,并且样式表可以为几个文档共享。要连接外部样式表,可以使用LINK元素:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Bach's home page</TITLE> <LINK rel="stylesheet" href="bach.css" type="text/css"> </HEAD> <BODY> <H1>Bach's home page</H1> <P>Johann Sebastian Bach was a prolific composer. </BODY> </HTML>
LINK元素规定了:
为了显示样式表和结构化标记的紧密联系,我们将继续在本指南中使用STYLE元素。我们来加入更多的颜色:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Bach's home page</TITLE> <STYLE type="text/css"> BODY { color: red } H1 { color: blue } </STYLE> </HEAD> <BODY> <H1>Bach's home page</H1> <P>Johann Sebastian Bach was a prolific composer. </BODY> </HTML>
现在的样式表包含两条规则:第一条将BODY元素的颜色设置为'red',而第二条将H1元素的颜色设置为'blue'。由于并没有指定P元素的颜色,它将从它的父元素,即BODY元素那里继承颜色值。H1元素也是BODY元素的一个子元素,但第二条规则的设立超越了继承值。 在CSS中,经常会有不同值之间的冲突,本规范描述了如何解决这些冲突。
CSS2有100个以上不同的属性,包括'color'。我们来看一下其中的一些属性:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Bach's home page</TITLE> <STYLE type="text/css"> BODY { font-family: "Gill Sans", sans-serif; font-size: 12pt; margin: 3em; } </STYLE> </HEAD> <BODY> <H1>Bach's home page</H1> <P>Johann Sebastian Bach was a prolific composer. </BODY> </HTML>
首先注意到几个声明集合在一个块中,并以花括号分割({...})。它们之间以分号分割,最后一个声明也可以跟一个分号。
BODY元素的第一个声明将字体家族设置为"Gill Sans"。如果在用户端(通常是指“浏览器”)那个字体不存在,用户端将使用'sans-serif'字体,而这一字体是所有的用户端都支持的五种通用字体之一。BODY元素的子元素将继承BODY元素的'font-family'属性值。
第二个声明将BODY元素的字体尺寸设置为12点。“点”这个单位广泛地应用在出版物印刷行业,用来表示字体尺寸和其它长度值。这是一个绝对单位的示例,不随着环境的不同而相对变化。
第三个声明使用了相对单位,将根据环境而相对变化。“em”单位是指元素的字体尺寸。在本例中,结果是BODY元素周围的边距是字体尺寸的三倍。
CSS可以应用在任何结构化文档中,如可扩展标记语言应用([XML10]。事实上,XML比HTML更加依赖样式表,因为作者可以创建他们自己的元素,而用户端不知道如何显示它们。
下面是一个简单的XML段落:
<ARTICLE> <HEADLINE>Fredrick the Great meets Bach</HEADLINE> <AUTHOR>Johann Nikolaus Forkel</AUTHOR> <PARA> One evening, just as he was getting his <INSTRUMENT>flute</INSTRUMENT> ready and his musicians were assembled, an officer brought him a list of the strangers who had arrived. </PARA> </ARTICLE>
要将这一段落以文档形式呈现,我们必须首先声明哪些元素是行内元素(不引起分行的元素),而哪些是块类元素(引起分行的元素)。
INSTRUMENT { display: inline } ARTICLE, HEADLINE, AUTHOR, PARA { display: block }
第一条规则声明INSTRUMENT是行内元素;而第二条规则,以逗号分割的列表方式列出了一系列选择子,而它们都是块类的。
将样式表连向XML文档的一个建议是使用处理指令:
<?XML:stylesheet type="text/css" href="bach.css"?> <ARTICLE> <HEADLINE>Fredrick the Great meets Bach</HEADLINE> <AUTHOR>Johann Nikolaus Forkel</AUTHOR> <PARA> One evening, just as he was getting his <INSTRUMENT>flute</INSTRUMENT> ready and his musicians were assembled, an officer brought him a list of the strangers who had arrived. </PARA> </ARTICLE>
一个图形用户端可能将上例格式化为:
注意到"flute"一词显示在段落内,因为它是行内元素INSTRUMENT的内容。
不过,这些文本的格式化还不是你所期望的。例如,标题的字体尺寸应该比文本的其余部分要大,而你可能想将作者的名字以斜体表示等:
INSTRUMENT { display: inline } ARTICLE, HEADLINE, AUTHOR, PARA { display: block } HEADLINE { font-size: 1.3em } AUTHOR { font-style: italic } ARTICLE, HEADLINE, AUTHOR, PARA { margin: 0.5em }
一个图形用户端可能将上例格式化为:
要进一步地改进文档的呈现,可以在样式表中加入更多的规则。
本节描述了支持CSS的用户端如何工作的一个可能的模型。这只是一个概念模型,实际的应用可能有差别。
在该模型中,用户端按照如下步骤来处理一个源文件:
值的计算部分上依赖于目标媒介类型所适用的格式化算法。比方说,假定目标媒介是屏幕,则用户端应用可视化格式模型。如果目标媒介视打印纸,用户端应用页面模型。如果目标媒介视音频渲染设备(如语音合成器),用户端就应用语音渲染模型。
注意,在这一阶段,CSS用户端不会去改变文档树。特别地,由于有样式表而产生的内容不会反馈回文档语言处理器(以进行再分析等)。
第一步超出了本规范的讨论范围(可以参见[DOM])。
第二步到第五步在本规范中得到详细阐述。
第六步也超出了本规范的讨论范围。
对于所有的媒介而言,术语渲染区域定义了“格式化结构被加以渲染的空间”。渲染区域在空间的所有维上都是无限的,不过渲染通常在渲染区域的一个有限的区域中进行。该区域由用户端根据目标媒介而建立。例如在渲染到屏幕时,用户端通常指定一个最小的宽度并根据视点的尺寸选择一个初始的宽度。渲染到页面时,用户端通常会指定宽度和高度的限制。音频用户端会指定音频空间的限制,但没有时间方面的限制。
CSS2选择子和属性允许样式表引用文档或用户端中的如下部分:
CSS2和之前的CSS1类似,也基于一套设计原则:
向上和向下兼容。CSS2用户端可以理解CSS1样式表。CSS1用户端可以阅读CSS2样式,并忽略它们不理解的部分。同样的,不支持CSS的用户端也可以显示带由样式增强的文档。当然,CSS所带来的样式的改进将不被渲染,但是所有的内容将被呈现。
结构化文档的补充。样式表补充了结构化文档(如HTML及XML应用),为标记文本提供样式信息。样式表的改变很容易,而且其改变不影响标记(或者影响很小)。
与供应方、平台和设备无关。样式表使文档得以与供应方、平台和设备无关。样式表本身也是与供应方、平台无关的。不过CSS2允许你将样式表指定给一组设备(如打印机)。
可维护性。通过在文档中引用样式表,网管员可以简化站点维护并使整个站点的外观和感觉保持一致。例如,当公司的背景色改变后,只需要修改一个文件。
简单性。CSS2比CSS1复杂很多,但是它还是一个简单的样式语言,人们可以读也可以写。CSS属性保持了最大程度上的相互独立性,通常只有一种方法来达到特定的效果。
网络性能。CSS为如何呈现内容提供了紧凑的编码。和图形或语音文件相比(它们通常被作者用来达到一定的渲染效果),样式表通常是缩短了内容的长度。另外,和网络的连接次数减少也进一步提高了网络性能。
灵活性。可以由几种方法将CSS应用到内容上。关键的特性是可以层叠来自缺省(用户端)样式表、用户样式表、连接的样式表、文档头以及形成文档主体的元素的属性等各方的样式信息。
丰富性。提供给作者一套丰富的渲染效果,增加了作为呈现媒介的网络的丰富性。设计者一直在寻求和桌面印刷或幻灯片演示应用中相类似的功能。有些需要的渲染效果和设备无关性冲突,但是CSS2在实现设计者的要求方面已经走出了一大步。
可选的语言绑定。本规范中讨论的CSS属性为视觉和听觉呈现构成了一个一致的的格式化模型。该格式化模型可以通过CSS语言获得,但是和其它语言的绑定也是可能的。例如,JavaScript程序就可以动态地改变某一元素的'color'属性。
辅助特性。对于有残疾的用户,CSS有一些特性使得网络浏览更加方便:
注:要了解使用CSS和HTML设计可阅读文档的更多信息,请和[WAI-PAGEAUTH]联系。