CSS魔法堂:再次认识font和字体

一、前言                              

文字承载着站点内涵,而良好的字体、排版则为用户提供舒适的阅读体验。本文打算对字体稍微深入一下子网页字体的内容,若有纰漏请大家指正,谢谢!

二、字体分类                            

  1. 衬线体(Serif)

衬线是笔画末端的装饰部分,用于更清晰地标明笔触末端,提高辨识率从而提高阅读速度。另外衬线字体感觉会更正统。下图红色部分就是衬线。

网页中英文衬线字体有Times New RomanGeorgia(下图为12px的Times New Roman左 和 Georiga右)。

网页的中文衬线字体有宋体

  2. 无衬线体/非衬线体(Sans-serif)

网页中英文无衬线字体有Arial,Verdana,Tahoma,Helivetica,Calibri等.(下图由左至右依次为Arial,Verdana,Tahoma)

注意:10px~12px的衬线字体在屏幕下难以辨认,因此网页中常用无衬线字体而非衬线字体。原因请看解析度说明(下图为10px的Verdana和Times New Roman对比)

  3. 等宽体(Monospace)

  等宽字体仅针对西文字体。由于英文字母的宽度各不相同,导致编程时代码排版很难看。在DOS命令中,看到的均是等宽字体。
  编程对等宽字体的要求:
    1. 所有字体等宽
    2. 字体简洁、清晰和规范
    3. 支持ASCII码为128以上的扩展字符集(如GBK,gb2312和unicode等)
    4. 空白字符(ASCII:0x20)与其他字符等宽
    5. 1,I和i能容易地区分
    6. 0,o和O能容易地区分
    7. 双引号、单引号前后部分易于区分,最好是镜像对称
    8. 标点符号外形清晰,尤其是大括号、圆括号和方括号
    宽字体有CourierCourier New

  4. 手写体/书法体(Calligraphy)

  5. 符号体(Symbol)

Windows中最著名符号就是Webdings。

三、再识font-family                      

通过CSS样式属性font-family我们可以按需设置网页中文字采用的字体库系列,如

font-family: "Microsoft YaHei", sans-serif;

但在没有深入理解字体库的应用规则和设置方式之前,可能会遇到以下问题:

<!-- 在IE下浏览 -->
<p class="b1">微软雅黑</p>
<p class="b2">Simsun</p>

<style type="text/css">
  .b1{
    font-family: "Microsoft YaHei", arial, sans-serif;
  }
  .b2{
    font-family: arial, sans-serif, "Microsoft YaHei";
  }
</style>

类为b2的P元素虽然也设置了使用微软雅黑,但渲染结果为宋体,这是为什么呢?下面我们一起探讨一下!

  1. 认识font-family样式属性值

属性值通过逗号分隔 , 多个字体名称,当浏览器在解析文字时会从左往右依次搜索字体库,当搜索成功则采用该字体库渲染该文字,否则继续往右搜索。若均搜索失败则使用浏览器默认的字体库解析渲染文字。

字体名称分为字体族名称(family-name)类族名称(generic-family)

字体族名称(family-name):是具体的字体名称, 如"times","courier","arial"

类族名称(generic-family):是字体类型名称而具体的字体则由浏览器决定, 如"serif","sans-serif","cursive","fantasy","monospace"

注意:

1. font-family中设置的字体不会被浏览器自动下载, 字体是否可用则完全依靠客户端是否已安装该字体库而已.

2. 属性值必须以类族名称(generic-family)结尾确保字体会以正确的形式解析渲染.

  2. 浏览器的默认字体

类族名称(generic-family)的具体字体库是由浏览器决定的,众所周知Windows下的中文版IE、Chrome、FireFox的默认简体中文字体均是中易宋体。

IE:

Chrome:

因此类族名称为serif,sans-serif,monospace均使用中易宋体字体库(当然用户可以自定义其他字体),也就是说若网页中没有设置font-family样式属性或没有适合的中文字体库时则使用宋体字体库来解析渲染所有英文、中文和标点。

但英文和半角标点使用宋体显示确实难看,因此建议至少设置一下英文字体:

html{
  font-family: Arial, Tahoma, Sans-serif;
}

Mac OS X下浏览器的默认字体是文华黑体。(西文和数字的显示效果 与中易宋体不相伯仲)

