前言

公司的产品同学看到朋友圈疯传的这张图后。一拍脑袋,决定做个H5版本的来推广一波。

需求如下:

  1. 文字变成可以点击的,而且还要能够变色(闪瞎有木有)

  2. 中间的姓名换成用户的微信头像

  3. 点击button后,将canvas的操作结果保存成图片,来现微信长按保存到本地的功能。

难点总结:

  1. 页面元素canvas基本的api画到画布上(要解决显示自适应的问题);

  2. 如何实现点击canvas,识别点击文字的对应位置;

  3. 图片保存的api;

canvas的基本绘制和自适应

代码部分请忽略css样式

canvas初始化

html

<canvas id="test"></canvas>
var canvas = document.getElementById('test'),
ctx = canvas.getContext('2d');

js | canvas自适应方案

  1. 等比公式:设计图元素尺寸/设计图宽度 = 显示图元素尺寸/移动设备像素宽度;

  2. 推导: 显示图元素尺寸 = 设计图元素尺寸*(移动设备像素宽度/设计图宽度);

  3. 定义: rate= 移动设备像素宽度/设计图宽度;

var width = document.documentElement.clientWidth,
//自适应比率计算
rate = (document.documentElement.clientWidth/ 960).toFixed(2),
height = rate*1540,

js | canvas面向对象的元素绘制方法

  1. 经由高人指点,将canvas内部的元素记录成一个个记录了颜色大小坐标、等属性的对象。

  2. 这样可以将元素分为几类:简单几何图形(圆,矩形等)、文字、图片这几类;

  3. 同类元素可以用相同的方法绘制(请务必get此技能

canvas绘制文字

baseColor = '#000';

//canvas文字对象
var textArr = [
{num:0, has_click: 0, worth:750000, x : 60, y : 50+60, fontSize : 25, text : '英雄联盟', color: baseColor,isEn : true },
{num:1, has_click: 0, worth:750000, x : 310/3, y : 50+650/3, fontSize : 20, text : '守望先锋', color: baseColor }
]; //转为自适应文字对象
var getTextScope = function(textArr){
var arr = [];
textArr.forEach(function(item){
item.x = item.x * rate;
item.y = item.y * rate;
item.fontSize = item.fontSize * rate;
//计算文字对象在canvas中的触摸范围
item.r = item.x + (item.isEn ? item.text.length / 2 : item.text.length) * item.fontSize;
item.b = item.y + item.fontSize;
arr.push(item);
});
return arr;
}; var newArr = getTextScope(textArr); //绘制文字方法
var fillTextArr = function(el, textArr){
textArr.forEach(function(item){
el.font = item.fontSize + 'px Microsoft Yahei Helvetica Neue Helvetica, STHeiTi, Arial, sans-serif ';
el.textAlign= 'left';
el.textBaseline = 'top';
el.fillStyle = item.color;
el.fillText(item.text, item.x, item.y);
//绘制文字的触摸识别范围(调试用)
el.beginPath();
el.rect(item.x, item.y, item.r - item.x, item.b - item.y);
el.stroke();
});
}; fillTextArr(canvas,newArr)

canvas绘制图片

html
页面隐藏元素加载canvas所需要用到的img元素,也可以新建img对象来处理。

<footer class="footer">
<div class="img-source hide">
<img src="/images/avater.jpg" alt="" id="avater"/>
<img src="/images/avater-bg_05.png" alt="" id="avaterBg"/>
<img src="/images/3.jpg" alt="" id="img3"/>
<img src="/images/21060715code_img.jpg" alt="" id="code"/>
<img src="/images/canvas_tag.png" alt="" id="scan"/>
</div>
</footer>

js

绘制图片的函数

var drawImages = function(el, arr){
arr.forEach(function(item){
el.drawImage(document.getElementById(item.id), item.x * rate, item.y * rate, item.w * rate, item.h * rate);
});
}; var avatar = [
{id : 'avater', x : 106, y : 50+95, w : 340/3, h : 340/3},
{id : 'avater', x : 106, y : 50+95, w : 340/3, h : 340/3},
{id : 'avaterBg', x : 100, y : 50+90, w : 375/3, h : 366/3}
]; drawImages(ctx, avatar);

canvas元素点击交互

js
item.r、item.b、item.x、item.y在上文var newArr = getTextScope(textArr);中已经获取;

//判断点击的点是否在范围内

var isInText = function(item, p){
if(p.x > item.x && p.x < item.r && p.y > item.y && p.y < item.b) {
return true;
}else {
return false;
}
};
//获取元素所在区域范围的函数

var getEventPosition =  function(ev){
var x, y;
if (ev.layerX || ev.layerX == 0) {
x = ev.layerX;
y = ev.layerY;
} else if (ev.offsetX || ev.offsetX == 0) { // Opera
x = ev.offsetX;
y = ev.offsetY;
}
return {x: x, y: y};
};

交互事件实例

canvas.addEventListener('click', function(e){
//获取点击坐标
var p = getEventPosition(e); //遍历欧判断是否点击到某元素
newArr.forEach(function(item, i){
//判断是否点击到元素进行分别操作
if(isInText(item, p)){
//点击到某元素的操作
}
});
}, false);

现在介绍了canvas绘制的基础操作,下一节就会写到项目的实践部分。

(1/2)Canvas的交互&存为图片-基本篇的更多相关文章

  1. js实现svg图形转存为图片下载

    我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...

  2. js实现svg图形转存为图片下载[转]

    我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...

  3. H5 中html 页面存为图片并长按 保存

    最近接到的一个新需求:页面一个静态H5,中间有一页是输入信息,然后跳转到最后一页,自动将页面生成图片,用户可以长按图片保存到手机上. 展示一下最后一页的样子: 刚拿到这个需求,在网上看了很多文章,最普 ...

  4. 图片采用base64压缩,可以以字符串的形式传送base64给服务端转存为图片

    (function () { var coverImage = document.querySelector('<div id="coverImage">file< ...

  5. 将HTML5 Canvas的内容保存为图片借助toDataURL实现

    将HTML5 Canvas的内容保存为图片主要思想是借助Canvas自己的API - toDataURL()来实现,具体实现如下,感兴趣的朋友可以参考下哈,希望对你有所帮助 <html> ...

  6. Canvas引入跨域的图片导致toDataURL()报错的问题的解决

    本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ...

  7. HTML5 Canvas 小例子 旋转的图片

    <一>CSS部分 @charset "utf-8"; *{ padding:; margin:; outline: none; } #canvas{ position: ...

  8. PHP《将画布(canvas)图像保存成本地图片的方法》

    用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...

  9. 使用的是html5的canvas将文字转换成图片

    当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...

随机推荐

  1. 小记:音频格式转化ByPython(下)

    上文中我们已经大致明白了pydub库的使用方法,今天的目标是写个爬虫爬取歌曲信息. 关于网络爬虫,Python的标准库里是有相应的包的,可以直接打开:https://docs.python.org/z ...

  2. 0x01 向日葵日志溯源

    1.简介 向日葵工具具有linux桌面系统版本,在应急场景中,攻击者通过向日葵远控linux实现入侵是一种常见手法,通过分析向日葵的服务日志,可以分析出安全事件时间发生点前后有无向日葵远控的行为,但由 ...

  3. Spring Boot项目微信云托管入门部署

    微信云托管本身是一个服务器,里面的软件都已经配置好了,直接使用即可,适用于一些简单部署的项目.直接把项目直接上传到服务器即可.无需各种繁琐的软件配置和打包,微信云托管统统给你搞定.而且系统会根据使用量 ...

  4. 二进制部署1.23.4版本k8s集群-1-系统安装及环境准备

    1. 致谢 这篇文章参考了老男孩王导的视频,在此表示感谢和致敬! 2. 安装CentOS操作系统 系统镜像:CentOS-7-x86_64-DVD-2009.iso 安装过程略. 3. 环境准备 3. ...

  5. tp6 的安装步骤 及简易命令

    1:https://www.kancloud.cn/manual/thinkphp6_0/1037481 官网下载 composer create-project topthink/think tp6 ...

  6. 编写Python代码的注意事项

    1.标识符 标识符是定义的名称,包括类名.变量名等等 标识符的大小写是敏感的,且第一个字符必须是字母表中的字母或"_" 在python3中,中文可被用作变量名 不能使用Python ...

  7. LGP5363题解

    感觉博弈题都是高大上神秘结论... 感谢@KaiSuoShuTong 开锁疏通愿意教我这题的博弈部分/qq 考虑每次移动棋子,实际上是有一车 \(a_i\),每次操作相当于令 \(a_i-c,a_{i ...

  8. CF1228E题解

    设 \(f_{i,j}\) 为恰好 \(i\) 行 \(j\) 列不满足条件的矩阵个数, \(g_{i,j}\) 为钦定 \(i\) 行 \(j\) 列不满足条件的矩阵个数. 容易得到: \[g_{x ...

  9. 前端—我的第一篇博客 梦开始的地方(面向对象版tab栏)

    这是我的第一篇博客 博客生涯才开始 但是人生已经过去了二十个年头了 才开始弄这个 也没搞得太懂 我原本的想法是想搞个源代码上来 但是看了半天好像就只能传html源代码 那我还有css js的部分呢 我 ...

  10. WPF 布局之综合实例

    WPF 布局之综合实例 <Window x:Class="UniFormGridDemo.MainWindow" xmlns="http://schemas.mic ...