javascript - 我如何 "write"上下文 Canvas 中的图标?

标签 javascript css html canvas html5-canvas

这是我的字体:
@font-face {font-family: "myicon";/*...*/>
我的图标在 css 中的内容是:
content: "\e000";
我的 Js 代码:
ctx.font = '13.5pt myicon'; ctx.fillText("\ue000",90, 101);//不工作

你能解释一下问题出在哪里吗?为什么不打印图标? (抱歉我的英语不好)

最佳答案

虽然您可以使用 one markE 提到的脚本,但您也可以只粘贴一个等待字体加载的小片段。

脚本将通过执行以下操作进行测试:

  • 创建一个内部 Canvas ,为其绘制默认字体并存储其像素
  • 尝试每隔一段时间设置你想要的字体,绘制它并提取它的像素
  • 如果像素级没有区别,再等等
  • 首先像素差异,我们加载了一个新字体(大概)
  • 如果超时(此处为 3 秒),它将调用错误回调

一个活生生的例子:

hasFont("Open Sans", function() {
  document.body.innerHTML += " OK<br>Loading font..."

  // unknown font:
  hasFont("xFontoY", function() {
    document.body.innerHTML += " OK"
  }, function() {
    document.body.innerHTML += " Not loaded"
  });
  
}, function() {
  document.body.innerHTML += " Not loaded"
});

function hasFont(fontName, callback, error) {

  var canvas = document.createElement("canvas"),
      ctx = canvas.getContext("2d"),
      w = 60, h = 20,                             // affects accuracy
      delay = 50, maxTests = (1000 / delay) * 3,  // 3 sec @ 50ms intervals
      initial = getPixels("sans-serif");
  
  canvas.width = w; canvas.height = h;

  // test
  (function test() {
    var px = getPixels(fontName), len = px.length, i = 0;
    for(; i < len; i++) {
      if (initial[i] !== px[i]) {callback(fontName);return}
    }
    
    if (--maxTests) setTimeout(test, delay);
    else {if (error) error(fontName)}
  })();
  
  function getPixels(fontName) {
    ctx.clearRect(0, 0, w, h);
    ctx.font = h + "px " + fontName + ", sans-serif";
    ctx.fillText("aWm", 0, h);
    return new Uint32Array(ctx.getImageData(0, 0, w, h).data.buffer);
  }
}
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans'), local('OpenSans'), url(https://fonts.gstatic.com/s/opensans/v10/cJZKeOuBrn4kERxqtaUH3VtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'), url(https://fonts.gstatic.com/s/opensans/v10/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
}
canvas {border:1px solid #000}
Loading font...

随意重写它以接受选项、 promise 等。

关于javascript - 我如何 "write"上下文 Canvas 中的图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28591573/

相关文章:

c# - 从 C# 中的 HTML 响应中解析 javascript 值

javascript - 将脚本 append 到 <head> 不起作用,但是手动编写它可以吗? Chrome 调试器将它们呈现为相同的

javascript - 当我包含推荐的安全覆盖时,为什么脚本拒绝在 Google Analytics Chrome 扩展程序中加载?

javascript - React 使用 .push 通过 onClick 添加到数组

html - CSS flexbox |在移动设备中重新排序元素

javascript - 如何使用 JavaScript 和“是/否”按钮来弹出年龄验证窗口?

javascript - 错误: "Cannot convert Array to Object" Data Scraping script

javascript - 我使用 axios 发送的数据在配置中返回,而不是数据

html - 居中分割

javascript - 用另一个 HTML 替换 HTML 标签