Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在HTML画布上格式化文本_Javascript_Html_Canvas - Fatal编程技术网

Javascript 在HTML画布上格式化文本

Javascript 在HTML画布上格式化文本,javascript,html,canvas,Javascript,Html,Canvas,我正在使用HTML画布和香草javascript制作一个游戏。我是javascript新手,所以这可能比我想象的要容易。我有两个代表卡片的对象数组,每个对象都有一个40-100个字符的“文本”属性,它被动态地绘制到一张130 x 70px的卡片上 我需要格式化文本以适应卡130px的宽度限制,并在必要时创建新行 谢谢你的帮助 编辑以使其更清晰您可以使用画布API中的方法。 如中所述 canvas的measureText当前不支持测量高度上升+下降 下面的尝试使用硬编码的线宽值,在渲染文本之前必须

我正在使用HTML画布和香草javascript制作一个游戏。我是javascript新手,所以这可能比我想象的要容易。我有两个代表卡片的对象数组,每个对象都有一个40-100个字符的“文本”属性,它被动态地绘制到一张130 x 70px的卡片上

我需要格式化文本以适应卡130px的宽度限制,并在必要时创建新行

谢谢你的帮助

编辑以使其更清晰

您可以使用画布API中的方法。 如中所述

canvas的measureText当前不支持测量高度上升+下降

下面的尝试使用硬编码的线宽值,在渲染文本之前必须找到该值。确实提供了一种以编程方式查找它的方法

[编辑:感谢markE在下面的评论,它现在使用了大约1.286*的字体大小。]

所以,这里是肮脏的,必须有更好的方法来做到这一点,但无论如何

var input=document.querySelector'input'; input.ADDEVENTLISTER'keyup',write,false; var c=document.createElement'canvas',ctx=c.getContext'2d'; c、 宽度=400,c.高度=150;document.body.c; //卡的简单框对象 var-card={x:25,y:25,w:130,h:70}; ctx.fillStyle=cccc; ctx.fillRectcard.x,card.y,card.w,card.h; var-fontSize=12; ctx.font=fontSize+'px arial'; //利润乘数在这里被任意选择,只是因为它们很适合我的眼睛 变量边距={t:1.25*fontSize,l:7*fontSize,b:2*fontSize,r:7*fontSize}, marginsX=margins.l+margins.r, marginsY=margins.t+margins.b; //根据markE的建议,线宽设置为1.286*fontSize, //有关计算方法,请参见Ken的答案:https://stackoverflow.com/a/17631567/3702797 var lineHeight=1.286*fontSize; //只是一条捷径 var lineWidth=functiontext{ 返回ctx.measureTexttext.width; }; 函数写入{ var txt=此值; //重画我们的卡片 ctx.fillStyle=cccc; ctx.fillRectcard.x,card.y,card.w,card.h; //在任何空白处拆分输入,您可能需要更改它 var txtLines=txt.split/\s/; var i=0,maxWidth=card.w-marginsX; iflineWidthtxt[0]>card.w | | lineHeight>card.h-margins.t/4{ 控制台。警告“字体太大!!”; 回来 } whiletxtLines[i]{ //如果当前行与下一行合并的宽度不大于卡片宽度 如果txtLines[i+1]&线宽txtLines[i]+“”+txtLines[i+1]直译! 如果线宽txtlines[i]>maxWidth{ //添加带有最后两个字符的新索引,因为我们将添加破折号 txtLines.i+1,0; //如果它还是太大的话 而lineWidthtxtLines[i]>maxWidth{ var lastChars=txtLines[i]。长度-2; //将最后两个字符附加到新的数组索引中 txtLines[i+1]=txtLines[i].substringlastChars+txtLines[i+1]; //从我们当前的索引中删除它们 txtLines[i]=txtLines[i]。子字符串0,lastChars; } //添加最后的破折号 txtLines[i]+=-; } //我们的文字是否高于卡片高度? 如果线宽*i>card.h-marginsY{ //如果后面有更多的文字。。。 如果txtLines[i+1]{ //…而且它符合要求 如果lineWidthTXTLINES[i]+''+txtLines[i+1]您可以使用画布API中的方法。 如中所述

canvas的measureText当前不支持测量高度上升+下降

下面的尝试使用了在呈现文本之前必须查找的硬编码线宽值。提供了一种通过编程方式查找该值的方法

[编辑:感谢markE在下面的评论,它现在使用了大约1.286*的字体大小。]

所以,这里是肮脏的,必须有更好的方法来做到这一点,但无论如何

var input=document.querySelector'input'; input.ADDEVENTLISTER'keyup',write,false; var c=document.createElement'canvas',ctx=c.getContext'2d'; c、 宽度=400,c.height=150;document.body.appendChildc; //卡的简单框对象 var-card={x:25,y:25,w:130,h:70}; ctx.fillStyle=cccc; ctx.fillRectcard.x,card.y,card.w,card.h; var-fontSize=12; ctx.font=fontSize+'px arial'; //利润乘数在这里被任意选择,只是因为它们很适合我的眼睛 变量边距={t:1.25*fontSize,l:7*fontSize,b:2*fontSize,r:7*fontSize}, marginsX=margins.l+margins.r, marginsY=margins.t+margins.b; //根据markE的建议,线宽设置为1.286*fontSize, //有关计算方法,请参见Ken的答案:https://stackoverflow.com/a/17631567/3702797 var lineHeight=1.286*fontSize; //只是一条捷径 var lineWidth=functiontext{ 返回ctx.measureTexttext.width; }; 函数写入{ 变量 txt=该值; //重画我们的卡片 ctx.fillStyle=cccc; ctx.fillRectcard.x,card.y,card.w,card.h; //在任何空白处拆分输入,您可能需要更改它 var txtLines=txt.split/\s/; var i=0,maxWidth=card.w-marginsX; iflineWidthtxt[0]>card.w | | lineHeight>card.h-margins.t/4{ 控制台。警告“字体太大!!”; 回来 } whiletxtLines[i]{ //如果当前行与下一行合并的宽度不大于卡片宽度 如果txtLines[i+1]&线宽txtLines[i]+“”+txtLines[i+1]直译! 如果线宽txtlines[i]>maxWidth{ //添加带有最后两个字符的新索引,因为我们将添加破折号 txtLines.i+1,0; //如果它还是太大的话 而lineWidthtxtLines[i]>maxWidth{ var lastChars=txtLines[i]。长度-2; //将最后两个字符附加到新的数组索引中 txtLines[i+1]=txtLines[i].substringlastChars+txtLines[i+1]; //从我们当前的索引中删除它们 txtLines[i]=txtLines[i]。子字符串0,lastChars; } //添加最后的破折号 txtLines[i]+=-; } //我们的文字是否高于卡片高度? 如果线宽*i>card.h-marginsY{ //如果后面有更多的文字。。。 如果txtLines[i+1]{ //…而且它符合要求
iflineWidthtxtLines[i]+''+txtLines[i+1]快速粗略估计行高为1.286*字号。这是快速粗略的估计,但除非你的字体有异常的上移或下移,否则你应该不会有问题。在超小和超大的字体大小下,估计值确实不可靠,但这似乎不适用于130x70卡片大小的提问者。-非常感谢,这正是我需要的d、 做了一件好事!快速粗略估计行高是1.286*字体大小。这是快速粗略的,但除非你的字体有异常的上升或下降,否则你应该没事。估计值在超小和超大字体大小时会有偏差,但这似乎不适用于130x70卡片大小的提问者。-非常感谢,ex这正是我所需要的,真是一种享受