深度剖析浏览器字体渲染的秘密
说到web性能,前端工程师很自然地反应是yahoo的30条优化规则。这些规则可以将网页加载从原来的几秒甚至十几秒较少到3s甚至1s以内。当一个完整界面展现在用户眼前时,内容就通过不同的字体、图片以及多媒体传达给用户。使用户在1s内看到网页和使用户留在网页上几分钟甚至几十分钟同样重要。字体作为内容承载信息的重要部分,若使用不适当的字体或者字体由于渲染等缘故对用户不友好,则会(有可能)造成不必要的用户流失。本文介绍浏览器的字体渲染,希望还未接触字体渲染的同事能通过本文对字体渲染有所了解。
首先看下不同浏览器下的截图:
很明显地看出,Chrome35截图中的非横竖笔画较IE11和Firefox30截图中的有明显的锯齿。
理想的字体其边缘过渡平滑,而在屏幕上显示时,需要将字体栅格化(rasterization)为一个个像素点。采用黑白(blackandwhite)渲染无法体现字体的细节之处,会造成了边缘呈现锯齿状(jagged)的不平滑。为了解决这个问题,字体渲染引擎采用了以下方法进行平滑(Antialiasing):灰阶(grayscale)渲染、亚像素(subpixel)渲染。
渲染方法
灰阶渲染是一种通过控制字体轮廓上像素点的亮度达到字体原始形状的方法。
亚像素渲染利用了LCD屏(液晶屏)中每个像素是由R、G、B三个亚像素的颜色和亮度混合而成一个完整像素的颜色这一原理,将字体轮廓上的像素点由三个亚像素体现以达到原始形状的方法。与灰阶渲染相比,分辨率在垂直方向放大了三倍,因此渲染效果更好,但是所耗内存也更多。因此在手机屏上,为了减少CPU开销,并未采用该字体渲染方法,而是采用的grayscale渲染。
操作系统中的渲染API
操作系统OS提供了支持不同的字体渲染方法的API。在windows下是GDI(GraphicsDeviceInterface)和DirectWrite,OSX下是Quartz。
GDI分为GDIGrayscale和GDIClearType。前者为灰阶渲染API,后者是亚像素渲染API。由于GDIClearType并未对字体进行垂直方向的平滑,因此当字体较大时会出现边缘不平滑的情况。为了弥补GDIClearType的不足,MS实现了DirectWriteAPI,它在GDIClearType的基础上增加了垂直方向的平滑。
但是!字体渲染的API都是由浏览器厂商自己选择的!
使用同一颜色,感官上的颜色深浅为:黑白渲染amp;gt;grayscaleamp;gt;subpixel。
Chrome3536采用的是GDIClearType,因此在字体较大时边缘会出现毛刺,而FF30采用的DirectWrite则没有此类问题。如下图所示:
根据以上两图可以发现,Chrome的字体渲染效果没有Firefox的好。为缩小Chrome与FFIE的差异,一种方法是使用webkittextstroke:0。5px;如果使用1px的话就有点粗了。
虽然该hack使Chrome下字体的边缘有所光滑,但字体在webkit内核浏览器中看上去模糊了。
常用字体在浏览器中的渲染情况
从使用MicrosoftYahei,Tahoma和Arial字体可以看出,在Chrome35中,由于转换成GDIGrayscale渲染,49px的字比48px的边缘光滑很多。字体较大时,GDIGrayscale比GDIClearType具有更好的渲染效果。
在实际中会遇到在如TahomaArial字体下17px和18px的字重有明显差别。这个现象涉及到字体设计,简单地说就是在浏览器渲染字体之前,字体本身会调整字型和笔画所占像素。想了解更多细节,请参考acloserlookatTrueTypehinting。
启动Chrome中的DirectWrite
在chrome:flags下启用实验性DirectWrite字体渲染系统:enabledirectwrite会使48px以下的字体均为subpixel渲染。仅适用于测试环境!(需重启Chrome)
Chrome37beta将该特性移除实验特性,并将在Chrome37中实现在windows下使用DirectWriteAPI对字体渲染,相信在Chrome37中以上提到的浏览器字体渲染差异会得到解决。
字体格式在不同浏览器下的渲染
fontsmoothing:subpixelantialiasedantialiased;
对应为subpixel和grayscale。
已废止!
fontweight:bold;
Chrome35,IE78:与normal字体渲染一致(包括数字和字母);
IE9FF30:grayscale,部分简单中文字体保持原有渲染。
fontstyle:italic;
Chrome35,IE78:与normal字体渲染保持一致;
IE9FF30:subpixel渲染。
opacity:属性值amp;lt;1
Chrome35:subpixel渲染的字体降级为grayscale渲染;
IE9FF30:保持不变
transform2D
transform:rotate(n);
n90kdeg(k整数),保持未旋转的字体渲染;
others,subpixel渲染。Chrome35在48px为grayscale渲染。
transform:scale(x,y);与字体大小m有关。以simsun为例,具体如下:
Chrome35:
xymamp;lt;12,Chrome35subpixel渲染;
12amp;lt;xymamp;lt;48482304mamp;gt;2304grayscale渲染,12px24px存在一定范围的黑白渲染(tahoma是12px16px)。lt;!48482304gt;
FF30、IE9:
mmnamp;lt;99999801namp;gt;9801grayscale渲染。lt;!99999801gt;
transform:skew(n);
n90kdeg(k为整数),保持未倾斜的字体渲染;
others,subpixel渲染。Chrome35在49px为grayscale渲染,IE9,FF30在100px为grayscale渲染。
transform2Damp;amp;transition
运动中:以12px为例:在Chrome35和FF30下,运动中的字体均是grayscale渲染;
运动结束:Chrome35,FF30,IE9均为subpixel渲染。
从运动开始到运动结束产生了两次渲染变化(subpixel到grayscale,grayscale到subpixel)会出现闪现的现象。
Transform3D
当元素进入GPU中渲染时,在Chrome35中的字体为grayscale渲染,IE11和FF30保持subpixel渲染不变。若transform值函数(如translate3d(),scale(),rotate()等)中的参数为非整数,会导致字体模糊。在使用iScroll模拟滚动的项目中会出现字体模糊。以下是对该问题的一个还原:
webkittransform:translate3d(1。5px,1。5px,0);
webkittransform:translate3d(1px,1px,0);
Chrome36中使用transform不需要webkit前缀了!
为了防止以上模糊情况的出现,可以通过JS中的Math。round()Math。ceil()Math。floor()等函数使其为整数。
当加入perspective()值时,Firefox30渲染又有所不同。
transform:perspective(1px)translate3d(1。5px,1。5px,0);在FF30中作用的元素为grayscale渲染。
transform:perspective(1px)translate3d(1px,1px,0);在FF30中作用的元素为subpixel渲染
E11均为subpixel渲染。
此情况下运用opacityamp;lt;1的声明,IE10为grayscale。
Chrometransform:perspective()对文档后面元素的影响
Chrome35,当transform中声明有perspective()时,若文档后面声明transform的元素进入该声明作用的元素的layerborders的区域时,仍然会受到该声明的影响。声明作用元素的溢出部分同样会对后面元素造成影响。合成渲染层内部文字进入GPU渲染。
启动Showcompositedlayerborders,在Chrome中测试的结果截图为:
石碌碡由纯石头制作如今被淘汰消失在田地中相信说到石碌碡,这个名字的话应该有很多人都不知道。因为在现代这个时代中,它已经算是古老的东西,但是年纪大一点的人,你和它说原来在农村田地中碾麦子的石头,它们就会非常清楚,它在当……
波兰发现北欧海盗年轻勇士墓地据国外媒体报道,波兰科学院考古与人类学研究所考古学家近日在波兰华沙西北方150公里处的一片工地上发现了一个10世纪末期到11世纪初期的北欧海盗神秘墓地,并取得了大量重大研究发现……
泰国人妖最终的结局怎么样呢信奉佛教的他们会选择这我们知道,泰国属于热带地区,有着迷人的热带风光,尤其是泰国的佛教文化非常鲜艳璀璨,泰国的民族文化习俗也特别有吸引力。然而,泰国除了这些之外,还有一个特别吸引世界各地的人来旅游的……
湖南衡阳杀人案岁少年杀名亲人拿钱直奔网吧近年来未成年凶杀案频发,几乎已经不是一个个例了,所以未成年的刑事责任年龄也是逐年下降,可以说孩子如果缺乏正确的引导,他们的恶几乎是远超成年人的想象,比如2012年在湖南衡阳发生……
亚丁湾海贼王阿巴迪埃弗亚与政府合作劫持船只勒索钱其实你所看到的《海贼王》不仅仅只是在动漫中存在,其实现实中也是存在的,即使在如今这么一个和平安定的社会下依旧有着海盗在肆无忌惮的胡作非为。就像亚丁湾海贼王阿巴迪埃弗亚,是今天这……
湖南黑茶湖南黑茶介绍根据质量和加工工艺,我们可以将中国茶叶分为六种:绿茶,黄茶,黑茶,白茶,乌龙茶,红茶。黑茶技术在湖南黑茶加工中具有两个显着特点:初加工时用松木发酵和烘干。没有……
年中国互联网十大段子Managershare:搬个小板凳看。【段子1】民企腾讯有个老员工,每月收入买公司股票,坚持7年,生活俭朴,只有夏利一辆,全家租房,工资屌丝,目前资产过亿;……
你没有那么多观众不要活那么累Managershare:早该知道啦。以前的公司,员工非常多,并且工作中经常需要协调。有一个同事,我和她曾经有过矛盾,有过误会。其实我还蛮欣赏她的,她字非常漂亮,一笔一划……
怎样选择电子烟油口味和浓度aclasstaghrefwiki10336IHtPgQb5。html电子a烟油口味和浓度的种类有很多,那么应该如何选择呢?下面来简单介绍一下。操作方法01:hr大……
中职教师个人工作总结我叫张名,1998参加工作,是阜阳市工业经济学校的一名计算机专业课教师,2012年被聘为中级讲师。二十年的教学生涯,使我从一介白面书生变成了一个两鬓飞霜的中年教师。回望漫长的执……
关于优秀社会制度的分析研究【摘要】社会制度,简单来说,是指包括社会的经济、政治、法律、文化教育、军事等方面制度的用以维护反映一定的社会形态结构的各种制度的总称。既然社会制度是一样事物,那么其自然可以被进……
财政债务办主任述职报告2018年,本人在区委、区政府正确领导下,贯彻落实科学发展观,按照局党组安排切实履行工作职责,扎实推进财政预算改革,认真抓好政府债务风险防控工作,同时强化廉洁自律,不断加强自身……
如何自制康普茶在本文中:冲泡茶水加入培养物后续步骤参考康普茶是一种经过发酵工序制造出来的加糖的草药茶。普通的康普茶除了原有的甜味之外,还有一股微酸的、像醋一样的味道,而茶的口味的浓度可……
长寿果怎么吃了解禁忌很重要生活中很多人都喜欢吃长寿果,这种食物营养非常丰富,但并不是每个人都适合吃这种水果的,另外吃的过程中也要掌握正确方法,尤其是一些食用禁忌必须要明白。一、食用方法人参果……
这种石头保全家平安别扔掉在家居风水中,朱砂是非常重要的东西。它具有镇宅、辟邪、开运等作用。在生活中,哪些风水知识是我们必须应该知道的,知道一些风水知识有什么用呢?下面和小编一起通过风水分析看看你家的风……
如何保持年轻不经意的小习惯让你更年轻每个人都不想衰老,都希望能够永葆青春,永远都是那么的年轻,用于他们会用各种各样的护肤品来保养自己,其实这样不但没有效果,还会加速我们衰老的哦。我们的生活中有很多的小习惯就能够让……
生山楂片泡水的功效是什么在我们日常的生活中,山楂是非常有益身体健康的食物之一,山楂多数会被用来制成山楂片以供人们食用。大家都知道,山楂对于健胃消食、开胃健脾以及促进消化、增进食欲都能够起到很好的帮助作……
吃完饭就想吐的原因是什么吃饭是一种很好的享受,我们可以吃到自己喜欢吃的东西,这是一件很美好的事情,但是有的吃完饭就想吐,那么这大多数的原因是在于我们的胃的,有的人肠胃不好就会出现吃完饭就想吐的症状,那……
怀孕早期症状有哪些宝妈你有吗在同房后的1个月内,如果出现了常说的害喜情况,比如头晕嗜睡、乳房胀痛、尿频、尿急等。这些都是常见的怀孕早期症状,女性可以先在家通过早孕试纸、验孕棒验孕,或到医院进行检查,看自己……
厨房里藏了个补肾中药铺相信很多人都很讨厌厨房,因为厨房里的油烟味胡毁了你的肌肤,会让你变得衰老,但是你知道吗?厨房里是存在很多的宝贝的,这些宝贝会让你的健康加倍,这里就好像是一个中药铺,接下来就跟随……
便秘会引起结肠癌高发便秘诱发四种肠道病便秘会引起结肠癌高发便秘诱发四种肠道病便秘,患上这种症状的人很多,但是很多人都不重视,以为便秘无非是这段时间饮食上的原因造成的,多吃点蔬菜水果就会好。其实便秘没你想的那么……
小学生沉迷网络怎么办随着互联网的普及,现在,不仅仅是青少年流行上网,就连一些小学生也极为迷恋网络,家庭条件较好的,孩子七,八岁就学会了聊QQ以及一些简单的游戏,特别是假期,孩子们更是沉迷其中,一玩……
暴雪天气出行注意事项北方冬天经常会出现暴雪天气,应该提前做好相关防御工。尤其是对于个人来讲,还应该多了解一些自然灾害安全小知识,这样才会避免一些不必要的危险出现,暴雪天气出行注意事项有哪些?下面本……
儿童安全门夹实用吗孩子在成长过程中喜欢通过自己的亲身尝试去认识周围的事物,但是有些事是非常危险的,很容易给孩子造成伤害,所以家长在加强监管的同时也应当购买一些家居安全用品,把温馨的小家布置得更安……