聊一聊“@font-face”

在@font-face处理兼容中出现了一个#iefix这个东东?到底是神马东西呢?

案例:

首先先了解关于@font-face的基本知识

1、@font-face 与 EOT 格式

之所以把它们放到一起是因为首个实现 @font-face 和 EOT 的是同一家公司 - 微软。早在九十年代 CSS 就有了自定义字体的语法,IE4是首个实现此语法的浏览器,没错,就是IE。不过,字体格式只能是微软自己开发的 EOT(Embedded Open Type) 格式。EOT 允许字体的作者保护字体不被非法复制,微软不允许其他浏览器厂商使用该格式,因此它只能在 IE 下使用。

这对当时来说太超前了。还记得在 windows XP 下看使用了『微软雅黑』的网页吗?当时的系统用一种简单的灰阶反锯齿技术,对于系统的字体这足够了,但对于其他字体,由于缺少人工的优化,字体会变得很虚。因此,本来想改进网页的排版效果,结果却使文字都无法阅读。

于是,CSS2.1 中彻底去掉了 @font-face 语法也不足为奇了。

2、Safari 的一小步,浏览器的一大步

大约十年后,在2008年,Safari 3.1 重新支持了 @font-face , 并且可以使用最普遍的字体格式 ttf 以及 otf。其实这得益于液晶显示器(LCD)的普及,LCD 提供了更高的分辨率以及通过亚像素渲染(subpixel rending)的反锯齿(anti-aliasing)技术。这样,即使字体很小,也能看得很清楚。

微软称这种技术为 ClearType。在 Mac OS X 平台上 subpixel rending 是默认开启的,但在 windows 平台上只有 windows vista 以及之后的版本才会默认开启。因此回到上面的问题,由于『微软雅黑』不是 XP 的系统字体,XP 默认没有开启 ClearType,因此当在装有『微软雅黑』字体的 XP 上访问将字体设为『微软雅黑』的网页时,看起来会很模糊。不过,手动开启 ClearType 后便可以解决此问题。

一年后,Firefox Opera Chrome 等主流浏览器都开始支持 @font-face。

又过了一年,2010年,几乎所有主流浏览器都支持了 @font-face , 甚至是 IE,从 IE9 开始微软摒弃了自己的 EOT 字体开始支持 ttf otf 等主流字体格式。在移动端,iOS 从4.2开始也支持这些字体格式。

自此,@font-face 死而复生。 web字体时代来临。

3、truetype woff 以及 svg

上面 CSS 声明中使用了 4 种字体格式,其中 EOT 格式前面已经提过,它是 IE 的专有格式,下面看一下余下的 3 种格式。

先说 svg 格式,iOS 在 4.2 之前仅支持 svg 格式的字体,由于 svg 格式不能压缩,通常会比较大。鉴于 iOS 老版本渐渐被淘汰,因此可以考虑去掉此格式。

truetype(.ttf) 是目前最普遍的字体格式,早在八十年代就被苹果开发出来,当时它作为一种可伸缩的字体格式用来代替位图字体在屏幕上显示,不久微软也接受了这个格式,由于该格式可以针对特定大小做精准的微调,渐渐地成为系统字体的标准。

说到 truetype 不得不提一下 opentype,它在 CSS 中的出镜率也很高。opentype 可以看作是 truetype 的升级版,由微软和 Adobe 联合开发。opentype 采用不同于 truetype 的算法存储路径,单从这点来讲 opentype 有两个主要优势:1.平均比 truetype 小 20% 到 50%。2.需要较少的用于反锯齿的微调信息(详见下面的参考链接)。除此之外,opentype 除基本字符集外还提供了别的扩展,比如小号大写字符,老式的数字,以及其他一些图形。既然 opentype 有这么多优点,那为什么我们上面的代码中没用使用 opentype 呢?首先,微软建议如果只需要在屏幕上显示文字推荐用 truetype 格式。如果需要更大的字符集和更好的打印效果才推荐 opentype 。其次,支持 opentype 的浏览器都支持 truetype。

最后,也是最新出现的是 woff (web open type format)。woff 属于 W3C 的推荐标准。由两名字体设计师和两位 Mozilla 的开发者设计。最早在 firefox 3.6 上实现。事实上,woff 并不是一种新的字体格式,它只是包装 truetype 和 opentype 并进行压缩,压缩后可以使 truetype 减少 40% 。除此之外,它还允许添加元信息,比如字体作者的许可证,不过浏览器并不对这些许可做任何验证。

4、#iefix有何作用?

IE9 之前的版本没有按照标准解析字体声明,当 src 属性包含多个 url 时,它无法正确的解析而返回 404 错误,而其他浏览器会自动采用自己适用的 url。因此把仅 IE9 之前支持的 EOT 格式放在第一位,然后在 url 后加上 ?,这样 IE9 之前的版本会把问号之后的内容当作 url 的参数。至于 #iefix 的作用,一是起到了注释的作用,二是可以将 url 参数变为锚点,减少发送给服务器的字符。

5、为何有两个src?

绝大多数情况下,第一个 src 是可以去掉的,除非需要支持 IE9 下的兼容模式。在 IE9 中可以使用 IE7 和 IE8 的模式渲染页面,微软修改了在兼容模式下的 CSS 解析器,导致使用 ? 的方案失效。由于 CSS 解释器是从下往上解析的,所以在上面添加一个不带问号的 src 属性便可以解决此问题。

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

Python 3.6实现单博主微博文本、图片及热评爬取

文章简介 经常刷微博的同学肯定会关注一些有比较意思的博主,看看他们发的文字、图片、视频和底下评论,但时间一长,可能因为各种各样的原因,等你想去翻看某个博主的某...

4126
来自专栏Jackson0714

JavaScrpit判断横竖屏

1123
来自专栏新工科课程建设探讨——以能源与动力工程专业为例

3.1 Contour绘制

首先一起学习利用百度的开源项目绘制contour,百度搜索“echarts heatmap”,找到热力图的一个案例(http://echarts.baidu.c...

880
来自专栏李光春

通过IP地址获取当前地理位置的接口(包含纬经度)

直接访问:https://api.liguangchun.cn/api/v7/ip/ 就可以查询到了

945
来自专栏.Net移动开发

.Net语言 APP开发平台——Smobiler学习日志:开发APP时,如何快速地实现屏幕自适应

当AutoHeight属性为“True”时,Mobile Form的Scrollable属性将失去效果,以GridView控件的下面两种情况为例(以下两种情况的...

642
来自专栏君赏技术博客

百思不得姐数据挖掘第二篇

首先进入的是启动的界面,我们已经在上一篇做好了。第一次启动之后会出现一个宣传的视频,是下面的界面。

1131
来自专栏我杨某人的青春满是悔恨

在 iPhone 上使用 Popover Segue

iOS 系统提供了4种基本的转场方式:Show、Show Detail、Present Modally、Present as Popover。我们平常用的最多的...

845
来自专栏IMWeb前端团队

video标签在不同平台上的事件表现差异分析

本文作者:IMWeb 张颖 原文出处:IMWeb社区 未经同意,禁止转载 video标签属性和事件介绍 为了文章的完整性,首先还是列举一下video标...

2336
来自专栏Material Design组件

Human Interface Guidelines —— 状态栏(Status Bars)

2586
来自专栏维恩的派VNPIE

如何用vn.py做隔夜交易?

本文提供了一个每个交易日开盘前不用重连CTP的方法。如果不是特殊需求,强烈建议每天盘前重启程序。感谢viponedream在维恩的派论坛里的分享!

762

扫描关注云+社区