Webfonts或本地加载的字体?
自从使用Cufon引起的麻烦之后,我冒险使用外部字体资源,但是到了最近,我一直在寻找加载字体的替代方法来查看是否有更好的方法。 更好的方法有一个出现在蓝色的方式。
这里有很多新的方法,看起来每种方法都有所不同。 我应该使用typekit吗? 或谷歌WebFonts (与JS或CSS)? 我应该继续使用本地加载字体(例如fontsquirrel.com生成的方法)?
我将列出下面看起来最受欢迎的方法,并进行一些testing,但是真的值得移植到webfont吗? 它似乎会带来更高的资源负载(HTTP请求),并具有较less的文件格式types(较less兼容性)等,但看起来像文件加载asynchronous和高效率在大多数情况下。
- 这只是一个情况和需要的问题吗? 如果是这样,他们是什么?
- 这些方法之间有很大的差异吗?
- 有没有更好的方法,我没有列出?
- 什么是专业/性能的performance? 看? 依赖呢? 兼容性?
我真的在这里寻找最佳实践,性能是一件大事,但可扩展性和易用性也是如此。 更不用说,外观和感觉。
Google CSS
- 只使用外部样式表
- 只使用最小的兼容文件types
- 可以使用
@import
或者<link>
或者把styleshee(@font-face
)的内容直接放到你自己的样式表中。
检测结果
78ms load of html 36ms load of css
Google JS方法
- 使用
webfont.js
加载styleshet - 只使用最小的兼容文件types
- 附加
:root
具有类的:root
元素 - 添加脚本头。
检测结果
171ms load of html 176ms load of js 32ms load of css
Typekit方法
- 附加
:root
具有类的:root
元素。 - 可以使用
*.js
代码片段或外部加载的文件*.js
文件 - 使用
data:font/opentype
而不是字体文件。 - 添加脚本头
- 添加embedded的CSS头
-
添加外部样式表头
您可以轻松地从typekit.com添加/删除/调整字体和目标select器
检测结果
169ms load of html 213ms load of js 31ms load of css 3ms load of data:font/
…和字体松鼠方法
@font-face{ font-weight:400; font-style:normal; font-family:open_sanslight; src:url(../font/opensans-light-webfont.eot); src:url(../font/opensans-light-webfont.eot?#iefix) format(embedded-opentype), url(../font/opensans-light-webfont.woff) format(woff), url(../font/opensans-light-webfont.ttf) format(truetype), url(../font/opensans-light-webfont.svg#open_sanslight) format(svg) }
…或与数据:字体方法…
@font-face { font-family: 'open_sanslight'; src: url('opensans-light-webfont-f.eot'); } @font-face { font-family: 'open_sanslight'; src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAF4sABMAAAAArXQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcZLn0KkqwK44Jq866WBSpzpsNY2IyGAhoJFBbYjuxmyns5sNa4NwldcJ7eh3Uy5gQkURIlqWzONe3HcLsDX1x/+jifDXvbzgTBjopZElndil3hJkERJkmRJkVRJk3TJkEzJkmzOc4HLXOEOF7nEX/*thisisnotafullencodingjustanexample*/bZwUnK4yS3JlTx2Sr4USKEUSbHVX9fcGNBs4fqgw+GoNHU7lKr36Eqn0lCWt6pHFpWaUlc6lS6loSxRlirLlP/uuU01dVfT7L6gPxyqraluCpgj3WtqeC1V4VBDW2N4K1r1esw/IupKp9L1FwlqnuIAAAB42j3NvQ7BUBjG8R5tTz/0u2UjNTTESYQbMGmXLiISbeI6zBYjbuWtye7CeMJxtuf3LP8ne1+IXbWa7G3TMXZru4qLZkJRW1O2wzi3I+Li2Gik5yXpYkNGXj70YU98YQLGHxwwXxIWwO8SNmAdJBzAXku4gFNI9AF38QMjTwZ9vN6yJzq9OoEB6I8VQzDYK0ZguFKMwWiumIDxTDEFk6liBqaF4gDMFFvKxAfOxFUGAAABUxSL9gAA) format('woff'), url('opensans-light-webfont-f.ttf') format('truetype'), url('opensans-light-webfont-f.svg#open_sanslight') format('svg'); font-weight: normal; font-style: normal; }
首先,我会澄清一下Google的产品。 它将实际加载您的浏览器可以处理的最小格式。 WOFF提供小文件大小,您的浏览器支持,所以这是你看到的。 WOFF也得到相当广泛的支持。 但是,在Opera中,例如,您可能会获得TrueType版本的字体。
我相信,文件大小的逻辑也是为什么字体松鼠尝试它们的顺序。 但是这主要是我的猜测。
如果你在一个每个请求和字节计数的环境中工作,你将不得不做一些分析,找出最适合你的用例。 人们只能浏览一个页面,而不再访问? 如果是这样,caching规则并不重要。 如果他们正在浏览或返回,Google可能会有比您的服务器更好的caching规则。 延迟是更大的问题还是带宽? 如果等待时间延长,则要求更less的请求,因此将其托pipe在本地,并尽可能多地合并文件。 如果带宽,select最小的代码和最小的字体格式。
现在,到CSS vs JS的考虑。 我们来看看下面的一段HTML:
<head> <script type="text/javascript" src="script1.js"></script> <link rel="stylesheet" type="text/css" href="style1.css" /> <style type="text/css"> @import url(style2.css); </style> <script type="text/javascript"> (function() { var wf = document.createElement('script'); wf.src = 'script2.js'; wf.type = 'text/javascript'; wf.async = 'true'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wf, s); })(); </script> </head>
在很多情况下, script1
, style1
和style2
会被阻塞。 这意味着浏览器无法继续显示文档,直到资源加载完毕(尽pipe现代浏览器对此有所赘述)。 这实际上是一件好事,特别是对于样式表。 它可以防止无格式内容的闪烁,并且还可以防止在应用样式时发生的巨大转变(并且移动内容真的很烦人)。
另一方面, script2
不会被阻塞。 它可以稍后加载,浏览器可以继续parsing并显示文档的其余部分。 所以这也可以是有益的。
具体谈论字体(甚至更具体地说,谷歌的产品),我可能坚持一个CSS方法(我喜欢@import
因为它保持与样式表的样式,但这可能只是我)。 脚本加载的JS文件( http://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js )大于@font-face
声明, 看起来像更多的工作。 我不相信加载实际的字体本身(WOFF或TTF)被阻止,所以它不应该耽搁太多的东西。 我个人不是CDN的忠实拥趸,但事实是他们真的很快。 谷歌的服务器将通过山体滑坡击败大多数共享的托pipe计划,而且由于他们的字体非常stream行,人们甚至可能已经caching了他们。
这就是我所拥有的一切。
我没有Typekit的经验,所以我把它放在了我的理论上。 如果有任何不准确的地方,请不要在浏览器之间为了参数而进行概括,请指出。
我想你已经在你的问题中解决了加载时间问题。 从我的angular度来看,还有几个来源应该被添加到列表中,还有一些其他的考虑因素应该被审查,以便全面了解这些选项。
其他一些有信誉的字体来源
cloud.typography
http://www.typography.com/cloud/
据我所知,这些字体是作为数据embedded到一个CSS文件中的:
@font-face{ font-family: "Font Name"; src: url(data:application/x-font-woff;base64,d09GRk9UVE8AACSCAA0AAAAARKwAAQAAAAAiVAAAAi4AAAadAAAAAAAAAABDRkYgAAAIyAAAFCgAABmIK5m+CkdERUYAABzwAAAAHQAAACAAXQAER1BPUwAAHRAAAAQlAAAYAq+OkMNHU1VC ... ); font-weight:400; font-style:normal; }
这是我的规格:
94ms load of css from their server 37ms load of css from our server (will vary based on your configuration) 195ms load of data:fonts from our server (will vary based on your configuration)
这是他们对部署的高级描述 。
Fonts.com
我没有使用这个服务,但他们是一个非常成熟的字体供应商,他们在网站上列出的信息是相当可观的。 我没有关于他们确切的方法的规格,但是这里是我所知道的:
- 一些世界上最知名的字体可用
- 一个非常大的字体库(超过20,000)
- 用于制作模型的桌面字体下载
- 用于在浏览器中testingWeb字体的自定义工具
- 精细的排版控制和子集
- 自托pipe选项
FontSpring
隶属于FontSquirrel。 字体可以在这里购买一个固定的价格。 随附CSS的字体文件将被传送,以便像FontSquirrel一样部署在您自己的服务器上。
扩展的规格
对于每种字体服务的总体利弊,这里有几个比较:
字体库大小
- Fonts.com:20,000+
- FontSpring :1000+
- FontSquirrel :300+
- Google :600+
- Typekit :900+
- Typography.com (cloud.typography.com):大约300+(35个家庭)
价钱
- Fonts.com:500,000页面浏览量,每月$ 20
- FontSpring :由字体(一次性购买字体)
- FontSquirrel :免费
- Google :免费
- Typekit :500,000页面浏览量,每月$ 4
- Typography.com:1,000,000页面浏览量为12.50美元/月
字体质量
网页字体的质量可能会有所不同。 这可以涵盖诸如字母本身或字符集的间距或大小的事物。 所有这些决定了字体所能提供的质量的总体印象。 虽然免费选项有一些不错的select,但也有一些字体质量不高,所以你要从这些来源仔细select。
- Fonts.com :高
- FontSpring :混合到高
- FontSquirrel :混合
- Google :混合
- Typekit :高
- Typography.com :非常高(我给了这个“非常高”的称号,因为Fonts.com,FontSpring和Typekit支持多种types的代工厂,这里只有来自H&FJ铸造厂的字体,这是世界上最好的)
字体质量II:版式
在桌面排版中有很多改进,很难在networking字体中获得。 其中一些服务提供了交付方式。
- Fonts.com:字距,字母间距,连字,替代字符,分数等
- FontSpring :无
- FontSquirrel :无
- Google :没有
- Typekit :无
- Typography.com :小型大写字母,连字,备用字符,备用数字样式,分数等
浏览器支持
这主要归结为每个服务支持的字体格式。 主要的是:
- EOT:用于Internet Explorer(IE 4+)
- TrueType和OpenType:传统格式(Safari 3.1+,FF 3.5+,Opera 10+)
- WOFF:网页字体的新标准(FF 3.6+,Chrome 5+)
- SVG:IOS <4.2
更多信息在@字体面部规则和有用的networking字体技巧
所有这些服务都支持主要的字体格式。 使用自托pipe字体,只要你使用正确的语法,你应该被覆盖。 下面是2011年FontSpring防弹语法的更新:
@font-face { font-family: 'MyWebFont'; src: url('webfont.eot'); /* IE9 Compat Modes */ src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('webfont.woff') format('woff'), /* Modern Browsers */ url('webfont.ttf') format('truetype'), /* Safari, Android, iOS */ url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */ }
性能I:下载
据我所知,使用上面的语法允许浏览器抓住他们的特定格式,所以没有浪费的下载字体格式不起作用。
像Fonts.com,Typekit或Typography.com这样的付费服务使用方法来检测正确的格式, 然后提供正确的字体格式,通常作为CSS文件中的base64数据。
从我所看到的,上面列出的方法的差异对于高速互联网用户而言是微不足道的(似乎<200ms差异),但对于较慢networking上的设备,特别是对于未caching的页面点击,可能是值得考虑的。
性能二:子集
如果您知道只能使用某些字符,则可以使用一个字符子集构build字体,从而减小下载的大小。
- Fonts.com :非常详细的控制
- FontSpring :可以通过FontSquirrel webfont生成器重新编译为子集
- FontSquirrel :可以通过webfont生成器重新编译为子集
- Google :非常详细的控制
- Typekit :“所有字符”或“默认”的有限选项
- Typography.com :非常详细的控制
performanceIII:交付
- Fonts.com :全球CDN 或您自己的服务器
- FontSpring :基于你的服务器
- FontSquirrel :基于你的服务器
- Google :全球超级CDN
- Typekit :全球CDN
- Typography.com :全球CDN(125,000台服务器)
语言支持
- Fonts.com:40种语言,包括亚洲和中东
- FontSpring :西方,取决于字体
- FontSquirrel :西方,取决于字体
- Google :西方,取决于字体
- Typekit :西方,取决于字体
- Typography.com :西方,取决于字体
testing和实现
- Fonts.com :非常容易,有广泛和可定制的工具
- FontSpring :技术(自己动手)
- FontSquirrel :技术(自己动手)
- Google :简单
- Typekit :简单
- Typography.com :简单的testing,一旦部署,更多的涉及到更改
那么,就像你以后一样
…在这里寻找最佳实践,性能是一件大事,但可扩展性和易用性也是如此。 更不用说,外观和感觉。
答案是(就像在网页devise中一样): 这取决于!
有一件事是肯定的,我不会推荐使用JS方法(在第二个例子中显示)。
就个人而言,我不喜欢根据Javascript使用表示性的东西和CSS样式,即使绝大多数用户已经启用它。 这是一个不混合的问题。
正如你在给出的例子中可以看到的那样,有一些FOUC(无格式内容的flas),因为在字体可用之前页面已经被浏览器渲染了。 一旦这个页面被重新绘制。 而网站越大,(性能)影响就越大!
所以我永远不会使用任何JS解决scheme的字体embedded。
现在让我们来看看纯粹的CSS方法。
由于相当长一段时间这里是关于“对比@import”的讨论。 我个人更喜欢避免使用@import,并且总是只使用<link>
。 但这主要是个人喜好的问题。 你永远不应该做的一件事是混合他们俩!
本地与CDN
当决定是否在本地托pipe你的字体文件或使用CDN时,那么它主要取决于不同字体的数量和你想embedded的相应字体。
为什么这很重要,还是起了一个作用?
从性能的angular度来看,我build议在你的(一个)样式表中包含字体Base64编码。 但只有.woff格式,几乎所有现代浏览器都使用这种格式,这对于大多数访问者来说意味着什么。 对于其他所有的用户来说,这些额外的请求都会生效
但是由于Base64编码引起的“开销”和字体文件的大小(即使是.woff格式),只有在不超过3或4种不同的字体的情况下,才能使用这种技术。 并且始终确保您的服务器传递(gzip)的(CSS)文件。
这样做的一大好处是你没有额外的字体文件请求。 在第一次加载页面(无论您的网站是哪个页面)之后,CSS文件被caching。 如果您使用HTML5应用程序caching(您当然会这样做),这也是一个优势。
除此之外,作者不应该在他的网站上使用超过3或4种不同的字体,我们来看看使用Google CDN的方法。
首先要注意的是,你可以(并且总是)将所有需要的字体包含在一个<link>
,如下所示:
<link href='http://fonts.googleapis.com/css?family=PT+Serif:400,700,400italic,700italic|PT+Sans:400,700,400italic,700italic|Montez' rel='stylesheet' type='text/css'>
这将导致以下回应:
@font-face { font-family: 'Montez'; font-style: normal; font-weight: 400; src: local('Montez'), local('Montez-Regular'), url(http://themes.googleusercontent.com/static/fonts/montez/v4/Zfcl-OLECD6-4EcdWMp-Tw.woff) format('woff'); } @font-face { font-family: 'PT Sans'; font-style: normal; font-weight: 400; src: local('PT Sans'), local('PTSans-Regular'), url(http://themes.googleusercontent.com/static/fonts/ptsans/v6/LKf8nhXsWg5ybwEGXk8UBQ.woff) format('woff'); } @font-face { font-family: 'PT Sans'; font-style: normal; font-weight: 700; src: local('PT Sans Bold'), local('PTSans-Bold'), url(http://themes.googleusercontent.com/static/fonts/ptsans/v6/0XxGQsSc1g4rdRdjJKZrNBsxEYwM7FgeyaSgU71cLG0.woff) format('woff'); } @font-face { font-family: 'PT Sans'; font-style: italic; font-weight: 400; src: local('PT Sans Italic'), local('PTSans-Italic'), url(http://themes.googleusercontent.com/static/fonts/ptsans/v6/PIPMHY90P7jtyjpXuZ2cLD8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); } @font-face { font-family: 'PT Sans'; font-style: italic; font-weight: 700; src: local('PT Sans Bold Italic'), local('PTSans-BoldItalic'), url(http://themes.googleusercontent.com/static/fonts/ptsans/v6/lILlYDvubYemzYzN7GbLkHhCUOGz7vYGh680lGh-uXM.woff) format('woff'); } @font-face { font-family: 'PT Serif'; font-style: normal; font-weight: 400; src: local('PT Serif'), local('PTSerif-Regular'), url(http://themes.googleusercontent.com/static/fonts/ptserif/v6/sDRi4fY9bOiJUbgq53yZCfesZW2xOQ-xsNqO47m55DA.woff) format('woff'); } @font-face { font-family: 'PT Serif'; font-style: normal; font-weight: 700; src: local('PT Serif Bold'), local('PTSerif-Bold'), url(http://themes.googleusercontent.com/static/fonts/ptserif/v6/QABk9IxT-LFTJ_dQzv7xpIbN6UDyHWBl620a-IRfuBk.woff) format('woff'); } @font-face { font-family: 'PT Serif'; font-style: italic; font-weight: 400; src: local('PT Serif Italic'), local('PTSerif-Italic'), url(http://themes.googleusercontent.com/static/fonts/ptserif/v6/03aPdn7fFF3H6ngCgAlQzBsxEYwM7FgeyaSgU71cLG0.woff) format('woff'); } @font-face { font-family: 'PT Serif'; font-style: italic; font-weight: 700; src: local('PT Serif Bold Italic'), local('PTSerif-BoldItalic'), url(http://themes.googleusercontent.com/static/fonts/ptserif/v6/Foydq9xJp--nfYIx2TBz9QFhaRv2pGgT5Kf0An0s4MM.woff) format('woff'); }
正如你所看到的,如果用户没有在本地安装一个或多个请求的字体,则有9种不同的字体文件,这意味着总共有10个(包括链接元素之一)请求。 而且这些请求会在您的站点的每个新页面请求中重复使用(尽pipe没有更多数据传输)! 此外,对<link>
请求的响应永远不会被caching。
build议:
毕竟我真的会build议将您的字体文件以.woff格式包含在您的样式表中编码!
看到这个不错的文章的例子和说明如何做到这一点!
我使用内联的css方法,因为额外请求的开销比bease64编码时增加的更多。 这也被css文件服务器的gizip压缩所抵消。
其他选项是使用asynchronous加载字体,但大多数情况下用户会看到加载后popup的字体。
不pipe使用什么方法,只要包含要使用的字符集就可以减小字体文件的大小。
我个人使用Google字体。 他们有各种各样的select,他们最近也通过转向Zopfli压缩来改善对字体的压缩 。 谷歌正在努力使networking更快,所以我想这部分的更多优化也将来自他们。
无论你select什么外包字体,你总是会因为获取字体的请求而降低速度。 从速度angular度来看,最好的事情是自己提供字体。 如果你不关心那些额外的毫秒,它需要从一个外包交货加载,你应该去,如果你认为使用它们的易用性值得毫秒。
我不知道Typekit和其他,但与谷歌字体,你可以select提供特定的子集和字符的范围,以加快交付更多。
select一个子集:
<link href="http://fonts.googleapis.com/css?family=Open+Sans&subset=latin" rel="stylesheet">
select一系列字符:
<!-- Only serve H,W,e,l,o,r and d --> <link href="http://fonts.googleapis.com/css?family=Open+Sans&text=HelloWorld" rel="stylesheet">
您可以使用dns-prefetch来进一步提高字体传输的速度。
我确实认为并希望谷歌尽其所能尽可能地加快字体传输速度。 加载它所需的毫秒数不会影响我的网站,所以我乐于使用它们。
长话短说:
如果毫秒的字体传输损害您的网站,例如通过使其负载超过推荐的1秒,我想你应该主持他们自己。
最好的select是使用ajax导入字体,就像这样:
<script> (function() { var font = document.createElement('link'); font.type = 'text/css'; font.rel = 'stylesheet'; font.href = '/url/to/font.css'; var s = document.getElementsByTagName('link')[0]; s.parentNode.insertBefore(font, s); })(); </script>
我在我的网页上做了这个,在Google Insightstesting中增加了9分。