网页字体和 CSS 特性 – 一个简单的演示

这篇文章来自 Laurent Jouanneau,他很乐意构建一个非常简单但优雅的演示,展示如何在 Firefox 3.5 中使用网页字体和一些新的 CSS 特性。

在 Firefox 3.5 中查看演示
font_shadow_radius

阴影和圆角

首先,我们在工具栏上设置一些样式属性

-moz-border-radius

-moz-border-radius:10px 0px 10px 0px;

这表示左上角和右下角的边框应为圆角,半径为 10 像素。

-moz-box-shadow

-moz-box-shadow: #9BD1DE 5px 5px 6px;

这表示应在 div 下方绘制阴影,向右和下方偏移 5 像素,模糊半径为 6 像素。

其次,按钮。我们仍然使用 border-radius 属性。但我们也使用了 box-shadow 属性,它会根据按钮的状态而改变。在正常状态下,按钮外部有一个阴影。当鼠标悬停在其上(悬停状态)时,阴影会更改为使用 inset CSS 属性位于按钮内部。当我们点击按钮(激活状态)时,我们也执行相同的操作,但我们也会使阴影更大更暗。

#superbox button {
    -moz-border-radius: 5px;
    -moz-box-shadow: #000 0px 0px 8px;
}

#superbox button:hover {
    -moz-box-shadow: inset #989896 0 0 3px;
    text-shadow: red 0px 0px 8px;
}

#superbox button:active {
    -moz-box-shadow: inset #1C1C1C 0 0 5px;
}

您还可以看到,当鼠标悬停在按钮文本上时,我们使用 text-shadow 属性在文本下方添加了一个红色阴影。

网页字体

每个按钮都使用其自己的字体进行渲染,该字体使用 @font-face 声明。示例

@font-face {
    font-family: Brock Script;
    src: url("BrockScript.ttf");
    font-style: normal;
    font-weight: normal;
}

使用 font-family 属性,我们为字体指定一个名称。src 指示可下载字体的 URL。

定义 @font-face 属性后,我们可以在 CSS 中将其用于其中一个按钮

.first {
    font-family: Brock Script;
}

当您使用 @font-face 声明字体,然后在 CSS 中使用该字体时,浏览器会自动下载并使用该字体进行渲染。浏览器不会下载您不使用的字体,因此可以安全地从一个通用的 CSS 文件中包含字体描述,这些字体可能不会在您当前显示的页面中使用。

在演示中,每个按钮还连接了一小段脚本,它会更改蓝色框的类以使用该按钮的下载字体,这表明您也可以动态更新字体。

通过这些相对简单的技术,我们可以拥有漂亮的按钮,而无需使用位图图像。

注意:这些字体可以从 fontsquirrel.com 下载:Brock-Script(由 Dieter Steffmann 创建)、Sniglet(由可移动类型联盟创建,根据 CC-by-sa 许可证)和 Quick End Jerk(由 Vic Fieger 创建)。

关于 Christopher Blizzard

一次发布,让网络更美好。

更多 Christopher Blizzard 的文章…


