【问题标题】:HTML5 Canvas, importing a local font?HTML5 Canvas,导入本地字体?
【发布时间】:2018-09-26 12:15:57
【问题描述】:

我正在尝试导入要在 html5 画布中使用的字体。我的电脑上有文件,但到目前为止我尝试的一切都没有奏效。画布仅显示默认字体。我一定是做错了什么或错过了一步。

我已经用这样的 CSS 加载了它们:

@font-face {
font-family: 'RifficFree-Bold';
src: local('RifficFree-Bold'), url(./fonts/RifficFree-Bold.ttf), format('truetype');
}

然后像这样在 JS 中调用它们:

    function drawText(myText, ctx) {
        ctx.font = "40px RifficFree-Bold";
        ctx.fillStyle = "rgb(0, 0, 0, " + myText.fill + ")";
        ctx.fillText(myText.text, myText.x, myText.y);
    }

我知道程序已经走到这一步了,因为每当我将 40px 更改为另一个值时,字体的大小都会发生应有的变化。我想我一定是错误地加载了实际的字体文件。有什么想法吗?

【问题讨论】:

    标签: javascript css html fonts html5-canvas


    【解决方案1】:

    自定义字体在使用之前不会加载(您可以阅读question about this here)。因此,当调用您的 drawText 函数时,字体不会开始加载,直到调用 ctx.fillText - 此时文本已经使用默认字体绘制。

    您可以通过两种方式强制浏览器预加载字体;

    1. 在页面某处放置一个不可见的小 div,其中包含一些使用您的字体的文本(加载字体后可以将其删除)。

    2. 如果你需要加载几种字体或者不想修改你的 HTML,你可以创建一个加载字体的小函数:

      function _loadFont(fontname){
          var canvas = document.createElement("canvas");
          //Setting the height and width is not really required
          canvas.width = 16;
          canvas.height = 16;
          var ctx = canvas.getContext("2d");
      
          //There is no need to attach the canvas anywhere,
          //calling fillText is enough to make the browser load the active font
      
          //If you have more than one custom font, you can just draw all of them here
          ctx.font = "4px "+fontname;
          ctx.fillText("text", 0, 8);
      }
      

      在你需要使用字体之前调用函数,当你真正需要它们时应该加载它们。

    【讨论】:

    • 您好,感谢您的回复。我确实在某处读过有关使用 div 预加载字体的信息。我插入了这个:
      TEST
      ,但它没有用。我那里的东西看起来还好吗?我现在就试试这个功能。
    • 该功能似乎也不起作用...这告诉我我的问题可能出在其他地方。
    • 我用不同的字体尝试了你的例子,它奏效了。您确定您的浏览器支持 TrueType 字体吗?
    • 请问你用的是什么浏览器?我已经在 Firefox 和 Chrome 中测试过,但都不起作用。
    • @kelso,请参阅我的其他答案,这可能会解决您的特定问题:)
    【解决方案2】:

    您的示例中的实际问题似乎是 url 和格式参数之间的逗号 (,)。 format 应该直接跟在网址后面:

    src: local('RifficFree-Bold'), url(./fonts/RifficFree-Bold.ttf) format('truetype');
    

    【讨论】:

    • 我实际上把这个评论放在那里作为测试,不幸的是没有它它也不起作用:/我很困惑。
    • 如果这不是问题,那我真的不知道;我下载了相同的字体,并复制了您的示例。用逗号我得到警告Unknown descriptor 'format(' in @font-face rule. Skipped to next declaration.。删除它会显示正确的字体。
    • 您是否使用 div 和/或您建议的功能对其进行了测试?
    • @kelso 我从您的其他评论中复制了您的字体声明和测试 div。照原样,它不起作用。删除逗号解决了它。
    • 嘿,只是想跳回到这里告诉你我的字体没有显示,因为我没有在我的 .html 文件中正确引用 .css 文件。哎呀。现在可以了。
    猜你喜欢
    • 2013-03-09
    • 2012-01-02
    • 1970-01-01
    • 2019-05-07
    • 2015-05-28
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多