需求:封装consul服务的webUI;

原因:展示consul的服务信息时,需要嵌套动画,由于其没有内置的icon,所以将服务name放于图片位;

分析:展示信息时采用了卡片式的服务布局,缩放式的服务卡片,只有将服务名称作为图片才能实现动画效果;

最基础动画:->

实现:将服务名称置于canvas画布中,再将画布转为图片

代码实现:

1、获取dom

/*** 获取service卡片中img对象并赋值src* @param serviceName 服务名称*/setImageSrc(serviceName) {//因为src不是该HTMLElement类型的属性,而是HTMLImageElement。let image = <HTMLImageElement>document.querySelector("#nameImage" + serviceName);image.src = this.canvasWrapText({canvas:<HTMLElement>document.querySelector("#canvas" + serviceName),text: serviceName});}

2、画布=>图片

/*** 绘制文字到canvas,判断换行位置,和设置canvas高度* @param options canvas画布对象*/canvasWrapText(options) {let settings = {canvas:document.getElementsByTagName("canvas")[0], //canvas对象,必填,不填写默认找到页面中的第一个canvascanvasWidth:240, //canvas的宽度drawStartX:50, //绘制字符串起始x坐标drawStartY:30, //绘制字符串起始y坐标lineHeight:30, //文字的行高font:"24px 'Microsoft Yahei'", //文字样式text:"请修改掉默认的配置", //需要绘制的文本drawWidth:220, //文字显示的宽度color:"#000000", //文字的颜色textAlain: "center",backgroundColor:"#ffffff", //背景颜色
    };//将传入的配置覆盖掉默认配置if(!!options && typeof options === "object"){for(let i in options){settings[i] = options[i];}}//获取2d的上线文开始设置相关属性let canvas = settings.canvas;canvas.width = settings.canvasWidth;let ctx = canvas.getContext("2d");//绘制背景色ctx.fillStyle = settings.backgroundColor;ctx.fillRect(0,0,canvas.width,canvas.height);//绘制文字ctx.font = settings.font;ctx.fillStyle = settings.color;// @ts-ignorectx.textAlign = settings.textAlain;let lineWidth = 0; //当前行的绘制的宽度let lastTextIndex = 0; //已经绘制上canvas最后的一个字符的下标//由于改变canvas 的高度会导致绘制的纹理被清空,所以,不预先绘制,先放入到一个数组当中let arr = [];for(let i = 0; i< settings.text.length; i++){//获取当前的截取的字符串的宽度lineWidth = ctx.measureText(settings.text.substr(lastTextIndex,i-lastTextIndex)).width;if(lineWidth > settings.drawWidth){//判断最后一位是否是标点符号if(judgePunctuationMarks(settings.text[i-1])){arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex));lastTextIndex = i;}else{arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex-1));lastTextIndex = i-1;}}//将最后多余的一部分添加到数组if(i === settings.text.length - 1){arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex+1));}}//根据arr的长度设置canvas的高度canvas.height = arr.length*settings.lineHeight+settings.drawStartY;ctx.font = settings.font;ctx.fillStyle = settings.color;for(let i =0; i<arr.length; i++){ctx.fillText(arr[i],settings.drawStartX,settings.drawStartY+i*settings.lineHeight);}//判断是否是需要避开的标签符号
    function judgePunctuationMarks(value) {let arr = [".",",",";","?","!",":","\"",",","。","?","!",";",":","、"];for(let i = 0; i< arr.length; i++){if(value === arr[i]){return true;}}return false;}return canvas.toDataURL();}

注:关于代码实现中的关键节点都有详细的注解,此处不再累赘。

3、html:

<div class="member-image"><!--为了将文字渲染为图片所设置的样例canvas--><canvas id="canvas{{card.name}}" width="" height="" style="background-color:#ffffff;display: none;"></canvas><img id="nameImage{{card.name}}" alt="Member">
</div>

注:html代码中有遍历,不可直接使用

转载于:https://www.cnblogs.com/PearlRan/p/11248556.html

js将文字填充与canvas画布再转为图片相关推荐

  1. canvas画布加载图片 - Kaiqisan

    canvas画布加载图片 就是往画布里面添加一些本地的或者网络上的图片.从而使画布图文并茂. 关键代码 let image = new Image(): 这里新增一个图片对象,它是一个图像的载体.但通 ...

  2. canvas画布上平铺图片绘制文本

    1️⃣知识点①:如何在canvas画布上平铺图片: ⚠️知识点实现: <!DOCTYPE html> <html><head><meta charset=&q ...

  3. 如何抓取canvas画布中的图片

    如何抓取canvas画布中的图片 网络页面中存放图片的形式有很多 这里说一下canvas格式时怎么获取 String fullImgJs = "return document.getElem ...

  4. Android Canvas画布上放图片,保存图片为黑色,转换成PNG格式还是黑色,画布设置白色则图片不显示,特例出完美的解决办法

    网上都说 bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);替换成bitmap.compress(Bitmap.CompressFormat.J ...

  5. 【图文保存为图片并下载到相册】海报 h5, 微信和 ios 不支持 和 用uniapp 微信小程序 使用canvas把页面转为图片保存到手机

    第一种,[图文保存为图片并下载到相册] h5, 微信和 ios 不支持 1,安装html2canvas npm install html2canvas --save 2,在需要的页面引入 import ...

  6. js将连接生成二维码,并转为图片

    <div id="code"></div> <img id="img"/><script type="tex ...

  7. canvas文字居中;canvas画布文字右对齐;canvas画布文字左对齐;canvas文字自动换行;canvas设置行间距;

    canvas参考手册 场景:画布绘制文本,使用 context.fillText(text,x,y,maxWidth).文本对其也就是设置xy坐标问题. 以下的画布设定宽度假设都是width:500 ...

  8. html+js+显示文字时钟,JavaScript canvas实现文字时钟

    本文实例为大家分享了canvas实现文字时钟的具体代码,供大家参考,具体内容如下 先看看效果图 代码 Document 您的浏览器不支持canvas var c=document.getElement ...

  9. Canvas画布、SVG图片

    Canvas 一.canvas 1.<canvas>标签:画布标签 (height,width,半透明),本身不具备绘图能力,可以通过脚本(通常指js)来实现 width:设置画布宽度,默 ...

最新文章

  1. Mysql:is not allowed to connect to this MySQL server
  2. Linq to sql和lambda
  3. C# WinForm开发系列 - Excel
  4. 学习python的基础是什么_学python需要什么基础
  5. Terminal终端的快捷键
  6. 2015年关注的技术书籍
  7. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置
  8. java socket 读不到数据_Java Socket通信以及可能出现的问题解决
  9. 直流无刷电机无感检测电路原理
  10. php mds函数,MDSRank类解析 - linux_hunter的个人页面 - OSCHINA - 中文开源技术交流社区...
  11. 家庭影院.液晶电视.液晶电视连接电脑全功略
  12. git send-email 时unknown AUTH解决方法
  13. 微信公众平台开发接口配置URL index.php和token
  14. AirServer2023免费无线Mac和PC电脑屏幕镜像投屏工具
  15. Ubuntu下安装Datax-web数据交换平台
  16. 深圳大学2019计算机科学考研分数,深圳大学2019年考研复试分数线已发布
  17. NAS、SAN、ISCSI存储简单理解
  18. python字符串按首字母排序,Python按字母順序排序字符串,首先是小寫
  19. centos6.4下安装fetion
  20. YOLO与voc格式互转,超详细

热门文章

  1. 用SAP BSP应用实现图片灰度效果
  2. SAP Fiori和Vue的结合会给企业级应用软件的UI开发带来什么?
  3. 利用CRM中间件Middleware从ERP下载Customer Material的常见错误
  4. oracle 同义词_Oracle迁移到MySQL,必须要搞明白这几个问题
  5. svn怎么看未提交修改了哪些文件_Git与SVN的区别
  6. JAVA复习5(集合——HashSet)
  7. mysql 存储过程游标删除_mysql数据库存储过程游标循环,提前退出
  8. linux重启sshd命令,重启sshd服务
  9. 个人博客系统的设计与实现_一款小而美的博客系统,专为程序员设计
  10. java spring 服务器关闭连接_java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常...