webfont,也就是用在 web 上面的字体,最出名的莫过于 Google Fonts,在 HTML 里加几行代码就能用各类丰富的字体了,可是 Google 在国内呵呵了,因此今天当我想在工做室网站上应用 webfont 的时候,DIY 了一把,记录以下。css
2014 年的项目,最近才看到:https://google-webfonts-helpe... ,能够帮助打包 Google Fonts 的源文件到本地,本身 host。nginx
首当其冲的问题就是文件太大——一个英文字体接近 1 兆,对于只想用 26 个英文字母的状况,情何以堪啊。git
这里建议使用 FontForge,一款开源的字体编辑软件。打开一看果不其然,原来这是个孟加拉语的字体。因为我想只保留 Latin-1 编码集的字符,因此用了一下办法将多余编码集字符剔除:github
Element
-> Font Info...
,打开下图中的对话框;Unicode Ranges
;Clear
进行剔除;.sfd
;.sfd
文件,这时再进入上图中的对话框,才能看到删掉的字符集已经不见了;OS/2 -> Charsets
进入另外一个选项卡,再次手动选择您须要的字符集;.ttf
格式的字体备用:File
-> Generate Fonts...
,这里能够参照 Google Font Wiki 里的第 12 至第 14 步。剔除了多余的字符,字体文件直降至几十 KB,差很少了。web
在发现上述方法以前,我试了只将须要的字符拷贝出来,粘贴到一个空白的字体文件中。后来发现有诸多问题,好比字符间距不对、字符集不全(漏了 32 号的空格)等等,才逐渐找到了前述方法。api
看过 Google Font 使用时的部分源码(http://fonts.googleapis.com/c...),还觉得把 .ttf
文件转成 .woff2
格式的就够了呢:跨域
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('Open Sans'), local('OpenSans'), url(http://fonts.gstatic.com/s/opensans/v10/K88pR3goAWT7BTt32Z01m1tXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; }
为此我还找了半天 .ttf
如何转换为 .woff2
……原来,/css?family=xxx
这个 URL 是个动态资源,服务器会根据浏览器 User-Agent
字段值的不一样,而给出不一样的 CSS,不一样的浏览器可能就对应了不一样的字体格式文件。浏览器
我觉得是 Google 用的 Web Font Loader 能自动生成这些,因而又去各类找,后来发现 Web Font Loader 更可能是关注加载的平顺性等高级功能,虽支持自制第三方字体资源,但并无工具去生成。后来我就发现了:服务器
http://www.fontsquirrel.com/t...app
就是这个。把 .ttf
之类的字体文件上传上去,它会自动转换成各类浏览器须要的字体格式,而后生成 CSS 文件,最后打一个 zip 包直接下载。把 *-webfont.*
和 stylesheet.css
拷出来用,就全都搞定啦!
顺风顺水作完了本地测试,部署到公网服务器上,搭建 CDN,咦,字体不起做用了!打开浏览器控制台,看到了报错以下:
Font from origin 'http://cdn.decentfox.com' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://decentfox.com' is therefore not allowed access.
原来是字体跨域不能用。经查,只要字体文件的 HTTP 响应头中加上 Access-Control-Allow-Origin
,容许源站访问就行了。Nginx 配置以下:
location /static { alias /home/fantix/......../static; location ~* \.(eot|svg|ttf|woff|woff2)$ { add_header Access-Control-Allow-Origin *; } }
这里偷懒用了个 *
,谁都能用了。刷新 CDN,新加的 header 信息成功代理出去了,至此大功告成。
用 FontForge 修改字体、用 Font Squirrel 一站式处理,最后若是跨域记得加 Access-Control-Allow-Origin
。有机会应该再试一下用 Web Font Loader 来加载字体。