【问题标题】:Init loaded text with remote web font in Fabric.js在 Fabric.js 中使用远程 Web 字体初始化加载的文本
【发布时间】:2013-11-24 11:55:12
【问题描述】:

我正在使用 Fabric JS 开发一个大型自定义应用程序,并且我已经做得很好了。但是我对使用网络字体的初始化加载文本对象有疑问。

只要该字体在客户端计算机上是本地字体,我就可以正常工作,否则不会加载 webfont,并且画布上的文本对象以默认的无衬线字体系列呈现。

简而言之,这是我所做的(在本例中,我使用“allstar”作为我的网络字体)

CSS: css在fabric.js之前的头部的fonts.css中加载

@font-face{
    font-family:'allstar';
    src:
        url('/path-to-fonts/all_star-webfont.eot');
    src:
        url('/path-to-fonts/all_star-webfont.eot?#iefix') format('embedded-opentype'),
        url('/path-to-fonts/all_star-webfont.woff') format('woff'),
        url('/path-to-fonts/all_star-webfont.ttf') format('truetype'),
        url('/path-to-fonts/all_star-webfont.svg#allstarregular') format('svg');
    font-weight:normal;
    font-style:normal
}

Javascript: 这是在页面底部的 $(document).ready(function(){}) 内加载的

var textSample = new fabric.Text(text, {
    fontFamily: "allstar",
});
canvas.add(textSample);
canvas.renderAll();

如果我在页面的其他地方使用字体(例如:在带有点和字体的透明跨度标签中),它可以正常工作。但我认为这不是正确的编码方式。

我使用fabric.js 1.3.0版

【问题讨论】:

    标签: javascript css fonts fabricjs


    【解决方案1】:

    问题:

    1. 画布立即渲染
    2. Google 加载网络字体
    3. Canvas 直到下一个重新渲染它的事件才知道

    解决办法:

    1. 画布立即渲染
    2. Google 通过回调加载网络字体
    3. 你强制渲染
    4. Canvas 现在有

    http://jsfiddle.net/vvL6f/6/

    WebFontConfig = {
        google: { families: [ 'Ribeye::latin', 'Lora::latin', 'Croissant+One::latin', 'Emblema+One::latin', 'Graduate::latin', 'Hammersmith+One::latin', 'Oswald::latin', 'Oxygen::latin', 'Krona+One::latin', 'Indie+Flower::latin', 'Courgette::latin', 'Ranchers::latin' ] }
    };
    
    (function() {
        var src = ('https:' === document.location.protocol ? 'https' : 'http') +
            '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
    
        $.getScript(src, function(data) {      
            // Not sure why I need to run this twice but it makes it load the font and then reposition the font to it's correct coords.
            canvas.renderAll();
            canvas.renderAll();
        });
    })();
    

    【讨论】:

    • 不工作(谷歌浏览器)。我不得不使用 setTimeout 重新渲染
    • +1 webfont 加载器为我修复了问题,甚至没有明确设置任何回调。我只是加载网络字体,然后加载我的画布,它现在可以工作了。
    • 这实际上是一个更好的主意。您还可以使用 async 设置一些东西以按顺序正确加载所有内容。 github.com/caolan/async#seriestasks-callback
    【解决方案2】:

    捷径:

    <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
    <script>
    WebFont.load({
                google: {
                    families: [ 'Abel', 'Aclonica']
                },
                fontinactive: function(familyName, fvd) {
                    console.log("Sorry " + familyName + " font family can't be loaded at the moment. Retry later.");
                },
                active: function() {
                    // do some stuff with font   
                    $('#stuff').attr('style', "font-family:'Abel'");
                    var text = new fabric.Text("Text Here", {
                        left: 200,
                        top: 30,
                        fontFamily: 'Abel',
                        fill: '#000',
                        fontSize: 60
                    });
    
                    canvas.add(text);
                }
            });
    </script>
    

    任重道远When do web-fonts load and can you pre-load them?

    更多关于网络字体加载器https://github.com/typekit/webfontloader

    具体https://groups.google.com/forum/#!topic/fabricjs/sV_9xanu6Bg

    【讨论】:

      【解决方案3】:

      使用 fabric.js 和 Google Web Fonts,以下代码适用于我:

      小提琴:http://jsfiddle.net/DanBrown180/vvL6f/

      CSS

      <Style>
      @font-face {
      font-family: 'Jolly Lodger';
      font-style: normal;
      font-weight: 400;
      src: local('Jolly Lodger'), local('JollyLodger'),
      url(http://themes.googleusercontent.com/static/fonts/jollylodger/v1/RX8HnkBgaEKQSHQyP9itiaRDOzjiPcYnFooOUGCOsRk.woff) format('woff');
      }
      <style>
      

      Javascript

      <script type = "text/javascript">
      canvas = new fabric.Canvas('c'); 
      var text = new fabric.Text("Web Font Example", {
                          left: 200,
                          top: 30,
                          fontFamily: 'Jolly Lodger',
                          fill: '#000',
                          fontSize: 60
                      });
      
      canvas.add(text);
      </script>
      

      HTML

      <canvas id="c" height="200px" width="400px"></canvas>
      

      看起来是因为 Google Web Fonts css 代码使用了:

      src: local('Jolly Lodger'), local('JollyLodger')
      

      在 CSS 中

      【讨论】:

      • 嗨,丹。感谢您的回答,但这与我所做的类似,除了您使用 Google 字体。不幸的是,在我的项目中,我必须使用我们自己存储在服务器上的字体。此外,如果我放纵你的 jsfiddle 示例,你也会遇到同样的问题。和我一样,当你点击画布时,文本会以正确的字体重新呈现。
      【解决方案4】:

      我遇到了同样的问题。 触发某些事件后字体正确呈现.. 所以在创建对象后我们可以将其设置为活动状态:

      var textSample = new fabric.Text(text, {
          fontFamily: "allstar",
      });
      canvas.add(textSample);
      canvas.setActiveObject(textSample); // Selects the object
      canvas.renderAll();
      

      【讨论】:

        【解决方案5】:

        最好的方法是使用 setTimeout();

        setTimeout(function(){
            var activeObject = canvas.getActiveObject();
            activeObject.set({
                fontFamily: font,
                useNative: true
            });
        canvas.renderAll();},500);
        

        检查 jsfiddle

        http://jsfiddle.net/muthupandiant/x3ptsgex/1/

        【讨论】:

        • 不,这不是最好的方法,因为 1) 如果字体花费的时间超过 500 毫秒,它不能解决问题 & 2) 如果字体花费的时间少于 500 毫秒,我们的应用程序无论如何都会等待很长时间 &感觉很慢。
        【解决方案6】:

        截至 2017 年,在 Firefox 中的 Fabric.js 中可以轻松使用网络字体。

        您只需通过@import(在您的样式表中)或通过&lt;link href="..."&gt;(在&lt;head&gt;)包含它们。之后你可以使用fabric.Text的属性'fontFamily'来选择你想要的任何字体。

        关于您最初的问题,调用canvas.renderAll(); 应该重新绘制画布,从而正确显示所有加载的网络字体。

        查看simple example on jsFiddle

        【讨论】:

          猜你喜欢
          • 2014-08-17
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2014-08-12
          • 2020-12-01
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多