計(jì)算文本寬度
1. 前言
有時(shí)候在繪制一行文本前可能想事先知道它的寬度,為什么會(huì)有這種需求呢?
比如,我們想給文本繪制個(gè)背景或者邊框,這時(shí)候就需要知道確切的文本寬度了。
2. 計(jì)算文本寬度
canvas 為我們提供了一個(gè)計(jì)算文本寬度的方法:measureText
方法,方法返回一個(gè) TextMetrics
對(duì)象,包含關(guān)于文本尺寸的信息,里面就有文本寬度。
我們看一個(gè)案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>慕課網(wǎng)Wiki</title>
<style>
#imooc{
border:1px solid #ccc;
}
</style>
</head>
<body>
<canvas id="imooc">您的瀏覽器不支持 HTML5 canvas 標(biāo)簽</canvas>
<script>
const canvas = document.getElementById('imooc');
canvas.width=400;
canvas.height=240;
const ctx = canvas.getContext('2d');
function drawBtn(str, x, y ){
var w = ctx.measureText(str).width; // 獲取繪制文本的寬度
var h = parseInt(ctx.font)
ctx.fillStyle="#456795";
ctx.fillRect(x-10,y-10,w+20,h+20)
ctx.fillStyle="#fff";
ctx.textBaseline="hanging"
ctx.fillText(str,x,y)
}
ctx.font="16px 微軟雅黑";
drawBtn("慕課Wiki",40,40)
ctx.font="18px 微軟雅黑";
drawBtn("Imooc教程 Hello World", 40, 90)
ctx.font="20px 微軟雅黑";
drawBtn("確認(rèn)", 40, 140)
</script>
<body>
</html>
運(yùn)行結(jié)果:

上面案例中,我們封裝了一個(gè)函數(shù),可以繪制自適應(yīng)大小的按鈕,讓我們拆分講解一下主要代碼。
-
先看繪制按鈕的封裝函數(shù)
drawBtn
,函數(shù)傳入了三個(gè)參數(shù),分別是繪制文本以及繪制文本的起點(diǎn)坐標(biāo) (x, y)。function drawBtn(str, x, y ){ ... }
(1)獲取到繪制文本的寬度和高度,其實(shí)文本的高度就是設(shè)置的文本字體的大小值,這里我們用了一個(gè)小技巧拿到了設(shè)置的文本大小。
var w = ctx.measureText(str).width; // 獲取到繪制文本的寬度w var h = parseInt(ctx.font) // 通過小技巧獲取到了文本高度h
(2)設(shè)置按鈕背景為 #456795 這個(gè)顏色,并且繪制了一個(gè)矩形,這里矩形坐標(biāo)我們向左上方移動(dòng)了10個(gè)像素,目的是給按鈕添加一個(gè)內(nèi)邊距,美觀一些,因?yàn)樽髠?cè)有10個(gè)像素邊距,右側(cè)也有10個(gè)像素邊距,所以我們給背景的矩形框的長(zhǎng)度增加了20個(gè)像素,高度同理,也增加了20個(gè)像素。
ctx.fillStyle="#456795"; ctx.fillRect(x-10,y-10,w+20,h+20)
(3)設(shè)置文字的顏色為白色,把文字的基線設(shè)置為
hanging
,這樣做的目的是將文本左上角和基線對(duì)齊,方便計(jì)算,我們也可以設(shè)置為其他值,不過計(jì)算起來會(huì)比較麻煩。ctx.fillStyle="#fff"; ctx.textBaseline="hanging"
(4)繪制文本。
ctx.fillText(str,x,y)
-
設(shè)置字體大小為16像素,調(diào)用封裝函數(shù)繪制文字。
ctx.font="16px 微軟雅黑"; drawBtn("慕課Wiki",40,40)
-
設(shè)置字體大小為18像素,調(diào)用封裝函數(shù)繪制文字。
ctx.font="18px 微軟雅黑"; drawBtn("Imooc教程 Hello World", 40, 90)
-
設(shè)置字體大小為20像素,調(diào)用封裝函數(shù)繪制文字。
ctx.font="20px 微軟雅黑"; drawBtn("確認(rèn)", 40, 140)
3. 方法整理
本小節(jié)我們學(xué)習(xí)了 measureText
方法 , 它們是 canvas 2D API 提供的獲取繪制文本的相關(guān)屬性的方法,該方法返回一個(gè) TextMetrics
對(duì)象,該對(duì)象包含關(guān)于文本尺寸的信息,里面就有文本寬度。
3.1 文本寬度 TextMetrics.width
TextMetrics.width 說明
- TextMetrics.width 是當(dāng)前要繪制文本在畫布上將要占用的寬度。
語(yǔ)法:
ctx.measureText(value);
變量說明:
屬性名 | 類型 | 說明 |
---|---|---|
value | String | 將要繪制的文本字符串。 |
4. 總結(jié)
本小節(jié)我們主要學(xué)習(xí)了利用 measureText
方法獲取繪制文本寬度。