Android下浏览器的默认字体是Droid Sans Fallback(效果和微软雅黑类似)。

GNU/Linux则由于发行版众多,浏览器的默认字体不尽相同,一般为以下三种:文泉驿点阵宋体、文泉驿正黑和文泉驿微米黑(Droid Sans Fallback衍生而来)。

3. 为何要以类族名称结尾?

类族名称(generic-family)后的字体族名称(family-name)不会生效,如:A是 font-family:arial,sans-serif,"宋体" ,B是 font-family:arial,"宋体",sans-serif 而浏览器默认字体为"微软雅黑",那么将A通过微软雅黑显示中文,而B则用宋体显示中文.这是因为搜索到sans-serif就已经在浏览器默认字体库中找到字体了,因此不会搜索宋体字库。

  4. 中文字体名称的3种表示方式

  1). 中文表示方式

font-family: "微软雅黑", "黑体", "宋体";

  2). 英文表示方式

font-family: "Microsoft YaHei", SimHei, SimSun;

3). unicode码表示方式

font-family:"\5FAE\8F6F\96C5\9ED1", "\9ED1\4F53", "\5B8B\4F53";

font-family: "微软雅黑", "黑体", "宋体";

注意:由于采用中文表示方式会导致IE9下通过行距实现垂直居中的失效(还有其他兼容性问题),因此建议使用英文或unicode表示方式。

  5. 到底如何设置font-family才能实现恰当地兼容呢?

在处理兼容性问题之前我们先要了解各平台应该以哪个字体为最佳设置,并了解回退方案(就是所谓的fallback)

     Windows

Windows XP SP2 开始引入新字体——微软雅黑(由正常的微软雅黑和加粗的微软雅黑组成,字体库文件分别为msyh.ttf和msyhbd.ttf)。

微软雅黑属于无衬线字体,具有以下优点:

1. 作为矢量字体库,而不像中易宋体那样是非黑即白的点阵字体库。矢量字体可以无限地平滑缩放,因此大字号的效果比中易宋体好很多;

2. 数字、西文的显示效果比中易宋体好很多;

3. 支持Windows XP SP2引入的ClearType技术,当开启ClearType技术后应用微软雅黑的字体会变得更清晰、犀利;

4. 由于微软雅黑包含粗体版本,因此字重为bold时效果比中易宋体的伪粗效果要好。

缺点:

1. 由于是矢量字体库,在显示小字号(小于12px)的中文时无法通过字体引擎自动完美地处理,设计师要通过Hinting(字形微调)为每个字号的字体嵌入提示信息,这些提示信息包括不影响字体识别的前提下去掉部分笔画,而字体引擎会根据提示信息解析渲染字体。但最终效果也是不理想;

2. 在ClearType关闭的情况下,应用微软雅黑的字体会发虚。

 下图为IE11下的测试结果:

     Mac OS X

Mac OS X 10.6引入冬青黑体简体中文(Hiragino Sans GB),效果要比原来的华文黑体(重组后称为“黑体-简”。由正常版的华文细黑STXihei和加粗版的华文黑体STHeiti组成)要好。

     GNU/Linux

Linux下目前较好的中文字体为文泉驿微米黑。

现在我们已经了解各平台目前较理想的字体,那么下面介绍3种font-family的思路吧!

  6. 3种设置font-family的思路!

      a). 无为而治

就是设置好西文字体后,让浏览器/用户自行决定中文字体。

font-family: ..., "Hiragino Sans GB", sans-serif;

注意:

1. 建议尽量让Mac OS X使用冬青黑体;

2. 正文使用中易宋体或微软黑体实际效果则是见仁见智,但大字号的文字(如标题)则建议固定为微软雅黑。

      b). 严格管控

尽量兼容各平台,并让各平台使用最适合的字体。

font-family: ..., "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;

     注意:

     1. 微软雅黑必须位于冬青黑体之前,这是因为冬青黑体在Windows下的效果很差,而微软雅黑在Mac OS X下还可以接受。(Mac OS X下安装了Office则会包含微软雅黑字体的!)

      c). 因地制宜

由于无法控制客户端到底安装了哪些字体,若想以最简并最精准的方式设置font-family则需要结合UA来判断当前的浏览器和OS平台,进而动态设置font-family属性值。

四、字体样式                          

