使用canvas和javascript做一个画板(代码片段)

前端学习123321123 前端学习123321123     2022-12-25     618

关键词:

本文同步于个人博客:https://zhoushuo.me/blog/2018/03/11/drawing-borad/

前些天学习了HTML5<canvas>元素,今天就来实践一下,用canvas做一个画板。

技术图片

首先说一下要实现的功能:

  • 切换画笔颜色
  • 调整笔刷粗细
  • 清空画布
  • 橡皮擦擦除
  • 撤销操作
  • 保存成图片
  • 兼容移动端(支持触摸)

好了,废话少说,先看最终效果:https://zhoushuozh.github.io/drawingborad

准备工作

首先,准备个容器,也就是画板了。

<canvas id="drawing-board"></canvas>

然后初始化js:

let canvas = document.getElementById("drawing-board");
let ctx = canvas.getContext("2d");

我想把画板做成全屏的,所以接下来设置一下canvas的宽高。

let pageWidth = document.documentElement.clientWidth;
let pageHeight = document.documentElement.clientHeight;

canvas.width = pageWidth;
canvas.height = pageHeight;

由于部分IE不支持canvas,如果要兼容IE,我们可以创建一个canvas,然后使用excanvas初始化,针对IE加上exCanvas.js,这里我们暂时先不考虑IE。

实现一个简单的画板

实现思路:监听鼠标事件,用drawCircle()方法把记录的数据画出来。

  1. 设置初始化当前画布功能为画笔状态,painting = false
  2. 当鼠标按下时(mousedown),把painting设为true,表示正在画,鼠标没松开。把鼠标点记录下来。
  3. 当按下鼠标的时候,鼠标移动(mousemove)就把点记录下来并画出来。
  4. 如果鼠标移动过快,浏览器跟不上绘画速度,点与点之间会产品间隙,所以我们需要将画出的点用线连起来(lineTo())。
  5. 鼠标松开的时候(mouseup),把painting设为false

代码:

let painting = false;
let lastPoint = x: undefined, y: undefined;

//鼠标按下事件
canvas.onmousedown = function (e) 
    painting = true;
    let x = e.clientX;
    let y = e.clientY;
    lastPoint = "x": x, "y": y;
    drawCircle(x, y, 5);
;

//鼠标移动事件
canvas.onmousemove = function (e) 
    if (painting) 
        let x = e.clientX;
        let y = e.clientY;
        let newPoint = "x": x, "y": y;
        drawLine(lastPoint.x, lastPoint.y, newPoint.x, newPoint.y,clear);
        lastPoint = newPoint;
    
;

//鼠标松开事件
canvas.onmouseup = function () 
    painting = false;


// 画点函数
function drawCircle(x, y, radius) 
    ctx.save();
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, Math.PI * 2);
    ctx.fill();


// 划线函数
function drawLine(x1, y1, x2, y2) 
    ctx.lineWidth = 3;
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();
    ctx.closePath();

橡皮擦功能

实现思路

  1. 获取橡皮擦元素
  2. 设置橡皮擦初始状态,clear = false
  3. 监听橡皮擦click事件,点击橡皮擦,改变橡皮擦状态,clear = true
  4. cleartrue时,移动鼠标使用canvas剪裁(clip())擦除画布。
let eraser = document.getElementById("eraser");
let clear = false;

eraser.onclick = function () 
    clear = true;
;

...
if (clear) 
    ctx.save();
    ctx.globalCompositeOperation = "destination-out";
    ctx.stroke();
    ctx.closePath();
    ctx.clip();
    ctx.clearRect(0,0,canvas.width,canvas.height);
    ctx.restore();

...

注意,在canvas中的裁剪和平时的裁剪功能不一样在这里,裁剪是指在裁剪区域去显示我们所画的图

兼容移动端

实现思路:

  1. 判断设备是否支持触摸
  2. true,则使用touch事件;false,则使用mouse事件

代码:

...
if (document.body.ontouchstart !== undefined) 
    // 使用touch事件
    anvas.ontouchstart = function (e) 
        // 开始触摸
    
    canvas.ontouchmove = function (e) 
        // 开始滑动
    
    canvas.ontouchend = function () 
        // 滑动结束
    
else
    // 使用mouse事件
    ...

...

