欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蒲城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式蒲城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蒲城地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

服務(wù)端轉(zhuǎn)換
 

服務(wù)端轉(zhuǎn)換是什么意思呢?直接把內(nèi)容和需要的字體傳遞給服務(wù)端,服務(wù)端提供一個(gè)文字轉(zhuǎn)圖片的接口,將字體轉(zhuǎn)換成圖片,然后在canvas中直接繪制圖片,這樣就能保證繪制網(wǎng)絡(luò)字體不會(huì)有問題,不會(huì)有任何的兼容性問題,但是這樣做也就意味著服務(wù)端的工作會(huì)變多,同時(shí)如果文字內(nèi)容是可以被用戶編輯修改的,那就意味著用戶每操作一次,都要請(qǐng)求一次接口,然后重新繪制一次圖片,這樣會(huì)導(dǎo)致網(wǎng)絡(luò)開銷增加,如果不想要服務(wù)端的介入,那就看看下面的解決方案

webfontloader
 

webfontloader是一個(gè)由Google和Typekit共同開發(fā)的組件庫(kù),提供了一組標(biāo)準(zhǔn)事件監(jiān)聽字體的加載,雖然已經(jīng)很長(zhǎng)時(shí)間沒有更新了,但是對(duì)字體加載的監(jiān)聽確實(shí)有效,下面來看一個(gè)具體的例子怎么使用:

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,并且動(dòng)態(tài)插入一個(gè)script標(biāo)簽載入google的字體,然后調(diào)用webfontloader的load方法進(jìn)行配置監(jiān)聽,當(dāng)字體加載完成后就會(huì)觸發(fā)active鉤子,開始繪制對(duì)應(yīng)字體的內(nèi)容,webfontloader提供了一個(gè)完整的事件系統(tǒng)鉤子給開發(fā)者調(diào)用:

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 

如果想要了解webfontloader的更多用法可以前往 github 查看學(xué)習(xí),如果你覺得為了繪制網(wǎng)絡(luò)字體需要引入一個(gè)js庫(kù)有點(diǎn)得不償失,沒關(guān)系,接下來向你接受不用庫(kù)的方法

document.fonts.load
 

如果你在Google上搜索canvas加載網(wǎng)絡(luò)字體,你一定能搜到下面這個(gè)方案:

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.src = link.href
image.onerror = () => {
  ctx.font = '50px "Vast Shadow"'
  ctx.textBaseline = 'top'
  ctx.fillText('123', 20, 10)
}

這個(gè)方案存在一點(diǎn)問題,當(dāng)image onerror事件觸發(fā)的時(shí)候,并不能保證字體已經(jīng)加載完成,只能保證css文件已經(jīng)加載完成,因此,在第一次訪問的時(shí)候并不會(huì)生效:

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 

但是你再刷新一下瀏覽器之后字體就生效了:

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 

這是什么原因呢?我們來看一下刷新瀏覽器的網(wǎng)絡(luò)請(qǐng)求:

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 
 

可以看到后面的字體走的是緩存,因此可以字體可以繪制出來,但是如果將chrome調(diào)試的Disable cache勾選上,將緩存禁用掉,那么無論怎么刷新,字體都不會(huì)繪制出來。

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 

有解決辦法嗎?答案是有的,使用Font Load API進(jìn)行加載,來看具體代碼:

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.src = link.href
image.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文件的加載,然后調(diào)用document.fonts.load看字體是否加載完成,這樣就可以準(zhǔn)確監(jiān)聽到字體加載完成,但是這個(gè)api存在兼容性問題,來看具體表格:

怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體 

想要對(duì)這個(gè)api了解更多,可以前往 mdn 查看

對(duì)比繪制

對(duì)比繪制是什么意思呢?就是先設(shè)置一個(gè)沒有的字體,然后在設(shè)置我們需要的字體進(jìn)行對(duì)比,來看具體代碼:

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).data
ctx.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()

看完上述內(nèi)容,你們掌握怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站欄目:怎么在html5中使用canvas繪制網(wǎng)絡(luò)字體
分享地址:http://aaarwkj.com/article36/iihisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作品牌網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷、虛擬主機(jī)App設(shè)計(jì)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
亚洲国产日韩欧美综合久久| 日本精品中文字幕人妻| 亚洲欧美日韩校园春色| 亚洲精品中国一区二区久久| 日韩不卡免费一区二区三区视频 | 成人黄片免费在线播放| 亚洲日本国产精品第一页| 青青草视频免费公开播放| 超碰97精品在线观看| 在线国产视频一区二区三区| 中文字幕变态另类一区二区| 中午字幕人妻少妇久久| 国产av日韩精品一区二区三区| 国产精品女人毛片在线看| 精品国产美女主播在线| 日韩在线电影二区三区| 国产成人亚洲一区二区三区| 国产91在线视频播放| 亚洲欧美成人自偷自拍一区| 午夜福利激情视频在线| 国产综合永久精品日韩鬼片| 亚洲欧美制服另类国产| 日本一区二区视频播放网站| 日本在线人妻中文字幕| 日韩三级精品一区二区| 久久夜色精品国产高清不卡| 日本一区二区不卡高清| 黄色片一区二区三区四区| 亚洲欧美一区二区中文字幕| 国产视频不卡一区二区| 中文字幕日韩有码在线| 中文字幕av不卡一区| 国产日韩手机在线不卡视频| 欧美日韩国产另类久久| 久久成人免费在线电影| 国产又大又爽免费视频| 蜜臀91精品视频在线观看| 特黄特色的日本大片| 给我免费在线观看视频| 国产精品福利午夜在线| 日本h电影一区二区三区|