制作一个画板<canvas>

什么是<canvas>:

<canvas>是HTML5新定义的标签,可以通过脚本(比如JavaScript)来绘制图形,它可以用来绘制图形,制作照片,创建动画等。简单的说,canvas就是我们的画布,在电脑上,鼠标就是我们的画笔,在手机上,手指就是我们的画笔。
默认情况下canvas是没有边框与内容的,默认是一个宽300高150的画布。我们可以在canvas标签内设置它的宽高,切记,不能在CSS内设置宽高,因为在CSS内设置的宽高是按照默认宽高等比缩放的。

getContext():

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');

代码的第一行使用'document.getElementById() 方法来为 <canvas>素得到DOM对象。一旦有了元素对象,你可以通过使用它的getContext() 方法来访问绘画上下文,getContext()方法封装了多个绘图功能。

绘制图像

canvas绘制图像的方法有两种:
context.stroke()
stroke()方法可以绘制图形的边框,默认黑色
context.strokeStyle
设置边框的颜色
context.fill()
fill()方法可以绘制填充的图形,默认黑色
context.fillStyle
设置填充的颜色

绘制矩形

context.fillStyle = 'white'  //设置填充图形的颜色
context.strokeStyle = 'red';  //设置图形边框的颜色    
context.fillRect(10, 10, 100, 100);  //绘制填充图形
context.strokeRect(10, 10, 100, 100);  //绘制图形的边框
效果图

绘制实心圆

arc(x, y, radius, startAngle, endAngle, anticlockwise)
x:圆心的x坐标
y:圆心的y坐标
radius:半径
startAngle:开始角度
endAngel:结束角度
anticlockwise:绘制的方向

context.beginPath();  //路径开始
context.arc(150, 150, 30, 0, Math.PI*2)
context.closePath();  //路径结束
context.fillStyle = 'red';
context.fill();
效果图

绘制线段

moveTo(x, y):起点x,y坐标。
lineTo(x,y):终点x,y坐标。

context.strokeStyle = 'red';
context.moveTo(0,0);
context.lineTo(100,100);
context.stroke();
效果图

ok,现在了解了canvas已经如何在画布上绘图之后,我们开始自由绘图。

鼠标的按下、移动、松开事件

大家应该都使用过电脑上的图画功能,按下左键,移动鼠标,松开左键,这一整个过程就可以绘制出一条线或者一个图形。
document.onmousedown:获取鼠标按下事件
document.onmousemove:获取鼠标移动事件
document.onmouseup:获取松开鼠标事件
我们只需要在这三个对应的事件中加入相应的绘图动作,就可以自由绘图了
1.设置一个标记,代表是否开启绘画状态。
var painting = false;
2.鼠标按下时,开启绘画状态,获得当前x,y坐标,在此坐标绘制一个点。

canvas.onmousedown = function(down){
    painting = ture;
    var lastPoint={x:undefined, y:undefined};
    canvas.onmousedown = function(aaa){
        var x = down.clientX;
        var y = down.clientY;
        lastPoint = {x: x, y: y};
        console.log(lastPoint);
        drawCircle(x,y,3);
      }
}

3.鼠标移动时,不断获得新的坐标,连线两个坐标,并不断刷新旧的坐标。

canvas.onmousemove = function(move){
   var x = move.clientX;
   var y = move.clientY;
   if(painting){  //如果不判断绘画状态,那么不管鼠标是出于按下或者松开状态,都会持续绘图
     var newPoint = {x:x, y:y};
     drawLine(lastPoint.x, lastPoint.y, newPoint.x, newPoint.y);
     lastPoint = newPoint;
     console.log(lastPoint);
   }
}

4.松开鼠标时,关闭绘画状态。

canvas.onmouseup = function(up){
  painting = false;
}

封装的绘图方法:

function drawCircle(x,y,radius){
  context.beginPath();
  context.fillStyle = 'black';
  context.arc(x,y,radius,0,Math.PI*2);
  context.fill();
}


function drawLine(x1,y1,x2,y2){
  context.beginPath();
  context.strokeStyle = 'black';
  context.moveTo(x1,y1);//起点
  context.lineTo(x2,y2);//终点
  context.lineWidth = 5;
  context.stroke();
  context.closePath();
}

体验画板
完整代码请查看我的Github
emmmm目前功能还不完善,比如无法更换画笔颜色、样式太丑·····以后慢慢完善。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容