这里需要注意的一点是,在touch事件里,是通过.touches[0].clientX.touches[0].clientY来获取坐标的,这点要和mouse事件区别开。

切换画笔颜色

实现思路:

  1. 获取颜色元素节点。
  2. 点击颜色返回其颜色值,并赋给画布的ctx.strokeStyle

代码:

let aColorBtn = document.getElementsByClassName("color-item");

for (let i = 0; i < aColorBtn.length; i++) 
    aColorBtn[i].onclick = function () 
    for (let i = 0; i < aColorBtn.length; i++) 
        activeColor = this.style.backgroundColor;
        ctx.strokeStyle = activeColor;
    

清空画布

实现思路:

  1. 获取元素节点。
  2. 点击清空按钮清空canvas画布。

代码:

let reSetCanvas = document.getElementById("clear");

reSetCanvas.onclick = function () 
    ctx.clearRect(0, 0, canvas.width, canvas.height);
;

调整笔刷粗细

实现思路:

  1. 创建input[type=range]
  2. 滑动range获取其value值,并赋给ctx.lineWidth

代码:

let range = document.getElementById("range");

range.onchange = function()
    lWidth = this.value;
;

保存成图片

实现思路:

  1. 获取canvas.toDateURL
  2. 在页面里创建并插入一个a标签
  3. a标签href等于canvas.toDateURL,并添加download属性
  4. 点击保存按钮,a标签触发click事件

代码:

let save = document.getElementById("save");

save.onclick = function () 
    let imgUrl = canvas.toDataURL("image/png");
    let saveA = document.createElement("a");
    document.body.appendChild(saveA);
    saveA.href = imgUrl;
    saveA.download = "zspic" + (new Date).getTime();
    saveA.target = "_blank";
    saveA.click();
;

撤销

实现思路:

  1. 准备一个数组记录历史操作
  2. 每次使用画笔前将当前绘图表面储存进数组
  3. 点击撤销时,恢复到上一步的绘图表面

代码:

canvas.ontouchstart = function (e) 
     // 在这里储存绘图表面
    this.firstDot = ctx.getImageData(0, 0, canvas.width, canvas.height);
    saveData(this.firstDot);
    ...


let undo = document.getElementById("undo");
let historyDeta = [];

function saveData (data) 
    (historyDeta.length === 10) && (historyDeta.shift()); // 上限为储存10步,太多了怕挂掉
    historyDeta.push(data);

undo.onclick = function()
    if(historyDeta.length < 1) return false;
    ctx.putImageData(historyDeta[historyDeta.length - 1], 0, 0);
    historyDeta.pop()
;

因为每次储存都是将一张图片存入内存,对性能影响较大,所以在这里设置了储存上限。

总结

这里用的知识点主要有:监听mousetouch事件,以及canvasmoveTo()lineTo()stroke()clip()clearRect()等方法。其实还有很多效果可以实现,比如说喷雾效果,蜡笔效果,艺术画效果等等。日后有时间我会继续对这个画板进行优化,增加一些新的功能,同时欢迎大家留言提问或者提出批评建议。

最终代码:https://github.com/zhoushuozh/drawingborad

canvas简易画板。

在学canvas的时候,想到可以做一个自己用来画画的简易画板,加上canvas的基础都已经学完,便尝试做了一个画板。如图1.获取标签.varc=document.getElementById(‘myCanvas‘);varctx=c.getContext(‘2d‘);varb=document.getElementById(‘b‘);varb1=document.g... 查看详情

如何用canvas画板实现一个简单的球在盒子内反弹运动

...现时间间隔通过清空面板和重画模拟球的移动。3、通过JavaScript操作画板1)、初始化变量viewsourceprint?1.//x和y为球的圆心坐标2.//speed:表示球移动的速度单位为毫秒3.//radius:为球的半径4.//width和height为盒子大小5.varw,x,y,speed=500,radius=5... 查看详情

javascript简易画板

html5canvas只是一个容器,想要画出东西全部依赖于JavaScript.感觉什么都离不开这个JavaScript脚本.简易画板核心代码:<script>varstart=false;//绘制开关是否开始?window.onload=function(){varcvs=document.getElementById("cvs");varcxt=cvs.getContext("2d 查看详情

canvas画板基础应用的学习

