【底部附有制作绘图板完整代码】
编码过程中会遇到一些原生js的技术,小编会先罗列出来。

1、在for循环中为多个元素利用索引值绑定事件,会产生异步问题。

问题所在:在事件代码内部可以进行各种操作,就是不能引用循环变量。

两种解决方案解决方案:

  1. 利用一个自执行函数包裹住循环体,并将循环变量作为参数传递进去。
//为每一个颜色设置单击事件,并让所有的颜色具备.currentColor类
//自执行函数:语法(function(形参){})(实参);
//不一定非要拿小括号包裹起来,也可以在函数前面加单目运算,如:+、-、!、~等都可以for(var i=0; i<$$('.color').length; i++){~function(index){$$('.color')[index].addEventListener('click',function(event){for(var j=0; j<$$('.color').length; j++){$$('.color')[j].classList.remove('currentColor');}$$('.color')[index].classList.add('currentColor')})}(i)
}
  1. 利用let定义循环变量i,这样在每一次循环中循环变量i都是一个独立的变量。

2、如何利用Jaavascript模拟元素的拖拽

let isDown = false;
let ctx = canvas.getContext('2d');
canvas.addEventListener('mousedown',function(event){isDown = true;
})
canvas.addEventListener('mouseup',function(){isDown = false;
})
canvas.addEventListener('mousemove',function(event){if(isDown){//鼠标按下的同时进行了移动:绘制图形}else{//鼠标弹起的同时进行了移动:没有操作}
})

3、ctx.beginPath();

每次绘制一个新图形,都要先执行这个方法。告诉画布下面的操作是一个新图形的绘制工作,和现在画布上已有的图形无关。

4、将Canvas画布转换为图片

  1. 利用blob地址将画布转换为图片。
canvas.toBlob(function(blob){console.log(blob)   //blob - Canvas画布转换的File对象
},MIME类型,quality)
//参数:quality - 转换为图片的最终质量,取值为0-1。
  1. 利用base64地址将画布转换为图片。
var base64URL=canvas.toDataURL(MIME类型,quality)

绘图板完整代码:

<div class="controlPanel"><div>画笔粗细:<select class="ctxWidth"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option></select></div><div class="ctxColor">画笔颜色:</div><div><button class="clearCanvas">清除画布</button></div><div><button class="saveImage">保存图片</button></div>
</div>
<canvas class="myCanvas"></canvas>
.controlPanel{width: 1000px;height: 60px;margin: 20px auto;border: 1px solid #3385ff;box-sizing: border-box;padding: 16px;display: flex;align-items: center;
}
.ctxWidth{width: 50px;
}
.ctxColor{margin: auto 40px;display: flex;
}
.ctxColor .color{width: 20px;height: 20px;margin: 0 3px;border: 2px solid transparent;
}
.ctxColor .currentColor{border: 2px solid rgba(0,0,0,0.6);
}
button{margin-left: 20px;
}
.myCanvas{border: 1px solid #3385ff;display: block;margin: auto;
}
//封装利用选择器来进行DOM对象的获取
function $(selector){return document.querySelector(selector);
}function $$(selectors){return document.querySelectorAll(selectors);
}let canvas = $(".myCanvas");
canvas.width = 1000;
canvas.height = 500;let ctx = canvas.getContext('2d');//canvas画布默认生成的图片是png格式,
//绘制一个白色矩形占满整个画布
ctx.beginPath();
ctx.rect(0,0,canvas.width,canvas.height);
ctx.fillStyle = '#ffffff';
ctx.fill(); let colorList = ['#363636','#e1565b','#3385ff','#d8ad7a','#14d8a2','#cc14d8'];
for(var i=0;i<colorList.length;i++){var colorNode = document.createElement('div');colorNode.className = 'color';colorNode.style.backgroundColor = colorList[i];        //设置画笔的颜色$(".ctxColor").appendChild(colorNode);
}//为每一个颜色设置单击事件,并让所有的颜色具备.currentColor类
for(let i=0; i<$$('.color').length; i++){$$('.color')[i].addEventListener('click',function(event){for(var j=0; j<$$('.color').length; j++){$$('.color')[j].classList.remove('currentColor');}$$('.color')[i].classList.add('currentColor');ctx.strokeStyle = colorList[i];})
}//利用avaScript模拟元素的拖拽
let isDown = false;
canvas.addEventListener('mousedown',function(event){isDown = true;ctx.beginPath();ctx.moveTo(event.offsetX,event.ofsetY)
})
canvas.addEventListener('mouseup',function(){isDown = false;
})
canvas.addEventListener('mousemove',function(event){if(isDown){       //鼠标按下的同时进行了移动:绘制图形ctx.lineTo(event.offsetX,event.offsetY);ctx.stroke();}else{       //鼠标弹起的同时进行了移动:没有操作}
})//设置画笔的粗细
$('.ctxWidth').addEventListener('change',function(){ctx.lineWidth = this.value;
})//清除画布
$('.clearCanvas').addEventListener('click',function(){ctx.clearRect(0,0,canvas.width,canvas.height)
})//保存图片
//注意:要将canvas转换为jpg格式的图片,需要在画布上覆盖一个白色的矩形。
$('.saveImage').addEventListener('click',function(){//方法一:利用blob地址将画布转换为图片// canvas.toBlob(function(blob){//     let url = window.URL.createObjectURL(blob);//  let aNode = document.createElement('a');//   aNode.href = url;//    aNode.download = '';//   aNode.click();// },"image/jpeg",1);//方法二:利用base64地址将画布转换为图片。let base64Url = canvas.toDataURL("image/jpeg",1);let aNode = document.createElement('a');aNode.href = base64Url;aNode.download = '';aNode.click();
})

利用canvas开发一个绘图板相关推荐

  1. html5 自动扣图,利用canvas实现一个抠图小工具

    本文作者:IMWeb 孙世吉 未经同意,禁止转载 利用canvas实现一个抠图小工具 0 前言 作为新一代的前端开发工程师,PS抠图切图已经不是必备技能了,我们有UI/交互/视觉等更专业的设计同学帮我 ...

  2. 如何利用canvas画一个圆,并且填充颜色

    如何利用canvas画一个圆,并且填充颜色(小白专用,大佬勿看) canvas基础 相信在此之前,你对canvas已经有一定的了解了,接下来我将介绍,如何利用canvas画一个圆. 1.新建一个htm ...

  3. 利用java开发一个猜数字幸运小游戏:游戏规则如下

    package com.day04.www;import java.util.Random; import java.util.Scanner;public class day04 {public s ...

  4. 利用MyEclipse开发一个调用webservice接口的程序

    上一篇文章我们已经学习了如何使用Java 工具MyEclipse开发一个webservice接口,那么接口开发好了如何调用?接下来我们就来解决这个问题. 1:首先随便创建一个Java project选 ...

  5. java 双击_利用java开发一个双击执行的小程序

    之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 ...

  6. 利用c#开发一个telnet unix服务器或者防火墙的小工具(转)

    因为工作原因,需要定期从AIX服务器和cisco防火墙统计一些信息,于是决定自己写个小程序利用telnet协议实现这个功能. 利用SOCKET建立与服务器之间的连接,之后我们就可以利用程序直接发送命令 ...

  7. 微信小程序利用canvas绘制一个动画百分比圆圈

    效果图(动态的圆圈) <template> <view class='circleBar'><view class="wrap"><vie ...

  8. 微信小程序利用canvas绘制一个静态百分比圆圈

    效果如图 <view class='circleBar'><view class="wrap"><canvas class="cir&quo ...

  9. 熬了三个大夜利用Python开发一个炸金花小游戏,注意别玩上瘾了~~(附完整源码)

    大家好,我是你们的好朋友王老师~ 众所周知扑克牌可谓是居家旅行.桌面交友的必备道具,今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则. 炸(诈)金花又叫三张牌, ...

最新文章

  1. 机器人控制与感知有感
  2. 微信公众平台消息接口开发(29)校验签名与消息响应合并
  3. Exchange Server2013 系列九:常规配置
  4. axure中的拐弯箭头_Axure教程:实现菜单下拉效果
  5. 使用Data::Dumper
  6. 有关linux下redis overcommit_memory的问题
  7. 无法解析此远程名称: 'www.***.com' 解决办法(转)
  8. 程序员求职面试三部曲之二:提高面试的成功率
  9. 主成分分析步骤_多元分析(1)--主成分分析
  10. python按照日期筛选数据_Pandas日期数据处理:如何按日期筛选、显示及统计数据...
  11. MySql、PowerDesigner、JDBC 的关系
  12. Android之shape属性简介和使用
  13. Python实现一条基于POS算法的区块链
  14. R语言金融基础:tidyquant获取数据(标普500与纳斯达克)
  15. Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件
  16. 设计模式之Interpreter(解释器)
  17. 嵌入式Linux--MYS-6ULX-IOT--总目录
  18. CheckPoint管理平台提示Certificate revoked
  19. c语言英语教学大纲,C语言教学大纲(《大学C语言实用教程》)
  20. 【border相关】【P3426】 [POI2005]SZA-Template

热门文章

  1. 【深入理解计算机系统 01】计算机系统漫游
  2. 搜狐html5,手机搜狐率先发力Html5技术
  3. pytorch训练网络冻结某些层
  4. 量化交易 聚宽 布林带策略
  5. nginx打包文件以及解压
  6. webpack设置不打包文件
  7. android 监听wifi的连接状态,Android判断wifi状态 监听wifi连接
  8. 网站是否被墙的辨别及解决方法
  9. Elasticsearch入门教程(五):Elasticsearch查询(一)
  10. 文科计算机课程,高校文科生要学专业计算机课程