22 条评论

  1. dataStorm

    很棒的 CSS!例如,有没有办法根据父 div 的宽度缩放文本的大小?

    2009 年 6 月 13 日 21:58

  2. Thor K.H

    有趣的演示,看起来不错。如果有一种非 JS 的方法(尽管这几乎没有 JS)会很有趣。

    2009 年 6 月 13 日 23:25

  3. AndersH

    在我看来,如果浏览器能够向服务器请求它需要的字符,那么只有需要的字体部分会被发送,这将非常有用。否则,对于字体大小为几兆字节的亚洲语言来说,这可能是一个无法启动的项目。

    这可以通过“unicode-range” HTTP 请求头来完成(不要与“unicode-range” CSS 属性混淆)。这将类似于“range”头对字节范围的作用,即了解此头的服务器将只发送需要的字符或回退到发送整个文件,如果浏览器突然需要更多字符,它将向服务器请求另一个范围并将其与已接收的字符组合(基于错误 465414,其中涉及“unicode-range” CSS 属性,似乎字体片段的组合已经实现)。

    尽管“range”头包含一个单位(根据 RFC 2616 第 3.12 节,目前唯一定义的单位是“bytes”),但它可能不应用于此目的,因为这可能会限制向后兼容性,当浏览器想要特定 Unicode 范围内的特定字节范围时。

    这可能会给连字带来一些问题,因此浏览器可能还需要能够请求字形,以便服务器可以发送涉及请求的 Unicode 范围内的任何字符的所有替换信息(请记住,客户端可能已经接收了其他 Unicode 范围),而无需在被特别请求之前发送实际的字形数据。但是,可能需要使用示例页面(包括亚洲页面)和字体进行一些测试,以检查字体必要部分(大小方面)的“昂贵”部分是什么,以确保浏览器在其请求中包含足够的信息。

    2009 年 6 月 14 日 00:48

  4. macke

    演示存在一些问题,字符显示为 [00 46] 等等,而不是字符,似乎远程字体由于某种原因无法正常工作。Ubuntu 9.04 / Firefox 3.5beta4

    2009 年 6 月 14 日 00:49

  5. Pete

    你好,
    为什么您将类命名为 -moz-border-shadow 和 -webkit-border-shadow,而不是简单地命名为 box-shadow?为什么我们还需要再次经历整个 -whatever-opacity 的过程?
    Pete

    2009 年 6 月 14 日 03:41

  6. soso

    在 Linux 和 Firefox 3.5b4 上无法正常工作

    2009 年 6 月 14 日 06:46

  7. Skeuomorph

    但它在 Safari 4 中确实可以工作。

    2009 年 6 月 14 日 08:06

  8. Christopher Blizzard

    @macke + @soso – 这是 Linux 上的一个已知问题,在 Beta 4 之后已修复。它将在 RC 中运行。我们有 Beta 版是有原因的。:)

    2009 年 6 月 14 日 08:36

  9. Christopher Blizzard

    @Pete – 当它们是特定于浏览器的功能并且尚未完成整个标准化流程时,它们被称为 -moz-* 或 -webkit-*。这是标准化流程的一部分——我们尝试不同的方法,了解它们如何与其他内容交互,找出什么有效,什么无效,然后每个人都找出如何就一种实现达成一致。

    这基本上也是不透明度的过程。现在不透明度已经标准化,并且每个人都就如何实现达成一致,我们已在 3.5 中弃用旧的 -moz-opacity 属性,转而使用新的 opacity 属性。其他浏览器供应商也在做同样的事情。

    2009 年 6 月 14 日 08:41

  10. Christopher Blizzard

    @AndersH – 这是一个很好的建议,并且可能可以使用当今存在的技术来实现。不是以您建议的方式,但服务器可以仅使用特定页面中使用的字符来提供字体。对于像繁体中文这样拥有数千个字符的语言,这将非常有帮助。请记住,您可以创建自己的字体,并且如果该字体不包含每种语言中每个字符的每个字形,也没关系。

    第二件事是这里还有另一个明显的用例——缓存。这是一个 HTTP 请求,因此我认为字体应该像任何其他资源一样被缓存。如果有人托管字体服务,他们可以使用非常积极的缓存并节省大量带宽——即使跨站点和服务也是如此。

    2009 年 6 月 14 日 08:46

  11. Christopher Blizzard

    @dataStorm 我很确定您可以使用 JS 和一些简单的尺寸拟合算法来做到这一点,并且可能有一种方法可以使用 CSS 来实现,但我还没有过多考虑。

    2009 年 6 月 14 日 08:50

  12. nemo

    关于只提供特定范围内的字符。

    在我看来,想要使用各种字体的网站应该花时间将 OTF/TTF 编辑为该特定网站所需的一组字形——这与其他基本优化(如缩小图像)对我来说没有什么不同。

    此外,如果网站根据用户设置或 Accept-Language/Accept-Charset 提供完全不同的字形,
    网站可以再次提供链接到包含所需字符的备用 OTF/TTF 的备用样式表。

    所以,是的。需要一些工作,但在一个不错的字体编辑器中相当快。我想,可以为一个站点创建一个配置文件,该配置文件指定了该站点使用的字形范围,而不是人工操作。

    哎呀,对于进行国际化的站点,CMS 可以根据其数据库中的当前内容计算自己的字形范围并相应地重新生成字体 :)

    2009 年 6 月 14 日 13:16

  13. AndersH

    @Christopher Blizzard:我知道在服务器上可以做到这一点。但是当页面在客户端(考虑 ajax)从多个数据源拼接在一起时,这些数据源根据用户选择进行过滤,并且您有想要使用正确字体预览的用户生成内容,并且您希望最大程度地减少每个字体包的大小,并且确实希望启用缓存(在客户端),它很快就会变得复杂,并且您必须谨慎行事,因为如果缺少单个字形,那就太糟糕了,而且您不知道客户端已经缓存了哪些字形(在您的字体包依赖关系层次结构之外)。我做过一次。所以我不是在信口开河。我提到的亚洲语言之一确实是繁体中文。

    正因为如此,我说如果客户端能够告诉服务器它需要哪些字符,那将非常有帮助。就像我理解的那样,Firefox 目前只在使用字体时加载它(这也可以在服务器上处理,即如果未使用,则不要在 css 中引用它),在这里,您将仅在需要时加载字符。

    关于缓存,我不认为这会导致需要在服务器上进行缓存,因为字体文件相当静态并且已经包含查找表,因此可以在 Web 层进行分割,开销很小(就像 Web 层处理字节范围请求一样,开销很小)。您确实希望在客户端进行缓存,这样,在导航到下一页时,上一页中使用的字体部分就不会再次下载,并且您无法知道用户将通过您的站点采取什么路径。

    如果你真的想创建包含最常用字形的字体包,然后回退到生成的范围请求,那么,这就是 unicode-range css 属性的作用。但你也可以让服务器返回(重定向到)一个预生成的字体文件,如果任何请求的字符都在该文件中(意味着它还没有被该客户端下载),客户端会在发现某些字符丢失且服务器理解 unicode-range http 头(因为服务器用 accept-header 响应)时发出新的请求以获取剩余的字符。服务器会在此时发送(重定向到)另一个预生成的字体文件(如果存在),或者创建一个新的字体文件,其中包含它没有映射到“.notdef”字形(索引 0)的字符。但我认为预生成这些字体文件不会带来太多好处。

    如果你做了类似下载字体文件中的偏移表和表记录,然后只下载所需表的必要部分(例如,对 cmap 和 glyf 表进行二分查找)的事情,你可能会遇到延迟问题。

    (抱歉这里长篇大论,但 bugzilla 似乎也没有链接到正确的地方,而且我不确定该去哪里寻求帮助。请随意删除这些帖子)

    2009年6月14日 13:27

    1. Michel Hubin

      我是法国一个科学网站的站长,我在 Firefox 3 中遇到的问题是它无法识别符号字体。Firefox 2 没有这个问题,但 Firefox 3 有。对于科学网站来说,这是一个严重的问题,因为符号字体涉及许多由国际惯例定义的参数,许多科学参数或数学参数都用希腊字符表示,也就是符号字体中的一些字符。我和许多用户,尤其是学生,在 2008 年 4 月 Firefox 3 上市时就在 bugzilla 上报告了这个错误,但似乎 Mozilla 的没有人理解这有多重要。我的网站每天有超过 2000 名学生阅读,他们对无法理解方程式感到非常不满,因为一些希腊符号被拉丁符号替换了。Mozilla 开发人员应该理解这有多严重,他们也应该理解 Firefox 的用户大多是学生,特别是科学专业的学生。我发现 28% 的阅读我网站的学生(来自世界各地)使用的是 Firefox 2,而实际上只有 14% 的人使用 Firefox 3。我认为这非常重要,Mozilla 基金会应该明白,Firefox 使用率下降的唯一原因就是这个错误:Firefox 3 无法识别符号字体,并在方程式和科学文本中用拉丁符号替换希腊符号。我希望你们能帮助我们解决这个愚蠢的错误。

      2010年1月11日 06:20

  14. […] 原文地址:web fonts and css features – a simple demonstration 系列地址:颠覆网络35天 […]

    2009年6月15日 00:13

  15. jmdesp

    > 我觉得一个想要使用各种字体的网站应该花点时间
    > 将 OTF/TTF 编辑成该网站所需的字形集
    > 特定网站

    事实上,每次你创建包含嵌入字体的 PDF 时,这部分都会自动为你完成。因此,如果能找到一种方法让网页创作工具在你包含可下载字体时也这样做,那就太好了。

    2009年6月15日 02:47

  16. […] 你在 Firefox 3.5 中可以期待什么?我最喜欢的功能包括能够在我的网站中嵌入字体,以便我可以输入任何我想要的字体,以及能够播放嵌入的 OGG 音频和 Theora 视频 […]

    2009年6月21日 22:08

  17. […] Firefox 3.5 支持网络字体(查看 Opera CTO Håkon Wium Lie 向 Aliza 演示网络字体的视频),你可以在此处找到一个关于如何使用它们以及浏览器中一些新 CSS 功能的良好演示。 […]

    2009年6月22日 13:02

  18. […] Mozilla Hacks 网站将所有这些功能整合到一个演示中(演示本身看起来很糟糕,但确实成功地展示了可能性),并且有一些 […]

    2009年7月6日 02:08

  19. […] 原文地址:web fonts and css features – a simple demonstration 系列地址:颠覆网络35天 […]

    2009年7月20日 23:15

  20. Morteza

    你好,
    感谢你的帖子。我在页面中使用 font-face 时遇到问题。我使用自己的语言字体(波斯语),但得到的字体并不像我在 IE 中看到的那样平滑。问题是什么?是 ClearType 的问题吗?我该如何解决?

    2010年7月7日 01:22

  21. vakies

    你好
    为什么 PR 工具栏在最新版本的 Mozilla Firefox 中无法使用?

    2012年7月10日 06:29

本文评论已关闭。