Javascript 如何在html画布中围绕文本绘制矩形?

Javascript 如何在html画布中围绕文本绘制矩形?,javascript,html,canvas,Javascript,Html,Canvas,我知道我在画布上读了一些关于上升和字体高度的东西,但我就是不明白 首先,为什么文本是从右到上绘制的,而不是像矩形那样从右到下绘制的。我在医生的任何地方都找不到。如果我想在一个字母周围画一个矩形,尤其是“y”或“p”——在基线以下的字母,我该怎么办 我有一个 我该怎么做才能在它周围画出矩形 提前谢谢 以下是在文本周围绘制矩形的一些关键点 如果希望文本从左上角对齐,则可以设置以下上下文对齐属性: context.textAlign='left'; // this is the default to

我知道我在画布上读了一些关于上升和字体高度的东西,但我就是不明白

首先,为什么文本是从右到上绘制的,而不是像矩形那样从右到下绘制的。我在医生的任何地方都找不到。如果我想在一个字母周围画一个矩形,尤其是“y”或“p”——在基线以下的字母,我该怎么办

我有一个

我该怎么做才能在它周围画出矩形


提前谢谢

以下是在文本周围绘制矩形的一些关键点

如果希望文本从左上角对齐,则可以设置以下上下文对齐属性:

context.textAlign='left';  // this is the default to align horizontally to the left
context.textBaseline='top';  // text will be aligned vertically to the top
可以使用以下上下文方法测量文本的水平宽度:

// set the font size and font face before measuring
context.font='14px verdana';
var textWidth=context.measureText('Hello').width;
没有本地画布方法来测量文本高度,但是对于我使用过的大多数字体和非极端字体大小,您可以得到高度的近似值,如下所示:

var lineHeight=fontsizeInPixels * 1.286;
示例代码和演示:

//获取对画布和上下文的引用
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var-fontsize=14;
var fontface='verdana';
var lineHeight=fontsize*1.286;
var text='在我周围画一个矩形';
ctx.font=fontsize+px+fontface;
var textWidth=ctx.measureText(text).width;
ctx.textAlign='左';
ctx.textb基线='top';
ctx.fillText(文本,20,50);
ctx.strokeRect(20、50、文本宽度、线宽)
画布{
边框:1px纯红;
}

以下是在文本周围绘制矩形的一些关键点

如果希望文本从左上角对齐,则可以设置以下上下文对齐属性:

context.textAlign='left';  // this is the default to align horizontally to the left
context.textBaseline='top';  // text will be aligned vertically to the top
可以使用以下上下文方法测量文本的水平宽度:

// set the font size and font face before measuring
context.font='14px verdana';
var textWidth=context.measureText('Hello').width;
没有本地画布方法来测量文本高度,但是对于我使用过的大多数字体和非极端字体大小,您可以得到高度的近似值,如下所示:

var lineHeight=fontsizeInPixels * 1.286;
示例代码和演示:

//获取对画布和上下文的引用
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var-fontsize=14;
var fontface='verdana';
var lineHeight=fontsize*1.286;
var text='在我周围画一个矩形';
ctx.font=fontsize+px+fontface;
var textWidth=ctx.measureText(text).width;
ctx.textAlign='左';
ctx.textb基线='top';
ctx.fillText(文本,20,50);
ctx.strokeRect(20、50、文本宽度、线宽)
画布{
边框:1px纯红;
}

首先,有一些误解:

  • 方法确实关闭了仍然打开的Path2D:即
    ctx.moveTo(10,10);ctx.lineTo(50,50);ctx.lineTo(30,50)将保留未关闭的路径。调用closePath()将为您创建最后一个
    ctx.lineTo(10,10)

    ctx.rect()
    因此始终是一个闭合路径,无需调用此方法。
    ctx.fill()
    将为您关闭路径。
    ctx.fillText()
    不生成路径,并且已经包含
    fill()
    方法,无需再次调用它
现在,为什么要指定基线而不是文本的顶部,这是因为默认情况下属性设置为
“bottom”
。如果需要,可以将其设置为
“top”

要获得文本中字母的位置和大小,可以使用以下方法

因此,对于您的示例,您可以以以下内容结束:

const canvas=document.querySelector(“canvas”);
const ctx=canvas.getContext(“2d”);
ctx.font=“50px Arial”;
//文本位置
常数x=50,y=50;
//要绘制的文本
const str=“你好yyyyqqppp”;
//要查找的角色
const chars_to_find=[“o”、“y”、“p”];
ctx.strokeStyle=“红色”;
//获取我们感兴趣的每个字符的索引
常数chars_indice=[];
for(设i=0;i

首先,有一些误解:

  • 方法确实关闭了仍然打开的Path2D:即
    ctx.moveTo(10,10);ctx.lineTo(50,50);ctx.lineTo(30,50)将保留未关闭的路径。调用closePath()将为您创建最后一个
    ctx.lineTo(10,10)

    ctx.rect()
    因此始终是一个闭合路径,无需调用此方法。
    ctx.fill()
    将为您关闭路径。
    ctx.fillText()
    不生成路径,并且已经包含
    fill()
    方法,无需再次调用它
现在,为什么要指定基线而不是文本的顶部,这是因为默认情况下属性设置为
“bottom”
。如果需要,可以将其设置为
“top”

获得职位