[教程] 谈谈网页设计中的字体应用 (1) Font Set

[教程] 谈谈网页设计中的字体应用 (1) Font Set

Hihi, 大家好~

最近有不少人都提及了网页上该如何选择字体的问题。问题虽然小,但是却是前端开发中的基本,因为目前的网页,还是以文字信息为主,而字体,作为文字表现形式的最重要参数之一,自然有着相当重要的地位。可惜字体的重要性在很长时间内并没有得到足够的重视。很多人对字体的概念还是停留在 font-family: "宋体", Arial, Helvetica, serif 的阶段,却不明白为什么这样设置,这样设置是否合理等等。现在就让我说说字体的来龙去脉吧。

- font-family

大家知道CSS规则中定义字体是通过 font-family 这条规则来实现的。仔细翻翻CSS的文档,却没有发现任何能指定某一个特定字体的规则。

想想十年前,你可以随处看见类似于这样的代码:

 

<font face="Frankin Gothic Book">Lorem Ipsum</font>

 

几乎不会有人考虑到,Frankin Gothic Book是一个 Windows only 的字体。在一台Mac上根本看不到Frankin Gothic Book字体的效果,系统因为找不到这种字体,就改用Mac的默认字体显示了。于是,网页的风格就和原来完全不一样了,根本达不到Frankin Gothic Book的效果。于是W3C提出了font set 的概念——将一系列近似的字体按照优先级顺序组成一个列表;浏览器从列表头部开始匹配,知道找到第一个可用的字体,并使用该字体进行显示。

比如上面这个例子,我们可以创建这样的一个font set:

 

<span style='font-family: "Franklin Gothic Book","Lucida Grande"'>Lorem Ipsum</span>

 

我们来看看浏览器怎么来呈现这段文字吧:
  • Windows下:浏览器从列表的第一个字体开始搜索——系统中存在Frankin Gothic Book,使用Frankin Gothic Book字体显示。
  • Mac 下:浏览器从列表的第一个字体开始搜索——系统中不存在Frankin Gothic Book,搜索失败。继续搜索下一个字体——Lucida Grande。系统中存在Lucida Grande字体,终止搜索,并用Lucida Grande字体显示。

这样在Mac上,Mac就能以与Frankin Gothic Book类似的Lucida Grande字体显示这段文字。

 

但是可能存在一台电脑,上面既没有Frankin Gothic Book字体,也没有Lucida Grande字体,那么它仍然无法正确显示上面的这段文字。于是开发人员不得不在这个字体列表中不断增加字体以适应各种系统,导致这个font set失去原本的“组织近似字体”的作用。于是font set中引入了“通用字体族”,也就是我们经常看见的 serifsans-serif。我会在今后的文章中详细的介绍这两个,以及一些其他的通用字体族。在这里,我们可以简单的将它们理解为一种“在所有指定字体都失效的情况下,浏览器指定的一种最终的代用字体”。

比如我们在改进一下上面的那段示例文字:

 

<span style='font-family: "Franklin Gothic Book","Lucida Grande",sans-serif'>Lorem Ipsum</span>

 

我们再看看浏览器怎么来呈现这段改进后的文字吧:
  • Windows下:浏览器从列表的第一个字体开始搜索——系统中存在Frankin Gothic Book,使用Frankin Gothic Book字体显示。
  • Mac 下:浏览器从列表的第一个字体开始搜索——系统中不存在Frankin Gothic Book,搜索失败。继续搜索下一个字体——Lucida Grande。系统中存在Lucida Grande字体,终止搜索,并用Lucida Grande字体显示。
  • 某系统:浏览器从列表的第一个字体开始搜索——系统中不存在Frankin Gothic Book,搜索失败。继续搜索下一个字体——系统中也不存在Lucida Grande字体。继续搜索下一个字体——通用字体sans-serif。浏览器应用它的默认sans-serif字体"Arial"来显示这段文字。

 

请注意两点。首先,通用字体族具体对应哪个字体,是由浏览器决定的。上面例子中浏览器指定Arial为sans-serif字体,但完全有可能另一个浏览器指定Helvetica 为它的sans-serif字体。具体哪个字体被最终应用,是无法预期的。其次,通用字体族只是一种在font set中其他字体都无效时的代用方案。因此——设计者应该尽可能的给出齐全的font set,以尽可能的覆盖所有的系统,而不应该依赖于通用字体族

 