常见的字体样式分为

正常(Normal)

粗体(Bold):会让字体颜色更深、更粗。

斜体(Italic):用于在当前段落中强调某段文字。

不同的字体样式意味着不同版本的字体库。如微软雅黑包含正常和粗体两个版本的字体库,分别是msyh.ttf和msyhbd.ttf。而中易宋体则只有正常版本,因此就只有一个版本的字体库了。

虽然中易宋体仅含一个正常版本的字体库,但毫不影响以粗体和斜体的样式来显示,这时则称为伪粗和伪斜。

  伪粗(poor man‘s bold):是通过对字体glyph路径做一定的变换而成。

  伪斜(pool man‘s italic):是通过对字体进行矩阵做一定的变还而成。

  CSS设置斜体

CSS中通过font-style来设置斜体

font-style: normal; /* 默认样式 */
font-style: italic; /* 斜体 */
font-style: oblique; /* 倾斜的字体 */

对于没有斜体版本的字体而言,属性值为 italic 和 oblique 均为伪斜;对于存在斜体版本的字体而言, italic 则会使用斜体版本的字体,而 oblique 则为伪斜。

  CSS设置粗体

   CSS中通过font-weight来设置粗体

font-weight: normal; /* 默认样式 */
font-weight: bold; /* 粗体 */
font-weight: bolder; /* 粗体 */
font-weight: lighter; /* 细体 */
font-weight: 100; /* 字重代号 */
font-weight: 200; /* 字重代号 */
font-weight: 300; /* 字重代号 */
font-weight: 400; /* 字重代号,相当于normal */
font-weight: 500; /* 字重代号 */
font-weight: 600; /* 字重代号 */
font-weight: 700; /* 字重代号,相当于bold */
font-weight: 800; /* 字重代号 */
font-weight: 900; /* 字重代号 */

100~900为字重代号,字体库会针对不同的字重代号提供不同等级的粗细程度的设计。如Zurich字体所包含的Zurich Light对应100~300三个代号,Zurich Regular对应400,Zurich Medium对应500,Zurich Bold对应600~700,Zurich Black对应800,Zurich UltraBlack对应900。

对于没有粗体版本的字体而言,则采用伪粗;对于存在粗体版本的字体而言,则使用粗体版本的字体。

五、字号单位                           

网页中一般使用11pt/12px的字号,正文则采用11.5pt/14px的字号。

1. 点(point/pt)

 72 pt = 1 inch // 1英寸是72个点
 1 pica = 12 pt // 1皮卡是12个点

  2. 像素(pixel/px)

像素是屏幕上最小的图像单元,通俗上说就是屏幕上的一个点。不会根据父元素的字号自动缩放。

  3. 相对于小写字母x的高度(x-height/ex)

   1ex = 小写字母x的高度。也是基线(baseline)与中位线(median)的垂直距离。

  4. 相对于父元素字体大小(em)

   1em = 字体的大小的100%。会根据父元素的字号自动缩放。

浏览器默认的字号为16px,若没有父元素没有设置字号则使用浏览器默认字号,则1em = 16px, 0.75em = 12px, 0.625em = 10px。

通过将body的字号这是为 font-size: 62.5% ,那么此时子元素1em = 10px, 1.2em = 12px了。

注意:采用em作单位,要小心重复运算的陷阱!

p{
  font-size: 1.2em;
}
.test{
  font-size: 1.2em;
}
<p class="test">Test的字号为1.44em * 16px = 23px</p>

  5. 相对于根元素html的字体大小(rem)

  CSS3新增的相对单位,IE9开始支持。设置rem的元素字号是相对于`<html>根元素`的字号而定,而不是父元素的字号而定。

p {
  font-size: 14px; /* 对于lteIE8则设置固定的字号 */
  font-size: .875rem; /* 对于lgeIE9则设置相对于html元素的字号 */
}

单位转换工具:http://pxtoem.com/

六、间距                            

  1. 行(间)距(Leading/Line-height)

  行距就是相邻行之间基线的距离。一般以em作为单位,也就是根据字体大小来设置行距。W3C建议浏览器的默认行距为1.0em~1.2em。若行距过小则会造成阅读时容易“串行”。经验值行距为1.5em最为适合。

  基线(baseline)是大部分字母所“坐”的,字体的下降部(descender)之上的直线。大部分字体(全部大写字母和部分小写字母)总是紧贴基线,并且位于基线之上。中文与英文的大写字母情况一样。

  

