本文摘自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);
}
}
|
见效果图:

阅读剩余部分
相关阅读 >>
用canvas实现简单的下雪效果(附代码)
h5手机扫码怎么实现
word-wrap怎么自动换行?css强行自动换行教程
css中文字相关属性的介绍
h5设置或返回音频/视频播放的当前位置(以秒计)的属性currenttime
HTML5调用百度地图api获取当前位置并直接导航目的地的方法
HTML5优点的详细介绍
HTML5 web storage的图文详解
h5视频中背景音乐如何自动播放
h5实现可缩放的时钟动画
更多相关阅读请进入《HTML5》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » html5 canvas的绘制文本自动换行的示例代码