我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在html5中使用canvas绘制网络字体

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在html5中使用canvas绘制网络字体

怎么在html5中使用canvas绘制网络字体?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

服务端转换
 

服务端转换是什么意思呢?直接把内容和需要的字体传递给服务端,服务端提供一个文字转图片的接口,将字体转换成图片,然后在canvas中直接绘制图片,这样就能保证绘制网络字体不会有问题,不会有任何的兼容性问题,但是这样做也就意味着服务端的工作会变多,同时如果文字内容是可以被用户编辑修改的,那就意味着用户每操作一次,都要请求一次接口,然后重新绘制一次图片,这样会导致网络开销增加,如果不想要服务端的介入,那就看看下面的解决方案

webfontloader
 

webfontloader是一个由Google和Typekit共同开发的组件库,提供了一组标准事件监听字体的加载,虽然已经很长时间没有更新了,但是对字体加载的监听确实有效,下面来看一个具体的例子怎么使用:

var WebFont = require('webfontloader')var canvas = document.getElementById('canvas')var ctx = canvas.getContext('2d')var link = document.createElement('link')link.rel = 'stylesheet'link.type = 'text/css'link.href = 'http://fonts.googleapis.com/css?family=Vast+Shadow'document.getElementsByTagName('head')[0].appendChild(link)WebFont.load({  custom: {    families: ['Vast Shadow']  },  active: function () {    ctx.font = '50px "Vast Shadow"'    ctx.textBaseline = 'top'    ctx.fillText('123', 20, 10)  }})

首先通过require引入webfontloader,并且动态插入一个script标签载入google的字体,然后调用webfontloader的load方法进行配置监听,当字体加载完成后就会触发active钩子,开始绘制对应字体的内容,webfontloader提供了一个完整的事件系统钩子给开发者调用:

怎么在html5中使用canvas绘制网络字体 

如果想要了解webfontloader的更多用法可以前往 github 查看学习,如果你觉得为了绘制网络字体需要引入一个js库有点得不偿失,没关系,接下来向你接受不用库的方法

document.fonts.load
 

如果你在Google上搜索canvas加载网络字体,你一定能搜到下面这个方案:

var canvas = document.getElementById('canvas')var ctx = canvas.getContext('2d')var link = document.createElement('link')link.rel = 'stylesheet'link.type = 'text/css'link.href = 'http://fonts.googleapis.com/css?family=Vast+Shadow'document.getElementsByTagName('head')[0].appendChild(link)var image = document.createElement('img')image.class="lazy" data-src = link.hrefimage.onerror = () => {  ctx.font = '50px "Vast Shadow"'  ctx.textBaseline = 'top'  ctx.fillText('123', 20, 10)}

这个方案存在一点问题,当image onerror事件触发的时候,并不能保证字体已经加载完成,只能保证css文件已经加载完成,因此,在第一次访问的时候并不会生效:

怎么在html5中使用canvas绘制网络字体 

但是你再刷新一下浏览器之后字体就生效了:

怎么在html5中使用canvas绘制网络字体 

这是什么原因呢?我们来看一下刷新浏览器的网络请求:

怎么在html5中使用canvas绘制网络字体 
 

可以看到后面的字体走的是缓存,因此可以字体可以绘制出来,但是如果将chrome调试的Disable cache勾选上,将缓存禁用掉,那么无论怎么刷新,字体都不会绘制出来。

怎么在html5中使用canvas绘制网络字体 

有解决办法吗?答案是有的,使用Font Load API进行加载,来看具体代码:

var canvas = document.getElementById('canvas')var ctx = canvas.getContext('2d')var link = document.createElement('link')link.rel = 'stylesheet'link.type = 'text/css'link.href = 'http://fonts.googleapis.com/css?family=Vast+Shadow'document.getElementsByTagName('head')[0].appendChild(link)var image = document.createElement('img')image.class="lazy" data-src = link.hrefimage.onerror = () => {  document.fonts.load('50px Vast Shadow', '123').then(() => {    ctx.font = '50px "Vast Shadow"'    ctx.textBaseline = 'top'    ctx.fillText('123', 20, 10)  })}

先用image的onerror事件trick css文件的加载,然后调用document.fonts.load看字体是否加载完成,这样就可以准确监听到字体加载完成,但是这个api存在兼容性问题,来看具体表格:

怎么在html5中使用canvas绘制网络字体 

想要对这个api了解更多,可以前往 mdn 查看

对比绘制

对比绘制是什么意思呢?就是先设置一个没有的字体,然后在设置我们需要的字体进行对比,来看具体代码:

var canvas = document.getElementById('canvas')var ctx = canvas.getContext('2d')var link = document.createElement('link')link.rel = 'stylesheet'link.type = 'text/css'link.href = 'http://fonts.googleapis.com/css?family=Vast+Shadow'document.getElementsByTagName('head')[0].appendChild(link)ctx.font = '50px UNKNOW'ctx.textBaseline = 'top'ctx.fillText('123', 20, 10)var dataDefault = ctx.getImageData(20, 10, 50, 50).datactx.clearRect(20, 10, 100, 100)var detect = () => {  ctx.font = '50px "Vast Shadow"'  ctx.textBaseline = 'top'  ctx.fillText('123', 20, 10)  var dataNow = ctx.getImageData(20, 10, 50, 50).data  if ([].slice.call(dataNow).join('') === [].slice.call(dataDefault).join('')) {    ctx.clearRect(20, 10, 100, 100)    requestAnimationFrame(detect)  }}detect()

看完上述内容,你们掌握怎么在html5中使用canvas绘制网络字体的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在html5中使用canvas绘制网络字体

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在html5中使用canvas绘制网络字体

怎么在html5中使用canvas绘制网络字体?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。服务端转换 服务端转换是什么意思呢?直接把内容和需要的字体传递给服务端,服务端提供一
2023-06-09

使用canvas怎么绘制网络字体

使用canvas怎么绘制网络字体?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。服务端转换服务端转换是什么意思呢?直接把内容和需要的字体传递给服务端,服务端提供一
2023-06-09

怎么在html5中使用canvas绘制文本自动换行

怎么在html5中使用canvas绘制文本自动换行?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一个150*100的canvas画布,加个边框明显边界2023-06-09

怎么在html5中利用canvas绘制一个圆环

今天就跟大家聊聊有关怎么在html5中利用canvas绘制一个圆环,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现过程:首先:html部分代码如下:2023-06-09

怎么在html5中利用Canvas绘图

怎么在html5中利用Canvas绘图?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是CanvasCanvas 是H5的一部分,允许脚本语言动态渲染图像。Canva
2023-06-09

怎么在HTML5中利用Canvas绘制一个K线图

本篇文章为大家展示了怎么在HTML5中利用Canvas绘制一个K线图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SVG 是一种使用 XML 描述 2D 图形的语言。 Canvas 通过 JavaS
2023-06-09

怎么在HTML5中利用canvas绘制哆啦A梦头部

怎么在HTML5中利用canvas绘制哆啦A梦头部?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。效果如下:代码如下:
2023-06-15

canvas怎么在html5 中使用

这期内容当中小编将会给大家带来有关canvas怎么在html5 中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录