类似于以下的两种写法都是错误的

 

<span style="font-family:sans-serif">Lorem Ipsum</span>
<span style="font-family:sans-serif,Arial">Lorem Ipsum</span>

 

第一种写法的错误在于——它相当于根本没有指定字体,仍旧是交由浏览器选择字体。写了相当于没写。

第二种写法的错误在于顺序。因为通用字体族应该在一个font set中其它所有字体都失效时才起作用。因此,将指定字体放在通用字体之后,会造成制定字体尚未匹配时就使用了通用字体。所以,你应该务必使通用字体处在font set中的最后一位

 

另外,这里要说明两件事情。

首先,浏览器应用font set中哪个字体的规则虽然看上去很简单,但其实非常trickish。我会在以后的文章中做出具体的说明。

其次,虽然字体的CSS规则名称叫font-family, 但它的实质是一个font set,而不等是印刷意义上的font family。印刷上的font family 是指一系列相同字样的不同强度组合,比如Lucida Family(包括Lucida Sans, Lucida Sans Typewriter, Lucida Console, Lucida Grande等等)和Arial Family(Arial, Arial Black, Arial Rounded MT等等),但显然这些font family 都不适合直接拿来当作一个font set来使用。

 

今天就到这里了哟。下次我们来仔细谈谈通用字体族。

posted @ 2008-04-29 18:27 棕熊 阅读(3485) 评论(49)  编辑 收藏 所属分类: CSS标准,又见标准VI设计

  回复  引用  查看    
#1楼 2008-04-29 18:31 | Justin      

  回复  引用  查看    
#2楼 2008-04-29 19:02 | 侯垒      
以前确实没有注意过这个东西.
楼主太牛了.
学习了.
  回复  引用  查看    
#3楼 2008-04-29 19:13 | Clark Zheng      
楼主的确是大牛,以后多来串门!
  回复  引用  查看    
#4楼 2008-04-29 19:44 | 李战      
路过,学习!
  回复  引用  查看    
#5楼 2008-04-29 19:56 | good man      
路过,学习!
  回复  引用    
#6楼 2008-04-29 20:04 | NNOOOOOO [未注册用户]
这么平实的问题也大牛了,最近Cnblogs是怎么了。
  回复  引用  查看    
#7楼 2008-04-29 20:06 | airwolf2026      
继续来学习了.那么多的字体....
  回复  引用  查看    
#8楼 2008-04-29 20:09 | 李永京      
谢谢指点!这样的字体设置怎么样啊 FONT-FAMILY: 微软雅黑, Arial, Helvetica, sans-serif 是不是要在加上一个宋体?期待下一篇通用字体族的介绍。
  回复  引用  查看    
#9楼 [楼主]2008-04-29 20:13 | 棕熊      
@李永京
现在先建议你写成
font-famnily: Helvetica, "微软雅黑", Arial, "宋体", sans-serif;
至于具体为什么要这样写,这个我会在这个系列的第三篇中做一些说明。顺便打个小广告了 :)
  回复  引用  查看    
#10楼 2008-04-29 20:13 | 万一      
很好, 受教育了.
  回复  引用    
#11楼 2008-04-29 20:34 | testtest [未注册用户]
希望楼主不要辜负大牛的称呼
  回复  引用  查看    
#12楼 2008-04-29 20:45 | 非空      
牛牵到哪里都是牛
  回复  引用  查看    
#13楼 2008-04-29 20:47 | 生鱼片      
没这么深究过
  回复  引用  查看    
#14楼 2008-04-29 20:52 | 果果’er      
此博客皮相当之慢,滚屏很慢。太恼火了。
可以说是用户体验相当之差。
  回复  引用  查看    
#15楼 2008-04-29 22:57 | ppchen(陈荣林)      
学习了,博主研究深透啊
  回复  引用    
#16楼 2008-04-29 23:05 | 确实大牛 [未注册用户]
从速度上看来,楼主的确大牛。
  回复  引用  查看    
#17楼 2008-04-29 23:10 | 留恋星空      
还没过瘾了,期待下一篇的到来。
  回复  引用  查看    
#18楼 2008-04-30 00:16 | cipchk      
font-family:Verdana,Arial,"微软雅黑",SimSon,sans-serief;
  回复  引用  查看    
