本文摘自PHP中文网,作者青灯夜游,侵删。
在使用 canvas 绘制某字符串的时候,我们可能想要让该字符串在某处按要求换行。那么应该如何实现,本文就来介绍一下,有兴趣的可以了解一下。本文介绍怎么解决canvas绘图过程中,drawText的换行问题,先看一个大家平时在canvas绘制文本都会遇到的问题:
一个150*100的canvas画布,加个边框明显边界
1 | <canvas id= "canvas" style= "border:solid 1px darkgoldenrod;" width= "200px" height= "100px" ></canvas>
|
我们先来看fillText()方法,strokeText()方法同理

1 2 3 4 5 6 | var c=document.getElementById( "canvas" );
var ctx=c.getContext( "2d" );
ctx.fillStyle= "#E992B9" ;
ctx.lineWidth=1;
var str = "假如生活欺骗了你,请不要悲伤!thank you!"
ctx.fillText(str,0,20);
|
可以看到fillText()在固宽的canvas中,字数过多的时候,并不会自动换行,我们可以增加canvas本身的宽度,但这不是解决问题的根本方法。还记得之前介绍canvas基本api的时候,有一个函数,context.measureText(text)
这个函数可以测量字体的宽高度,那就好办了,我们计算好我们字符串的长度加上一个大概的宽度,基本上可以处理这种换行的问题了。
下面看具体实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var c=document.getElementById( "canvas" );
var ctx=c.getContext( "2d" );
ctx.fillStyle= "#E992B9" ;
ctx.lineWidth=1;
var str = "假如生活欺骗了你,请不要悲伤!thank you!"
var lineWidth = 0;
var canvasWidth = c.width;
var initHeight=15;
var lastSubStrIndex= 0;
for (let i=0;i<str.length;i++){
lineWidth+=ctx.measureText(str[i]).width;
if (lineWidth>canvasWidth){
ctx.fillText(str.substring(lastSubStrIndex,i),0,initHeight);
initHeight+=20;
lineWidth=0;
lastSubStrIndex=i;
}
if (i==str.length-1){
ctx.fillText(str.substring(lastSubStrIndex,i+1),0,initHeight);
}
}
|
见效果图:

阅读剩余部分
相关阅读 >>
解析HTML5中的标签嵌套规则
css怎么实现文本的垂直排列
HTML5 details标签的作用是什么?<details>标签的使用方法介绍(附使用实例)
详细介绍HTML5新标签的兼容性处理(图)
h5在canvas中实现自定义路径动画
h5+js实现本地文件读取和写入
如何利用HTML5实现等待加载动画的效果
实现弹幕效果的方法总结(css和canvas)
zip压缩和解压技术在HTML5中的应用的代码案例(图)
h5的标题书写问题
更多相关阅读请进入《HTML5》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » html5 canvas的绘制文本自动换行的示例代码