javascript – Canvas仅使用fabric.js渲染点击事件的自定义webfont

前端之家收集整理的这篇文章主要介绍了javascript – Canvas仅使用fabric.js渲染点击事件的自定义webfont前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有自定义webfonts和fabric.js持续存在的问题.
我的应用程序使用了很多自定义的webfonts,并在将iText添加到我的画布时启动它们:
  1. var text = new fabric.IText("My Text",{
  2. fontFamily: "Some Custom Font Family",fontSize: 50,top: 0,left: 0,fill: "#000000"
  3. });
  4.  
  5. canvas.add(text);
  6. canvas.bringToFront(text);
  7. canvas.setActiveObject(text);
  8.  
  9. canvas.renderAll();

这是有效的,但只有当我点击我的画布上的iText和它进行交互.然后,一旦字体加载,它不再是问题了.问题最初是第一次添加iText.

我研究了很多,并提出了这一点:

Init loaded text with remote web font in Fabric.js

但这没有帮助我.提供的jsfiddle有完全相同的问题:

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

只需使用清除缓存的新鲜浏览器(例如Chrome CMD Shift R)打开此小提琴.你会看到一旦你打开小提琴,自定义webfont没有加载,但立即加载,当你点击右侧的iText.

现在我们该怎么解决呢?

一个建议的方法是将useNative设置为false,并让Cufon呈现文本,但这不起作用.

我将我的webfonts加载到CSS文件中,如下所示:

  1. @font-face {
  2. font-family: 'ApolloASM';
  3. src: url('ApolloASM-webfont.eot');
  4. src: url('ApolloASM-webfont.eot?#iefix') format('embedded-opentype'),url('ApolloASM-webfont.woff2') format('woff2'),url('ApolloASM-webfont.woff') format('woff'),url('ApolloASM-webfont.ttf') format('truetype'),url('ApolloASM-webfont.svg#apollo_asmregular') format('svg');
  5. font-weight: normal;
  6. font-style: normal;
  7. }

解决方法

@Prominic答案几乎在那里.我也有一个画布应用程序使用自定义字体与面料.我像你一样加载CSS中的所有字体.抓住的是,只有声明您的样式表中的@ font-face是不够的.浏览器不会请求字体文件,除非它在文档中使用.并且您必须确保在初始化画布之前加载和应用webfont.这可以通过一点点的工作来实现,下面我将通过一个例子进行说明.缺点是您可能需要预先加载您的应用程序可用于您的用户的所有字体.

>声明你的webfont

在样式表中添加一个@ font-face语句.只需确保它已加载到< head>部分.让我们用你的例子:

  1. @font-face {
  2. font-family: 'ApolloASM';
  3. src: url('ApolloASM-webfont.eot');
  4. src: url('ApolloASM-webfont.eot?#iefix') format('embedded-opentype'),url('ApolloASM-webfont.svg#apollo_asmregular') format('svg');
  5. font-weight: normal;
  6. font-style: normal;
  7. }

奖励提示:如果您在应用程序中使用斜体和/或粗体,如果您希望在不同浏览器中保持一致的结果,建议您为这些样式添加字体.例如,Android Browser 4.2无法计算字体的斜体,并将正常显示.

强制字体文件的请求

如上所述,您将需要实际使用DOM中的字体来强制加载字体.只需添加一些文字,并用您的字体进行样式化就足够了

  1. <div style="font-family:'ApolloASM'">&nbsp;</div>

奖金提示:不要忘了添加斜体和大胆的变体

>在DOM加载事件之后初始化FabricJS Canvas

您将需要在浏览器加载字体后同步canvas init(或至少是文本添加),否则可能会看到FOUT效果(Flash的Unstyled Text).幸运的是,浏览器不会触发加载事件,直到所有的字体文件被加载,这可以用来安全地添加一个风格的文本到画布:

  1. window.addEventListener('load',function onLoad() {
  2. var canvas = new Fabric.Canvas({...});
  3. var text = new fabric.Text("Web Font Example",{
  4. left: 200,top: 30,fontFamily: 'ApolloASM',fill: '#000',fontSize: 60
  5. });
  6.  
  7. canvas.add(text);
  8. canvas.renderAll();
  9. })

奖金提示:您可以将这些字体< div>‘包含在另一个中,并在DOM加载事件之后将其删除,以避免破坏您可能拥有的任何布局.

猜你在找的JavaScript相关文章