#19楼 [楼主]2008-04-30 00:22 | 棕熊      
@cipchk
在先导已经有verdana的时候,建议把arial 放在 微软雅黑 的后面
比较合理的写法是 font-family:Verdana,"微软雅黑",Arial,SimSon,sans-serief;
原因后面的文章里会一并说
  回复  引用  查看    
#20楼 2008-04-30 09:06 | 文's sky      
第二种写法的错误在于顺序。因为通用字体族应该在一个font set中其它所有字体都实效时才起作用。

=====
实效=>失效?

PS.感谢分享
  回复  引用    
#21楼 2008-04-30 09:12 | wuhouci [未注册用户]
最好能兼顾数字,字母,文字
  回复  引用  查看    
#22楼 2008-04-30 09:49 | 镜涛      
学习啦。牛人
  回复  引用  查看    
#23楼 [楼主]2008-04-30 10:03 | 棕熊      
@文's sky
恩,的确是bug
谢谢指出 :)

@wuhouci
第三篇中会具体讲这个 :)
  回复  引用  查看    
#24楼 2008-04-30 10:14 | 戏水      
微软雅黑在非vista的机器上显示很难看 不如宋体 。 我比较鄙视。
另外 棕熊哥哥的文章确实不错。主要是深入浅出,语法没有错误。
反观某些同学写blog 比较随性,虽然是中文 却读起来破费力气。
写给自己看的无可厚非,希望别人看到受益的,就是不负责任了。
期待更多好文。
  回复  引用  查看    
#25楼 2008-04-30 10:18 | 杨正祎(阿一)      
--引用--------------------------------------------------
NNOOOOOO: 这么平实的问题也大牛了,最近Cnblogs是怎么了。
--------------------------------------------------------

非也,其实字体这个很有搞头的。看上去小,里面东西可不少哦。是个很值得研究的面呢。(当然,也有可能你是大大大大大大牛吧。呵呵~~)
  回复  引用  查看    
#26楼 2008-04-30 10:20 | 杨正祎(阿一)      
@12312312443
又是这个鸟人,在我博客上也发垃圾啊广告.
  回复  引用  查看    
#27楼 [楼主]2008-04-30 10:44 | 棕熊      
@戏水
其实微软雅黑只有在vista上有
其他机器上如果有的话多数也是自己安装的。如果没有安装过的话,可能会因为其他字体设置不当而显示为比较难看的字体,所以我估计是这个问题,呵呵
其实微软雅黑和宋体最大的区别是在大字体上
小字体还是用宋体比较好
  回复  引用  查看    
#28楼 2008-04-30 10:47 | 杨正祎(阿一)      
俺讲一点,为啥有的字体用引号,有的不用呢?
其实很简单——如果字体中间有空格,就必须用引号括起来,例如——
font-family: "Franklin Gothic Book","Lucida Grande".
  回复  引用  查看    
#29楼 2008-04-30 10:58 | 任力      
学习了,多谢分享!:)
期待下一篇
  回复  引用  查看    
#30楼 [楼主]2008-04-30 11:08 | 棕熊      
@杨正祎(阿一)
阿一gg完全正解哦 :)
  回复  引用    
#31楼 2008-04-30 11:47 | asheng123 [未注册用户]
Lorem Ipsum是印刷排版业中常用到的一个测试用的虚构词组,起源于十六世纪,一位印刷工在活字盘上制作校样的时候随意地拼凑了这个词组。
PS:网页 加载 还是很慢 呵
  回复  引用  查看    
#32楼 [楼主]2008-04-30 12:08 | 棕熊      
@asheng123
呃……说Lorem Ipsum是个虚构词组这个也是一个误解
Lorem ipsum dolor sit amet 是古拉丁语,出自公元前45年哲学家西塞罗的论文,"De Finibus Bonorum et Malorum(善与恶的终极形式)" 的一段。这篇文章随着文艺复兴时期印刷术在欧洲的普及,一起广为流传,所以它是有意义的。
另外今天早上cnblogs似乎有段时间的确很慢,是不是正好在这个时候遇上了的关系?
  回复  引用  查看    
#33楼 2008-04-30 16:03 | Dflying Chen      
--引用--------------------------------------------------
棕熊: @asheng123
呃……说Lorem Ipsum是个虚构词组这个也是一个误解
Lorem ipsum dolor sit amet 是古拉丁语,出自公元前45年哲学家西塞罗的论文,&quot;De Finibus Bonorum et Malorum(善与恶的终极形式)&quot; 的一段。这篇文章随着文艺复兴时期印刷术在欧洲的普及,一起广为流传,所以它是有意义的。
另外今天早上cnblogs似乎有段时间的确很慢,是不是正好在这个时候遇上了的关系?
--------------------------------------------------------
太有情调了……
  回复  引用  查看    