canvas是html5中的绘图容器,我们可以通过javascript的控制来进行图形的绘制,绘制对象可以是路径、盒、圆、字符等,同时,你也可以通过js给画布添加图像,下面来介绍canvas的各种基本的用法:1、首先,我们需要在html标签中创... 查看详情

canvas画板(鼠标和触摸)(代码片段)

...nsubmit="returnfalse;"></button></body><scripttype="text/javascript">varcanvas=document.getElementById("canvas");varctx=canvas.getContext("2d");varbase64data= 查看详情

html5canvas画板

<!doctypehtml><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>javascript结合html5canvas实现的涂鸦板-分享JavaScript-sharejs.com</title><metaname="Co 查看详情

用canvas画布画一个画板

...,闲来无事便对其进行了一些捯饬。这不,上周我还做了一个好玩的画板呢,废话不多说,直接上代码(PS:翠花,上代码~):HTML部分:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Canvas制作画板< 查看详情

关于使用canvas画图时,图片被拉伸的问题

参考技术A如果您觉得我的文章有用,欢迎点赞和关注,也欢迎光临我的个人博客https://github.com/BokFangcanvas元素可以用来画2D图形,我们通过写js来完成任务。首先,我们在html文件中写入:然后在css中给canvas一个背景颜色:此时浏... 查看详情

关于安卓绘画板的算法介绍

...vas画布上先画好,例如canvas.drawBitmap(bgBitmap,0,0,null);2.新建一个Bitmap,例如BitmaptempBitmap=Bitmap.createBitmap(100,100,Config.ARGB_4444);并以此Bitmap新建一个临时画布canvas例如:CanvastemptCanvas=newCanvas(tempBitmap);然后再执行一步把tempBitmap的背景色... 查看详情

用html5的canvas和javascript创建一个绘图程序

本文将引导你使用canvas和JavaScript创建一个简单的绘图程序。 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面。1<canvasid="canvasInAPerfectWorld"width="490"height="220"></canvas>获取绘图环境,context对象提供了用于... 查看详情

有没有办法使用 HTML Canvas 和 JavaScript 从一个点填充直到它到达边界?

】有没有办法使用HTMLCanvas和JavaScript从一个点填充直到它到达边界?【英文标题】:IsthereawaytofillfromapointtillithitsaborderusingHTMLCanvasandJavaScript?【发布时间】:2016-03-2017:21:49【问题描述】:我正在使用一些旧的基本代码。它是这样的... 查看详情

canvas入门(代码片段)

...隐藏的部分),但是想要再对图形进行变换,还需要引入JavaScript来实现动态效果,这无疑增加了工作量。而上面这些内容就是使用Canvas的理由:更直接地达成目的。同样的三角形,使用canvas制作还可以调整三角形的大小。在这... 查看详情

canvas设置width,height

...现了其中玄机。。首先这是由canvas的构造导致的,canvas是一个画板和一张画纸组成的。当画板和画纸尺寸一致时,不会发生拉 查看详情

canvas基本使用

1.什么是CANVAScanvas是html5新增的画布元素,可以通过javascript来在画布上绘制图形,图标以及任何视觉性的图像。2.canvas的用途替代flash,做各种动态效果,做小游戏。3.canvas的使用使用canvas需要先在html页面中,存放一个canvas的元素... 查看详情

signaturepad手写画板使用&背景未覆盖canvas问题

...会监听canvas的变化,当canvas的heightwidth变化时,需要我们使用signaturePad.clear()“刷新”一下,让SignaturePad的配置应用到canvas其实这个在SignaturePad官网那例子中用一段话说了下,我当时想实现在调整页面时不要清空画板的内容,所... 查看详情

javascript之canvas画布

canvas可以在页面中设定一个区域,再利用JavaScript动态地绘制图像。基本用法使用canvas元素,首先设置width和height属性,为其设置绘制区域的大小, 如果没有设置宽度和高度,是看不到元素的,不能在其区域画图,在开始标签... 查看详情

canvas的介绍

...。HTML5<canvas>元素用于图形的绘制,通过脚本(通常是JavaScript)来完成.<canvas>标签只是图形容器,您必须使用脚本来绘制图形。你可以通过多种方法使用canvas绘制路径,盒、圆、字符以及添加图像。3.接下来我们来了解怎么... 查看详情

canvas

Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表、动画等。没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和Flash进行交互。有了Canvas,我们就再也不需要Flash了,直接使用JavaScri... 查看详情