canvas教程

canvas文本绘制自动换行、字间距、竖排等实现(3)

字号+ 作者:H5之家 来源:H5之家 2018-02-11 18:05 我要评论( )

在CSS中,我们可以使用 writing-mode 改变文档流的方向,从而实现文字竖排,相关文章可以参见我之前的文章: 改变CSS世界纵横规则的writing-mode属性 ,或者购买我的 《CSS世界》 ,其中有详细介绍。 那在canvas中

在CSS中,我们可以使用 writing-mode 改变文档流的方向,从而实现文字竖排,相关文章可以参见我之前的文章:“ 改变CSS世界纵横规则的writing-mode属性 ”,或者购买我的 《CSS世界》 ,其中有详细介绍。

那在canvas中又该如何实现呢?

1. JS混合计算逐字排列

混合计算规则如下:全角字符竖排,英文数字等半角字符旋转排列。

下面是我扩展的竖排方法,同样MIT协议,可随意使用,保留上面一段作者和出处说明即可。

/** * @author zhangxinxu(.com) * @licence MIT * @description ?p=7362 */ CanvasRenderingContext2D.prototype.fillTextVertical = function (text, x, y) { var context = this; var canvas = context.canvas; var arrText = text.split(''); var arrWidth = arrText.map(function (letter) { return context.measureText(letter).width; }); var align = context.textAlign; var baseline = context.textBaseline; if (align == 'left') { x = x + Math.max.apply(null, arrWidth) / 2; } else if (align == 'right') { x = x - Math.max.apply(null, arrWidth) / 2; } if (baseline == 'bottom' || baseline == 'alphabetic' || baseline == 'ideographic') { y = y - arrWidth[0] / 2; } else if (baseline == 'top' || baseline == 'hanging') { y = y + arrWidth[0] / 2; } context.textAlign = 'center'; context.textBaseline = 'middle'; // 开始逐字绘制 arrText.forEach(function (letter, index) { // 确定下一个字符的纵坐标位置 var letterWidth = arrWidth[index]; // 是否需要旋转判断 var code = letter.charCodeAt(0); if (code <= 256) { context.translate(x, y); // 英文字符,旋转90° context.rotate(90 * Math.PI / 180); context.translate(-x, -y); } else if (index > 0 && text.charCodeAt(index - 1) < 256) { // y修正 y = y + arrWidth[index - 1] / 2; } context.fillText(letter, x, y); // 旋转坐标系还原成初始态 context.setTransform(1, 0, 0, 1, 0, 0); // 确定下一个字符的纵坐标位置 var letterWidth = arrWidth[index]; y = y + letterWidth; }); // 水平垂直对齐方式还原 context.textAlign = align; context.textBaseline = baseline; };

API名称是 fillTextVertical ,语法如下:

CanvasRenderingContext2D.fillTextVertical(text, x, y)

其中 text , x , y 3个参数和 fillText() 方法中的这3个参数含义是一样的,不赘述。

实现的效果是:英文数字等旋转,中文垂直排列。支持 textAlign 和 textBaseline 等基本设置。

您可以狠狠地点击这里: canavs文本竖排JS逐字计算实现demo

使用JS如下:

var canvas = document.querySelector('canvas'); var context = canvas.getContext('2d'); context.font = '24px STKaiti, sans-serif'; context.textAlign = 'center'; context.textBaseline = 'top'; context.fillTextVertical('anglebaby和黄晓明', canvas.width / 2, 0);

结果如下图所示:

2. 借助SVG <foreignObject>直接把CSS效果绘制上去

和自动换行实现类似,详细略。

五、结束语

当年CSS之所以一统天下就是在文本展现文字排版这一块非常方便。

看看SVG的文本展现,在看看canvas的文本呈现,难用的很。全靠友军衬托啊!

问题来了,CSS文本呈现这里厉害,那还需要canvas干什么?

因为canvas可以方便把文字转换成图片,例如一些广告工具等等,需要前端合成的,就需要canvas大放异彩了。

本文扩展的这些方法并未实际项目大规模验证,有疏漏之处在所难免,欢迎指正!

分享给小伙伴们:

本文标签: canvas,自动换行,字间距/">canvas,自动换行,字间距

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

  • 本类最热新闻

  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • HTML5 Canvas实现玫瑰曲线和心形图案的代码实例_html5教程技巧

      HTML5 Canvas实现玫瑰曲线和心形图案的代码实例_html5教程技巧

      2018-02-11 18:04

    • canvas实现按住鼠标移动绘制出轨迹的示例代码

      canvas实现按住鼠标移动绘制出轨迹的示例代码

      2018-02-10 17:01

    • 微信小程序canvas尺寸设置

      微信小程序canvas尺寸设置

      2018-02-10 15:07

    • 超炫的Canvas下雨动画

      超炫的Canvas下雨动画

      2018-02-10 15:00

    网友点评
    f