#34楼 2008-04-30 21:42 | Zhuang miao      
我想说的是.....楼主可能的确是牛人!但是这篇文章就牛了?哎...cnblogs现在盲目崇拜之风很严重啊~是个快速成名的好地方~~ BY (坚决不匿名!)
  回复  引用  查看    
#35楼 [楼主]2008-04-30 22:25 | 棕熊      
@Dflying Chen
dflying gg 更有情调阿呵呵

  回复  引用    
#36楼 2008-05-01 09:29 | 一个农民 [未注册用户]
@楼主
真牛呀, 哈哈。我喜欢你这样的人,其实每个人在自己的领域能够做到极至,就能成为大牛。
我看到css有好几个字体,也确实楞了一下。不过就先抄下来再说了,想不到还有这么多学问。
继续关注楼主, 老赵身边皆高手。

  回复  引用  查看    
#37楼 2008-05-01 12:55 | 簡簡單單..      
谢谢分享! 请问有没有办法能正常显示所有字体?
假如: 某个客户端不存在指定字体, 此时就设法将字体下载到本地安装再显示..
不知是否可行?
关注..
  回复  引用  查看    
#38楼 [楼主]2008-05-01 21:50 | 棕熊      
@簡簡單單..
CSS2规范中有个叫@font-face的东东,就是用来做你所说的这件事情
比如有个字体叫 Some Font, 你只要这么写上一段

@font-face {
font-family: "Some Font";
src: url("/styles/fonts/somefont.ttf");
}

之后,你就可以在任何你想用Some Font的地方加一条

font-family: "Some Font",serif;

就可以了
可惜不是所有浏览器都支持
  回复  引用  查看    
#39楼 2008-05-02 17:08 | 簡簡單單..      
@棕熊
感谢回应! 请问目前有什么浏览器支持CSS2规范?
如果多个*.ttf字体文件@font-face应该如何指定?
继续关注..
  回复  引用  查看    
#40楼 [楼主]2008-05-03 00:12 | 棕熊      
@簡簡單單..
可以声明多个@font-face
支持CSS2的浏览器不少,甚至IE6对CSS2都有一定的支持,但支持程度都不一样,而且很多都有bug,酱紫
具体的话偶什么时候写个专题吧
  回复  引用  查看    
#41楼 2008-05-03 12:29 | 簡簡單單..      
非常期待..
  回复  引用  查看    
#42楼 2008-05-03 14:44 | 搞IT的狐狸      
我将 盲目的崇拜你
  回复  引用  查看    
#43楼 2008-05-03 15:09 | 白发先生      
不错,以前了解得不彻底
  回复  引用  查看    
#44楼 2008-05-04 11:39 | SZW      
记得xhtml里面有一条标准是标签属性内容要用""包围,我在博主代码中看到了这样的写法:style='font-family: "Franklin Gothic Book","Lucida Grande",sans-serif' 不知这种方式是被提倡的还是应该把"和'全部换一下更好呢?
  回复  引用  查看    
#45楼 [楼主]2008-05-05 17:10 | 棕熊      
@SZW
没有这样的规定哦
W3C原文是这么说的

Attribute values must always be quoted

只说要quoted,没有规定说一定要用双引号quote
  回复  引用  查看    
#46楼 2008-05-06 11:39 | SZW      
@棕熊
哦,这样的阿,关于那个xhtml的标准我以前是直接看了“百度百科”上面的一段介绍:http://baike.baidu.com/view/15906.htm(“4.所有的属性必须用引号""括起来”)那看来是他表达得有问题了,我还以为这个引号必须是""
  回复  引用  查看    
#47楼 2008-06-11 18:09 | 紫微星      
--引用--------------------------------------------------
棕熊: @SZW
没有这样的规定哦
W3C原文是这么说的

Attribute values must always be quoted

只说要quoted,没有规定说一定要用双引号quote
--------------------------------------------------------
看文章时也有这样的疑问,现在明白了
感谢博主的好文,期待更多的教材文章!
  回复  引用    
#48楼 2008-07-15 15:05 | suibian [未注册用户]
我强烈想知道楼主这个所谓的大牛是如何把页面搞的这么慢的 巨慢啊