9

我正在使用 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

4

6 回答 6

4

问题:

  1. 画布立即渲染
  2. 谷歌加载网络字体
  3. 直到下一个重新渲染它的事件之前,Canvas 都不知道

解决方案:

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

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();
    });
})();
于 2014-01-23T02:40:37.957 回答
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>

很长的路要什么时候加载网络字体,你可以预加载它们吗?

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

特定https://groups.google.com/forum/#!topic/fabricjs/sV_9xanu6Bg

于 2014-02-28T00:24:53.083 回答
1

使用 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

于 2013-11-12T11:26:57.390 回答
1

我有同样的问题。触发某些事件后,字体会正确呈现。因此,在创建对象后,我们可以将其设置为活动状态:

var textSample = new fabric.Text(text, {
    fontFamily: "allstar",
});
canvas.add(textSample);
canvas.setActiveObject(textSample); // Selects the object
canvas.renderAll();
于 2013-11-22T14:27:57.780 回答
0

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

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

检查jsfiddle

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

于 2015-02-03T07:31:12.883 回答
0

截至 2017 年,在 Firefox 中的 Fabric.js 中使用 Web 字体很容易。

您只需通过@import(在您的样式表中)或通过<link href="...">(在<head>)中包含它们。之后,您可以使用 fabric.Text 的属性“fontFamily”选择您想要的任何字体。

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

请参阅jsFiddle 上的一个简单示例。

于 2017-03-18T15:33:11.053 回答