在 Compass 中使用数据 URI 的新 Bulletproof @font-face 语法

Posted

技术标签:

【中文标题】在 Compass 中使用数据 URI 的新 Bulletproof @font-face 语法【英文标题】:New Bulletproof @font-face syntax using Data URIs in Compass 【发布时间】:2012-05-23 22:37:48 【问题描述】:

我正在使用 compass 的 font-face mixin 以及 inline-font-filesfont-files,以便使用 Data URIs 为 woff、ttf 和 otf 文件创建类似于 The New Bulletproof @Font-Face Syntax 的内容。

我将相对 URL 用于 eot(由于 IE 不支持数据 URI)和 svg 文件(由于我猜是 #FontName 哈希)。 eot 文件没有问题,因为有一个参数,但是因为 Compass 中的 font-face 将 svg 与其他格式没有区别,所以我根本不能使用 inline-font-files 来包含字体数据,因为这会使 svg 版本内联为好吧。

有没有办法让font-face 返回如下内容:

@font-face 
    font-family: 'PTSans';
    src: url('pts55fwebfont.eot');
    src: url('pts55fwebfont.eot?#iefix') format('embedded-opentype'),
         url('data:WOFF_DATA') format('woff'),
         url('data:TTF_DATA') format('truetype'),
         url('pts55fwebfont.svg#PTSansRegular') format('svg');
    font-weight: normal;
    font-style: normal;


问题是我无法弄清楚如何让 woff、otf 和 ttf 版本使用数据 URI,同时仍然允许 svg 版本使用标准 URL。我想出的最好的是:

@include font-face('PTSans', inline-font-files('ptsans/pts55fwebfont.woff', woff, 'ptsans/pts55fwebfont.ttf', truetype), 'ptsans/pts55fwebfont.eot', normal, normal);
@include font-face('PTSans', font-files('ptsans/pts55fwebfont.svg#PTSansRegular'), $weight: normal, $style: normal);

这会将 svg 分解为自己的@font-face。我可以使用不同的权重和样式创建具有相同姓氏的多个 @font-face 规则的同一帐户上的有效 CSS 是否有效?如果是这样的话,它会和上面的示例 CSS 一样好(看起来)吗?当然,在 Compass/sass 中是否有更好的方法来实现这一点?

【问题讨论】:

【参考方案1】:

对于那些感兴趣的人,问题中提到的解决方法似乎效果很好。将 eot 文件属性从数据 URI @font-face 规则移动到使用标准 url() 的规则可能是一个好主意。有时会出现数据:生成的 URL 太长,这违反了整个 @font-face 规则。此外,请确保最后加载数据 URI 规则,因为 Firefox 5 及更高版本似乎只加载遇到的最后一条规则。因此,将内联字体(woff、ttf、otf)保留在最后一条规则中,将链接字体(svg、eot)保留在第一条规则中,如下所示:

@include font-face('PTSans', font-files('ptsans/pts55fwebfont.svg#PTSansRegular') 'ptsans/pts55fwebfont.eot', normal, normal);
@include font-face('PTSans', inline-font-files('ptsans/pts55fwebfont.woff', woff, 'ptsans/pts55fwebfont.ttf', truetype), $weight: normal, $style: normal);

【讨论】:

【参考方案2】:

更新。我确实使用了 Bourbon mixin 网站上的一个很棒的小 mixin:

// Bourbon Mixin for top notch webfont support: https://github.com/thoughtbot/bourbon/blob/master/app/assets/stylesheets/addons/_font-face.scss
@mixin font-face($font-family, $file-path, $weight: normal, $style: normal ) 
  @font-face 
      font-family: $font-family;
      src: url('#$file-path.eot');
      src: url('#$file-path.eot?#iefix') format('embedded-opentype'),
           url('#$file-path.woff') format('woff'),
           url('#$file-path.ttf') format('truetype'),
           url('#$file-path.svg##$font-family') format('svg');
      font-weight: $weight;
      font-style: $style;
  


// Bourbon Mixin webfont setup: http://thoughtbot.com/bourbon/#font-face
@include font-face(ProximaNova, 'fonts/proximanova_semibold_macroman/ProximaNova-Sbold-webfont');
@include font-face(ProximaNova, 'fonts/proximanova_bold_macroman/ProximaNova-Bold-webfont', bold);
@include font-face(ProximaNova, 'fonts/proximanova_semibolditalic_macroman/ProximaNova-SboldIt-webfont', normal, italic);

【讨论】:

缺少样式/重量和数据 URI:s 字体对吗?但这可能很容易添加。很好的发现!【参考方案3】:

这个 mixin 非常适合我对某些格式的数据 URI:s 和其他格式的 http 加载的需求:

@mixin fontspring-font-face($family, $file, $svg_hash: $file, $weight: false, $style: false) 

    @font-face 
        font-family: quote($family);
          src: font-files("#$file.eot");
          src: font-files("#$file.eot?#iefix") format('eot'), inline-font-files("#$file.woff", woff, "#$file.ttf", truetype), font-files("#$file.svg##$svg_hash") format('svg');

          @if $weight 
              font-weight: $weight;
          
          @if $style 
              font-style: $style;
          
    

编辑:我可能应该补充一点,生成的 CSS 在 IE 中容易损坏。很可能是由于 inline-font-files 包含的文件太大,导致 url(data:) 值无效,这反过来又导致整个 src 属性无效。将数据 URI 版本保存在单独的 css 指令中似乎是最好的解决方案。

【讨论】:

以上是关于在 Compass 中使用数据 URI 的新 Bulletproof @font-face 语法的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongodb compass 在我的数据库中添加了一些 json 数据,并尝试使用 mongoose 获取数据,但得到的是空数组

在 Rails 3.1 应用程序中使用 Sass + Compass + Blueprint

如何在一段时间后更改Flask-SQLAlchemy URI?

使用 Compass 生成雪碧图

在 Compass 项目目录结构中使用 Sass 部分的子文件夹

在 Symfony2 中使用 Compass 和 Assetic 的 Foundation5