canvas绘制文本内容自动换行的实现代码


Posted in HTML / CSS onJanuary 14, 2019

原型要求:

要求制作一个邀请卡页面,其中标题字数是动态的,最多可显示2行,如果超出2行则第2行内容结尾添加省略号。根据产品妹子的性格,四行这个设置到时很大机会改,所以这里一定不能写死,结果前几天真的要求改成了最多可显示4行 ,其他照旧。产品妹子too young :)!

废话不说,下面贴代码,献丑了!上代码之前先看一下需要传的参数!!

图文并茂的参数说明,原谅我捉急的PS技术和设计

canvas绘制文本内容自动换行的实现代码

  • ctx: 画布的上下文环境
  • content: 需要绘制的文本内容
  • drawX: 绘制文本的x坐标
  • drawY: 绘制文本的y坐标
  • lineHeight:文本之间的行高
  • lineMaxWidth:每行文本的最大宽度
  • lineNum:最多绘制的行数
// 文字自动换行
function textPrewrap(ctx, content, drawX, drawY, lineHeight, lineMaxWidth, lineNum) {
    var drawTxt = ''; // 当前绘制的内容
    var drawLine = 1; // 第几行开始绘制
    var drawIndex = 0; // 当前绘制内容的索引

    // 判断内容是否可以一行绘制完毕
    if(ctx.measureText(content).width <= lineMaxWidth) {
        ctx.fillText(content.substring(drawIndex, i), drawX, drawY);
    } else {
        for (var i = 0; i <= content.length; i++) {
            drawTxt += content[i];
            if (ctx.measureText(drawTxt).width > lineMaxWidth) {
                if (drawLine === lineNum) {
                    // 最后一行添加省略号
                    ctx.fillText(content.substring(drawIndex, i) + '...', drawX, drawY);
                    break;
                } else {
                    // 不是最后一行的情况
                    ctx.fillText(content.substring(drawIndex, i + 1), drawX, drawY);
                    drawIndex = i + 1;  // 记录当前行最后一个字符串的下一个idnex,用于绘制下行第一个字
                    drawLine += 1;  // 行数+1
                    drawY += lineHeight; // 绘制内容的y坐标对应增加行高
                    drawTxt = ''; // 重置绘制的内容
                }
            }
        }
    }
}

意外发现

在绘制文字的过程中发现,绘制文字的y坐标是不是以文字上方做标准,一图胜多言,上图!

浏览器环境: chrome 71.0.3578.98(正式版本)(64 位)

字体大小为40px

绘制的y坐标为0时,可以看到文本再左上角只漏了一点点出来

绘制的y坐标为40时,可以看到文本可以完全显示

canvas绘制文本内容自动换行的实现代码

后记

这是一个比较冷门的代码效果,但是也希望可以帮到有需要的朋友,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
关于CSS Tooltips(鼠标经过时显示)的效果
Apr 10 HTML / CSS
CSS3正方体旋转示例代码
Aug 08 HTML / CSS
css3 伪元素和伪类选择器详解
Sep 04 HTML / CSS
使用CSS3制作饼状旋转载入效果的实例
Jun 23 HTML / CSS
初探CSS3中的calc()功能
Jul 14 HTML / CSS
css3实现文字扫光渐变动画效果的示例
Nov 07 HTML / CSS
详解CSS 3 中的 calc() 方法
Jan 12 HTML / CSS
HTML5之web workers_动力节点Java学院整理
Jul 17 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
Sep 10 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
Jan 29 HTML / CSS
CSS3实现模糊背景的三种效果示例
Mar 30 HTML / CSS
css弧边选项卡的项目实践
May 07 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
Jan 14 #HTML / CSS
html Table 表头固定的实现
Jan 22 #HTML / CSS
Html5如何唤起百度地图App的方法
Jan 27 #HTML / CSS
canvas学习笔记之绘制简单路径
Jan 28 #HTML / CSS
web页面录屏实现
Feb 12 #HTML / CSS
Canvas 文本转粒子效果的实现代码
Feb 14 #HTML / CSS
canvas学习笔记之2d画布基础的实现
Feb 21 #HTML / CSS
You might like
学习使用PHP数组
2006/10/09 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
js实现文字滚动效果
2016/03/03 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
幼儿园中秋节活动反思
2014/02/16 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书