canvas'尺寸一次无法正确显示
canvas' size could not display correctly at once
作为前端初学者,我才刚刚开始学习canvas。我正在尝试绘制一些文字。但是 canvas 的大小不能一下子正确显示:
我创建 canvas:
的代码
const message = input.value;
let ctx = canvas.getContext('2d')
let metrics = ctx.measureText(message);
let textWidth = metrics.width*2;
canvas.width = textWidth;
canvas.height = 200;
ctx.font = "normal 30px Verdana";
ctx.fillStyle = "#000000";
ctx.fillText(message, 30, 200);
<input id=input value="init message" />
<canvas id=canvas></canvas>
结果是:enter image description here
如您所见,消息不能完全显示,但是当我再次点击运行功能draw()
按钮时,canvas可以完全显示:
enter image description here
谁能告诉我为什么会这样。
您需要做几件事:
- 设置字体后调用measureText,否则宽度不正确
- 更改 canvas 尺寸后,您需要重置字体
在您的代码中,您需要设置两次字体。
首先在我们测量之前,第二个在我们改变 canvas 宽度和高度之后;我在示例中添加了一个 console.log
,您可以看到在 canvas 更改尺寸后,字体更改为默认;
这是一个工作示例:
const message = "Hello World"
const font = "normal 30px Verdana"
let canvas = document.getElementById("c");
let ctx = canvas.getContext('2d');
ctx.font = font;
let metrics = ctx.measureText(message);
canvas.width = metrics.width * 2;
canvas.height = 100;
console.log(ctx.font)
ctx.font = font;
ctx.fillText(message, 30, 90);
canvas {
border: 2px solid #0000AA
}
<canvas id="c"></canvas>
作为前端初学者,我才刚刚开始学习canvas。我正在尝试绘制一些文字。但是 canvas 的大小不能一下子正确显示: 我创建 canvas:
的代码const message = input.value;
let ctx = canvas.getContext('2d')
let metrics = ctx.measureText(message);
let textWidth = metrics.width*2;
canvas.width = textWidth;
canvas.height = 200;
ctx.font = "normal 30px Verdana";
ctx.fillStyle = "#000000";
ctx.fillText(message, 30, 200);
<input id=input value="init message" />
<canvas id=canvas></canvas>
结果是:enter image description here
如您所见,消息不能完全显示,但是当我再次点击运行功能draw()
按钮时,canvas可以完全显示:
enter image description here
谁能告诉我为什么会这样。
您需要做几件事:
- 设置字体后调用measureText,否则宽度不正确
- 更改 canvas 尺寸后,您需要重置字体
在您的代码中,您需要设置两次字体。
首先在我们测量之前,第二个在我们改变 canvas 宽度和高度之后;我在示例中添加了一个 console.log
,您可以看到在 canvas 更改尺寸后,字体更改为默认;
这是一个工作示例:
const message = "Hello World"
const font = "normal 30px Verdana"
let canvas = document.getElementById("c");
let ctx = canvas.getContext('2d');
ctx.font = font;
let metrics = ctx.measureText(message);
canvas.width = metrics.width * 2;
canvas.height = 100;
console.log(ctx.font)
ctx.font = font;
ctx.fillText(message, 30, 90);
canvas {
border: 2px solid #0000AA
}
<canvas id="c"></canvas>