前言

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

需求如下:

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

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

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

难点总结:

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

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

  3. 图片保存的api;

canvas的基本绘制和自适应

代码部分请忽略css样式

canvas初始化

html

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

js | canvas自适应方案

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

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

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

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

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

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

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

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

canvas绘制文字

  1. baseColor = '#000';
  2. //canvas文字对象
  3. var textArr = [
  4. {num:0, has_click: 0, worth:750000, x : 60, y : 50+60, fontSize : 25, text : '英雄联盟', color: baseColor,isEn : true },
  5. {num:1, has_click: 0, worth:750000, x : 310/3, y : 50+650/3, fontSize : 20, text : '守望先锋', color: baseColor }
  6. ];
  7. //转为自适应文字对象
  8. var getTextScope = function(textArr){
  9. var arr = [];
  10. textArr.forEach(function(item){
  11. item.x = item.x * rate;
  12. item.y = item.y * rate;
  13. item.fontSize = item.fontSize * rate;
  14. //计算文字对象在canvas中的触摸范围
  15. item.r = item.x + (item.isEn ? item.text.length / 2 : item.text.length) * item.fontSize;
  16. item.b = item.y + item.fontSize;
  17. arr.push(item);
  18. });
  19. return arr;
  20. };
  21. var newArr = getTextScope(textArr);
  22. //绘制文字方法
  23. var fillTextArr = function(el, textArr){
  24. textArr.forEach(function(item){
  25. el.font = item.fontSize + 'px Microsoft Yahei Helvetica Neue Helvetica, STHeiTi, Arial, sans-serif ';
  26. el.textAlign= 'left';
  27. el.textBaseline = 'top';
  28. el.fillStyle = item.color;
  29. el.fillText(item.text, item.x, item.y);
  30. //绘制文字的触摸识别范围(调试用)
  31. el.beginPath();
  32. el.rect(item.x, item.y, item.r - item.x, item.b - item.y);
  33. el.stroke();
  34. });
  35. };
  36. fillTextArr(canvas,newArr)

canvas绘制图片

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

  1. <footer class="footer">
  2. <div class="img-source hide">
  3. <img src="/images/avater.jpg" alt="" id="avater"/>
  4. <img src="/images/avater-bg_05.png" alt="" id="avaterBg"/>
  5. <img src="/images/3.jpg" alt="" id="img3"/>
  6. <img src="/images/21060715code_img.jpg" alt="" id="code"/>
  7. <img src="/images/canvas_tag.png" alt="" id="scan"/>
  8. </div>
  9. </footer>

js

绘制图片的函数

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

canvas元素点击交互

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

  1. //判断点击的点是否在范围内
  2. var isInText = function(item, p){
  3. if(p.x > item.x && p.x < item.r && p.y > item.y && p.y < item.b) {
  4. return true;
  5. }else {
  6. return false;
  7. }
  8. };
  1. //获取元素所在区域范围的函数
  2. var getEventPosition = function(ev){
  3. var x, y;
  4. if (ev.layerX || ev.layerX == 0) {
  5. x = ev.layerX;
  6. y = ev.layerY;
  7. } else if (ev.offsetX || ev.offsetX == 0) { // Opera
  8. x = ev.offsetX;
  9. y = ev.offsetY;
  10. }
  11. return {x: x, y: y};
  12. };

交互事件实例

  1. canvas.addEventListener('click', function(e){
  2. //获取点击坐标
  3. var p = getEventPosition(e);
  4. //遍历欧判断是否点击到某元素
  5. newArr.forEach(function(item, i){
  6. //判断是否点击到元素进行分别操作
  7. if(isInText(item, p)){
  8. //点击到某元素的操作
  9. }
  10. });
  11. }, 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. QT:Qt Creator使用CTRL+C后变成了光标覆盖,插入模式

    菜单栏→工具→选项→FakeVim→取消勾选"使用FakeVim"

  2. WPS:编号

    独立编号 只想用于表示顺序的编号,不想与标题级别挂钩 样式--编号--选择编号种类后--自定义--按照图片设置 要得到类似这样的编号格式 假设 第一章 系统介绍 为 样式 标题二 1.1 监控管理系统 ...

  3. 获取HTML中所有图片的 URL

    /// <summary> /// 获取HTML中所有图片的 URL /// </summary> /// <param name="strHtml" ...

  4. JZ-025-复杂链表的复制

    复杂链表的复制 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝, 并返回拷贝后的头结点.(注意,输 ...

  5. SQL Server的Linked Servers

    文章搬运自:SQL Server的Linked Servers(链接) 参考引用一下,感谢作者~ 我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一 ...

  6. Drools 规则引擎应用

    规则引擎-drools 1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 .... ...

  7. LGP4216题解

    这是一种题解没有的 \(O(m\log n)\) 做法. 首先第一步转化.设这是第 \(x\) 个任务,若 \(opt\) 为 \(1\),危险值大于 \(c\) 的只有可能在第 \(x-c-1\) ...

  8. ArcMap操作随记(8)

    1.构建两点之间连线 [构造视线] 2.编辑相邻多边形(边界等) [拓扑]工具条→[共享要素] 3.点要素空间分配 [创建泰森多边形]→[裁剪] 4.面要素空间分配 [要素转折点]→[创建泰森多边形] ...

  9. spring——依赖注入的三种方式

    1 构造器注入(与构造器有直接关系) 默认无参构造 3种构造方式:通过<contructor-arg>调用类中的构造器 下标 <bean id="userService&q ...

  10. Ansible的原理与配置

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 Ansible原理 Ansible 是一款开源自动化平台.它是一种简单的自动化语言,能够在Ansible Playbook 中完美地描述 IT 应 ...