JS中的canvas绘图

给大家简单介绍一下canvas在JS的用法及属性(如有介绍不到位 , 恳求各位大佬担待);

目录

一、Canvas简介

二、Canvas基本用法

三、填充和描边

四、绘制矩形

五、绘制路径

5.1、绘制线段
5.2、绘制三角形
5.3、绘制圆弧
5.4、绘制贝塞尔曲线

image.png

一、Canvas简介

<canvas>元素是HTML5新增的,一个可以使用脚本( 通常为JavaScript )在其中绘制图像的HTML元素。它可以用来制作照片集制作简单的动画,甚至可以进行实时视频处理和渲染。
<canvas>由API构成,除了具备基本绘图能力的2D上下文<canvas>还具备一个名为WebGL的3D上下文

二、Canvas基本用法

使用<canvas>元素之前,必须先设置widthheight属性,指定可以绘图( 画布 )的区域大小。
出现在开始和结束标签中的内容是后备信息,如果浏览器不支持<canvas>元素,就会显示这些信息。

<canvas id = "drawing" width = "600" height = "600">A drwaing of something.</canvas>

要在这块画布上绘图,必须要使用getContext()方法传入参数"2d"取得2d上下文对象( 画笔 )。

var drawing = document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext {
        var ctx = drawing.getContext("2d");//取得2d上下文对象(画笔)
}

使用2d绘图上下文提供方法,可以绘制简单的2d图形,比如矩形、弧线和路径等等。
2d上下文的坐标开始于<canvas>元素的左上角,原点坐标是(0,0)。
所有坐标值都基于这个原点计算,x值越大表示越靠右,y值越大越靠下。

三、填充和描边

2d上下文的两种基本绘图操作是填充和描边。
填充就是指定的样式(颜色、渐变或图像) 填充图形,fill()默认为黑色,fillStyle = "任意颜色"
描边就是图形边缘画线,*stroke()默认也是黑色
strokeStyle = "任意颜色"来设置描边样式。
这两个属性的值可以是字符串、渐变对象或模式对象,例如:

var drawing = document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext) {
var ctx = drawing.getContext("2d");
//填充
ctx.fill();//默认黑色
ctx.fillStyle = "red" //设置为红色
//描边
ctx.stroke();//默认黑色
ctx.strokeStyle = "green"//设置为绿色
};

四、绘制矩形

与绘制矩形有关的方法包括:
·fillRect()
strokeRect()
clearRect()
这三个方法都是能接收四个参数:矩形的x坐标、矩形的y坐标矩形的width(宽)、矩形的height(高),参数都是px(像素)
示例1

var drawing = document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext) {
var ctx = drawing.getContext("2d");
//绘制红色矩形
ctx.fillStyle  = "red";
ctx.fillRect(10,10,50,50);
}
image.png

示例2:


        var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            //绘制红色描边矩形
            context.strokeStyle = "#F00";
            context.strokeRect(10, 10, 50, 50);
            //绘制半透明的蓝色描边矩形
            context.strokeStyle = "rgba(0, 0, 255, 0.5)";
            context.strokeRect(30, 30, 50, 50);
        }
image.png

示例3:

        var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            //绘制红色矩形
            context.fillStyle = "#F00";
            context.fillRect(10, 10, 50, 50);
            //绘制半透明的蓝色描边矩形
            context.fillStyle = "rgba(0, 0, 255, 0.5)";
            context.fillRect(30, 30, 50, 50);
            //在两个矩形重叠的地方清除一个小矩形
            context.clearRect(40, 40, 10, 10);
        }
image.png

五、绘制路径

绘制方法:
·beginPath() :表示要开始绘制新路径。
·moveTo():起点坐标(x,y)。
·lineTo():从起点坐标到开始绘制一条线,到(x,y)。
·rect(x,y,width,height):从点(x,y)开始绘制一个矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是strokeRect()和fillRect()所绘制的独立的形状。
·arc(x,y,r,start,end,flase||true):以(x,y)为圆心绘制一条弧线,弧线半径为r,起始结束角度 (用弧线表示)分别为start和end。最后一个参数true和flase是否按逆时针方向计算,(值为true表示按逆时针计算)。
·quadraticCurveTo(cx,cy,x,y):绘制二次贝塞尔曲线
·bezierCyrverTo(c1x,c1y,c2x,c2y,x,y):绘制三次贝塞尔曲线。
·closePath():绘制一条连接到路径起点的线条。
·fill():使用fillStyle填充已经完成的路径
·stroke():使用strokeStyle为已经完成的路径描边

5.1、绘制线段

        var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            context.beginPath();        //开始绘制新路径
            context.moveTo(50, 50);     //把画笔移动到指定的坐标
            context.lineTo(200, 50);    //绘制一条从当前位置到指定坐标(200, 50)的直线
            context.stroke();           //绘制
        }

5.2、绘制三角形

绘制三角形边框:

 var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            ctx.beginPath();           //开始绘制新路径
            ctx.moveTo(50,50);         //把画笔移动到指定的坐标
            ctx.lineTo(200,50);       //绘制一条从坐标(50, 50)到坐标(200, 50)的直线
            ctx.lineTo(200,200);    //绘制一条从坐标(200, 50)到坐标(200, 200)的直线
            ctx.closePath();      //闭合路径,绘制一条从路径起点到路径终点的直线
            ctx.stroke();       //为路径描边
        }
image.png

填充三角形:

 var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            ctx.beginPath();           //开始绘制新路径
            ctx.moveTo(50,50);         //把画笔移动到指定的坐标
            ctx.lineTo(200,50);       //绘制一条从坐标(50, 50)到坐标(200, 50)的直线
            ctx.lineTo(200,200);    //绘制一条从坐标(200, 50)到坐标(200, 200)的直线
            ctx.closePath();      //闭合路径,绘制一条从路径起点到路径终点的直线
            ctx.stroke();       //填充三角形
         }
image.png

5.3、绘制圆弧


        var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            context.beginPath();        //开始绘制新路径
            context.arc(100, 100, 99, 0, Math.PI, false);   
            context.stroke();
        }
image.png

5.4、绘制贝塞尔曲线

20181008115337164[1].png
        var drawing = document.getElementById("drawing");
        //确定浏览器支持<canvas>元素
        if(drawing.getContext){
            var context = drawing.getContext("2d"); //取得2D上下文对象
            context.beginPath();
            context.moveTo(10, 200);    //起始点
            var x1 = 40, y1 = 100;      //控制点
            var x2 = 200, y2 = 200;     //结束点
            //绘制贝塞尔曲线
            context.quadraticCurveTo(x1, y1, x2, y2);
            context.stroke();
            context.beginPath();
            context.rect(10, 200, 10, 10);
            context.rect(x1, y1, 10, 10);
            context.rect(x2, y2, 10, 10);
            context.fill();
        }

转载于://www.greatytc.com/p/802c3bd2df34

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

推荐阅读更多精彩内容