【问题标题】:SVG node.getBBox incorrect when using @font-face使用 @font-face 时 SVG node.getBBox 不正确
【发布时间】:2017-04-14 03:43:37
【问题描述】:

我有一些使用Raphael.text()font-family 属性渲染的文本,这些属性使用使用@font-face 加载的字体。

我使用 OpenType 加载字体并将其呈现为 base64 并将其注入到我的样式表中。

这是一些伪代码:

// In my css
opentype.load('someFontFamily', (err, font) => {
  // Inject in stylesheets
  const path = paper.text(x, y, 'Hello World')
    .attr({
      'font-family': 'someFontFamily'
      'font-size': 100
    })
  path.getBBox() // Calls path.node.getBBox() in RaphaelJS
}) 

问题是这样的。 getBBox 返回的大小,尤其是宽度,并不反映字体系列,而是一些抽象的未知通用字体(它不是备用字体的宽度,所以不确定它是什么)。

html/page 正确显示了我的 SVG 和所需的字体。我可以检查它,浏览器会看到正确的大小。

这不是等待的问题,我尝试过超时。如果在浏览器中预加载字体,它似乎唯一可行的方法(通过在页面上使用系列元素并在我的css中使用@font-face,这会导致在任何SVG渲染之前触发字体下载。

我尝试在页面加载之前将我的字体添加为@font-face 声明,但它没有任何区别。

如何让 SvG 返回反映其显示字体的大小?我怀疑这是一个内部时间问题。这几乎就像后期渲染需要回调/事件。

【问题讨论】:

    标签: javascript css svg fonts raphael


    【解决方案1】:

    好的。发布一个答案,以防它对其他可怜的灵魂有用。

    确实有一些@font-face 加载事件的实现。

    这是一个很好的article

    跨浏览器支持仍然不确定,但 Font Face Observer 看起来是一个很有前途的库:

    还感兴趣的是:

    一些浏览器本身就支持这些事件。渲染我的文本后,我可以调用:

    document.fonts.load('70px someFontFamily')
      .then(function() {
        console.log(path.node.getBBox())
      })
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2016-05-31
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多