如果文本中包含 "\n",我似乎无法将文本添加到画布上。我的意思是,换行符不会显示/起作用。
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
以上代码将在一行上绘制"s ome \n <br/> thing"
。
这是fillText的限制还是我的问题?"\n"存在但没有被打印出来,也不起作用。
如果文本中包含 "\n",我似乎无法将文本添加到画布上。我的意思是,换行符不会显示/起作用。
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
以上代码将在一行上绘制"s ome \n <br/> thing"
。
这是fillText的限制还是我的问题?"\n"存在但没有被打印出来,也不起作用。
\n
。另外,通常情况下,获取文本框的尺寸也是很有用的,因此multiMeasureText()
返回宽度和高度两个参数。你可以在这里查看代码:http://jsfiddle.net/jeffchan/WHgaY/76/
ctx.fillText
的坐标即可。ctx.fillText("line1", w,x,y,z)
ctx.fillText("line2", w,x,y,z+20)
我认为你仍然可以依靠CSS
ctx.measureText().height doesn’t exist.
var d = document.createElement(”span”);
d.font = “20px arial”
d.textContent = “Hello world!”
var emHeight = d.offsetHeight;
from: http://www.html5rocks.com/en/tutorials/canvas/texteffects/
ctx.save()
,然后 ctx.font = '12pt Arial'
,最后 parseInt(ctx.font, 10)
。请注意,我在设置时使用了“pt”。它将转换为PX,并能够转化为字体高度的数字以供使用。 - Eric Hodonsky我因为遇到同样的问题而发现了这个。我正在使用可变字体大小,所以这个方法考虑了这一点:
var texts=($(this).find('.noteContent').html()).split("<br>");
for (var k in texts) {
ctx.fillText(texts[k], left, (top+((parseInt(ctx.font)+2)*k)));
}
.noteContent是用户编辑的可编辑div(嵌套在jQuery each函数中),ctx.font是"14px Arial"(请注意像素大小首先出现)
<p>
元素,并使用Javascript将其定位。fillText()
和 strokeText()
,你可以做出超越 CSS 能力的事情。 - Towervar c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
let text = "Hello World \n Hello World 2222 \n AAAAA \n thisisaveryveryveryveryveryverylongword. "
ctx.font = "20px Arial";
fillTextCenter(ctx, text, 0, 0, c.width, c.height)
function fillTextCenter(ctx, text, x, y, width, height) {
ctx.textBaseline = 'middle';
ctx.textAlign = "center";
const lines = text.match(/[^\r\n]+/g);
for(let i = 0; i < lines.length; i++) {
let xL = (width - x) / 2
let yL = y + (height / (lines.length + 1)) * (i+1)
ctx.fillText(lines[i], xL, yL)
}
}
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #000;"></canvas>
如果您想将文本大小适应画布,您还可以在这里进行检查。
Canvas元素不支持换行符'\n',制表符'\t'或<br/>标记。
试一试:
var newrow = mheight + 30;
ctx.fillStyle = "rgb(0, 0, 0)";
ctx.font = "bold 24px 'Verdana'";
ctx.textAlign = "center";
ctx.fillText("Game Over", mwidth, mheight); //first line
ctx.fillText("play again", mwidth, newrow); //second line
或者可能是多行:
var textArray = new Array('line2', 'line3', 'line4', 'line5');
var rows = 98;
ctx.fillStyle = "rgb(0, 0, 0)";
ctx.font = "bold 24px 'Verdana'";
ctx.textAlign = "center";
ctx.fillText("Game Over", mwidth, mheight); //first line
for(var i=0; i < textArray.length; ++i) {
rows += 30;
ctx.fillText(textArray[i], mwidth, rows);
}
我针对这个问题的 ES5 解决方案:
var wrap_text = (ctx, text, x, y, lineHeight, maxWidth, textAlign) => {
if(!textAlign) textAlign = 'center'
ctx.textAlign = textAlign
var words = text.split(' ')
var lines = []
var sliceFrom = 0
for(var i = 0; i < words.length; i++) {
var chunk = words.slice(sliceFrom, i).join(' ')
var last = i === words.length - 1
var bigger = ctx.measureText(chunk).width > maxWidth
if(bigger) {
lines.push(words.slice(sliceFrom, i).join(' '))
sliceFrom = i
}
if(last) {
lines.push(words.slice(sliceFrom, words.length).join(' '))
sliceFrom = i
}
}
var offsetY = 0
var offsetX = 0
if(textAlign === 'center') offsetX = maxWidth / 2
for(var i = 0; i < lines.length; i++) {
ctx.fillText(lines[i], x + offsetX, y + offsetY)
offsetY = offsetY + lineHeight
}
}
关于此问题的更多信息,请参见我的博客。
fillText()
并使用字体高度进行分隔,要么使用 https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/measureText - 或者使用下面非常复杂的“解决方案”之一,但不使用 TextMetrics... - Andrew