通过CSS的 line-height 样式属性设置。

  2. 字间距(Tracking/Letter-spacing)

  字母之间的距离。通过CSS的 letter-spacing 样式属性来设置。

七、分辨率与解析度                       

我们常说的分辨率其实是分辨率的一种,全称应该叫做显示分辨率(或屏幕分辨率)。其实还有其他分辨率的分类,如图像分辨率(就是解析度)、位分辨率(就是颜色位深)和设备分辨率(或输出分辨率,就是DPI)等等。

  1. 显示分辨率(屏幕分辨率)

  表示屏幕图像的精密度,可视区域尺寸相同的前提下,分辨率越高图像越清晰。由于同一尺寸的液晶显示器的点距固定,也就是说物理发光点数目固定,因此分辨率调整至于最佳屏幕分辨率(最大分辨率)相同时,显示效果最佳。

液晶显示器的最大分辨率就是 水平发光点数目*垂直发光点数目

  2. 图像分辨率(解析度)

  表示单位英寸中包含的像素点数量(Pixel Per Inch)。指图像中存储的信息量,除了PPI还有PPC(每厘米的像素数量)来衡量。图像分辨率决定图像输出的质量,图像分辨率、位分辨率和图像尺寸一起决定文件大小。若位分辨率为32位,图像尺寸不变,而图像分辨率增加1倍,则文件大小将增加3倍。

  数值越大表示颗粒越细,图像越细腻、清晰。不同的介质解析度不尽相同。

介质           解析度
照片           240dpi~300dpi
杂志           133dpi~150dpi
精美的书      175dpi~200dpi
高质量的书      350dpi~400dpi
屏幕          72pp

由于屏幕的解析度比书籍、图片的低,因此物理大小相同的字体书上的会比屏幕上的清晰很多,也是因为这样物理大小相同的字体,书籍上可以使用衬底字体,而屏幕上则需要无衬底字代替。

  3. 设备分辨率/输出分辨率

表示单位英寸中包含的点数量(Dots Per Inch)。作用与图像分辨率是一样的。只不过是屏幕使用PPI作单位,而打印机、扫描仪等则采用DPI作单位而已。

  4. 位分辨率

  又称为位深,用于衡量每个像素存储信息的位数,决定像素可标记的色彩等级上限。常见的有8、16、24和32位。若一幅8bit位深的图像,那么每个像素能够表现的色彩等级是256级。

八、重温font-variant和text-transform            

 font-variant

font-variant: normal; /* 正常字体 */
font-variant: small-caps; /* 小型的大写字母字体 */

  text-transform

text-transform: none; /* 无转换发生 */
text-transform: capitalize; /* 将每个单词的首字母换成大写 */
text-transform: uppercase; /* 换成大写 */
text-transform: lowercase; /* 换成小 */

九、了解ClearType                        

Windows/Mac OS提供的针对LCD液晶荧幕的字体平滑工具。利用LCD色条排列的特性。
  WindowsXP开始引入ClearType,但默认是关闭的。Windows Vista则默认开启。

  原理

  将R、G、B各个次像素发光并进行色调微调,从而达到实际分辨率以上(水平方向分辨率的3倍)的纤细文字的显示效果。
  LCD规定屏幕分辨率与物理发光点(最大分辨率)相同时,显示效果最佳。
  而LCD的每个物理发光点实际上是由RGB三个栅条水平排列而成。在ClearType前,发光点与RGB栅条的关系是固定的,也就是发光点是独立的;是ClearType则是任意连续的RGB栅条则可组成一个发光点,也就是发光点是相交的并且是动态的。

十、总结                              

若有纰漏请大家指正,谢谢!

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4310533.html  ^_^肥仔John

十一、参考                            

