需求:封装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")[], //canvas对象,必填,不填写默认找到页面中的第一个canvas
canvasWidth:, //canvas的宽度
drawStartX:, //绘制字符串起始x坐标
drawStartY:, //绘制字符串起始y坐标
lineHeight:, //文字的行高
font:"24px 'Microsoft Yahei'", //文字样式
text:"请修改掉默认的配置", //需要绘制的文本
drawWidth:, //文字显示的宽度
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(,,canvas.width,canvas.height); //绘制文字
ctx.font = settings.font;
ctx.fillStyle = settings.color;
// @ts-ignore
ctx.textAlign = settings.textAlain;
let lineWidth = ; //当前行的绘制的宽度
let lastTextIndex = ; //已经绘制上canvas最后的一个字符的下标
//由于改变canvas 的高度会导致绘制的纹理被清空,所以,不预先绘制,先放入到一个数组当中
let arr = [];
for(let i = ; i< settings.text.length; i++){
//获取当前的截取的字符串的宽度
lineWidth = ctx.measureText(settings.text.substr(lastTextIndex,i-lastTextIndex)).width; if(lineWidth > settings.drawWidth){
//判断最后一位是否是标点符号
if(judgePunctuationMarks(settings.text[i-])){
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex));
lastTextIndex = i;
}else{
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex-));
lastTextIndex = i-;
}
}
//将最后多余的一部分添加到数组
if(i === settings.text.length - ){
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex+));
}
} //根据arr的长度设置canvas的高度
canvas.height = arr.length*settings.lineHeight+settings.drawStartY; ctx.font = settings.font;
ctx.fillStyle = settings.color;
for(let i =; i<arr.length; i++){
ctx.fillText(arr[i],settings.drawStartX,settings.drawStartY+i*settings.lineHeight);
}
//判断是否是需要避开的标签符号
function judgePunctuationMarks(value) {
let arr = [".",",",";","?","!",":","\"",",","。","?","!",";",":","、"];
for(let i = ; 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代码中有遍历,不可直接使用

js将文字填充与canvas画布再转为图片的更多相关文章

  1. 关于Chrome和Opera中draw Image()方法无法在canvas画布中绘制图片的问题

    var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); var img=d ...

  2. selenium webdriver 实现Canvas画布自动化测试

    https://blog.csdn.net/xiaoguanyusb/article/details/80324210 由借鉴意义, 转过来 canvas 是一个画布,定位元素时只能定位到画布上,如下 ...

  3. H5如何用Canvas画布生成并保存带图片文字的新年快乐的海报

    摘要:初略算了算大概有20天没有写博客了,原本是打算1月1号元旦那天写一个年终总结的,博客园里大佬们都在总结过去,迎接将来,看得我热血沸腾,想想自己也工作快2年了,去年都没有去总结一下,今年势必要总结 ...

  4. Particles.js基于Canvas画布创建粒子原子颗粒效果

    文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...

  5. canvas 画布 文字描边

    总结一下,canvas 画布 文字描边的2种方法以及其不同的视觉效果: 效果图: 具体代码: <canvas id="canvas" width="800" ...

  6. [技术博客]海报图片生成——小程序canvas画布

    目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...

  7. H5 新增标签canvas 画布

    canvas是写在body中的标签,设置宽高后,通过JS来往其中绘制想要的内容, canvas可以理解为一个画板,而JS就是你的画笔. 1.获取到画布 var canvas = document.ge ...

  8. [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

    接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...

  9. [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)

    本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...

随机推荐

  1. asdfo123是神!!!

      正常代码不写#define @zdx 平时刷题不写freopen @liuziwen 循环内部不写return 0 @asdfo123 主程序内不写char array @asdfo123 输出时 ...

  2. 虚拟机,安装tools时出现“安装程序无法继续解决

    报错:虚拟机安装了win10,安装tools时出现“安装程序无法继续.Microsoft Runtime DLL安装程序未能安装” 解决步骤: 双击安装程序,在它报以上错时不要点确定 这个时候按下窗口 ...

  3. 备份和还原 Linux 上的 SQL Server 数据库

    备份数据库 在下面的示例sqlcmd连接到本地 SQL Server 实例,并采用完整备份的名为的用户数据库demodb. sqlcmd -S localhost -U SA -Q "BAC ...

  4. SDN阅读作业(二)

    前言碎碎念 当我看到这个全英论文以后,身体和心理都出现了戒断反应,让人无比难受,毕竟自己很久没做过英语阅读理解了.总之,在舍友大佬的帮助下以及各款翻译软件的鼎力支持之下(通篇读完后还是找了中文文献来对 ...

  5. WEB API 的设计与开发

  6. MySQL事务部分回滚-回滚到指定保存点

    我们可以在mysql事务处理过程中定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态. 定义保存点,以及回滚到指定保存点前状态的语法如下. 定义保存点---SAVEPOINT 保存点名; ...

  7. Java_jdbc 基础笔记之七 数据库连接(方法升级)

    之前的更新方法 public static void update(String sql) { Connection conn = null; Statement statement = null; ...

  8. 如何连接到远程windows服务器

    在学习和工作中,有些时候我们需要连接到远程服务器,这里,我来演示如何连接到windows服务器. 1. 首先利用快捷键win+r打开运行,或者在搜索框搜索“运行”,然后在运行框输入mstsc,点击确定 ...

  9. Win10 LTSC 2019 长期支持版

    win 10 LTSB 2016 文件名:cn_windows_10_enterprise_2016_ltsb_x86_dvd_9057089.iso (2.62GB) 语言: Chinese – S ...

  10. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...