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 相关文章推荐
CSS3混合模式mix-blend-mode/background-blend-mode简介
Mar 15 HTML / CSS
css3 线性渐变和径向渐变示例附图
Apr 08 HTML / CSS
CSS3 text shadow字体阴影效果
Jan 08 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
Apr 26 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
Jul 13 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
Apr 21 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
Aug 17 HTML / CSS
HTML5 LocalStorage 本地存储详细概括(多图)
Aug 18 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
Dec 29 HTML / CSS
HTML5 weui使用笔记
Nov 21 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
Sep 10 HTML / CSS
css3中2D转换之有趣的transform形变效果
Feb 24 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+Ajax实现表单验证的详解
2013/06/25 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
javascript onmouseout 解决办法
2010/07/17 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
python获取中文字符串长度的方法
2018/11/14 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
小学教学随笔感言
2014/02/26 职场文书
实习计划书范文
2015/01/16 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015年共青团工作总结
2015/05/15 职场文书
入党自传范文2015
2015/06/26 职场文书
在人间读书笔记
2015/06/30 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书