http://design.yesky.com/273/8841773.shtml
http://baike.baidu.com/link?url=OcfVwoAY66-PChDZmbBqEsUuC-h3lEa817IaSOPaVrOEB5c0e5uZlTKizdY8PrbP-JGQbKbwA-mYHj4cf4qHyq
http://www.cnblogs.com/leejersey/p/3662612.html
http://www.divcss5.com/rumen/r295.shtml
http://www.divcss5.com/css-hack/c344.shtml
http://www.zhangxinxu.com/wordpress/2010/06/%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B9%8B%E6%B5%8F%E8%A7%88%E5%99%A8%E9%BB%98%E8%AE%A4%E5%AD%97%E4%BD%93%E4%B8%8Ecss%E5%AD%97%E4%BD%93/
http://www.divcss5.com/rumen/r75.shtml
http://www.zhihu.com/question/19911793

时间: 2024-11-05 13:48:23

CSS魔法堂:再次认识font和字体的相关文章

CSS魔法堂:Reset CSS

下列样式规则可用于最小化各浏览器标签样式的不一致性.注意:实际使用时应该对其进行适当的调整,以适应项目要求. /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, a

CSS魔法堂:你真的理解z-index吗?

一.前言 假如只是开发简单的弹窗效果,懂得通过z-index来调整元素间的层叠关系就够了.但要将多个弹窗间层叠关系给处理好,那么充分理解z-index背后的原理及兼容性问题就是必要的知识储备了.本文作为对W3C Recommendation-Layered presentation学习后整理的笔记,以便日后查阅. 由于将英文名词翻译为中文名词容易产生歧义(如Normal flow被翻译为文档流),因此本文将直接采用原英文名词,而涉及到的英文名词解释如下: non-positioned eleme

CSS魔法堂:Position定位详解

一.Position各属性值详解   1.  static :默认值,元素将按照正常文档流规则排列.   2.  relative :相对定位,元素仍然处于正常文档流当中,但可以通过left.top.right和bottom的CSS规则来改变元素的位置. 注意点:[a]. 元素原来位置将保留,不被其他元素所占据; [b]. 当使用left,top改变元素位置时,元素将以原来位置的border外边框的左上角作为参考点 ; [c]. 当使用right.top时改变元素位置时,元素将以原来位置的bor

CSS魔法堂:盒子模型简介

一.W3C标准的盒子模型   二.IE盒子模型 三.两种模型的区别 W3C标准盒子模型: 外盒模型 元素空间宽度 = content width + padding + border + margin的宽度 元素空间高度 = content width + padding + border + margin的高度 内盒模型 元素宽度 = content height + padding + border的宽度 元素高度 = content height + padding + border的高度

***CSS魔法堂:选择器及其优先级

一.前言     首先看看一道阿里这期网申的题目吧! 1.找出下面优先级相同的选择器 A. img.thumb:after B.[data-job="frontend"]::first-letter C. #main::before   D. [type="checkbox"]:checked E. ul#shop-list 二.回顾选择器类型           html片段 <body> <div id="content"&

JS魔法堂:浏览器模式和文档模式怎么玩?

一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过“浏览器模式”和“文档模式”(IE11开始改为“浏览器模式”改成更贴切的“用户代理字符串”)品味一番,它的出现极大地方便了苦逼的前端攻城狮们适配各版本的IE,但jser们也不能完全信任它,因为它只是提供尽可能的文档模式模拟而已. 本篇大部分内容来源于官方解说:http://msdn.microsoft.com/library/cc288325(v=vs.85).aspx,并尽量融入个人平常工作中踩过的坑加以

JS魔法堂:LINK元素深入详解

一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css"> 来引入外部层叠式样式文件,但LINK元素各属性的具体含义.资源加载行为等方面却了解不多,本文打算稍微深入一下. 由于内容较多,特设目录一坨: 二.到底有没有结束标签? 三.普通属性介绍 四.属性disabled详解 1. Attribute和Property的disabled  2. disab

JS魔法堂:追忆那些原始的选择器

一.前言                                                                                                    首先这里说的原始选择器是指除 querySelector . querySelectorAll 外的其他选择器.从前我只使用 getElementById 获取元素并没有觉得有什么问题,但随着参与项目的前端规模逐步扩大,踩的坑就越来越多,于是将踩过的和学习过的经验教训记录在这里,供以后好查阅

JS魔法堂:属性、特性,傻傻分不清楚

一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; console.log(el.getAttribute('hello')); // IE67下输出test,其他浏览器输出null “搞毛啊?”,苦逼的Jser对着浏览器大呼一声.然后就用下面蹩脚的方式草草处理掉了. function getAttr(el, prop){ return el[prop] || el