canvas笔记

简介

  • canvas标签定义图形,比如图表,和其他图像。
  • canvas标签只是图形容器,必须使用脚本来绘制图形。
  • canvas有两个方向的轴,x和y轴,(0,0)点默认为左上角

canvas常用一些属性和方法

width和height

canvas宽度和高度,都直接在标签上设置,如果在css样式中设置,显现出来的高度和宽度可能不是设置的。
canvas有默认用默认的宽度和高度,300px

<canvas id="canvas" width="500" height="500">您的浏览器不支持canvas请升级最新版本</canvas>

标签中的文字只有在浏览器不支持canvas时才会显示

getContext()

大多数canvas绘图API都没有定义在canvas元素本身上,而是定义在通过画布的getContext()方法获得的一个“绘图环境”上。

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

beginPath()

开始绘制

ctx.beginPath();

moveTo(x,y)

设置绘制的起点
有两个参数:参数1:x轴方向的数值;参数2:y轴方向的数值。

ctx.moveTo(0,0);

lineTo(x,y)

绘制后续的点,后续点可以有多个
有两个参数:参数1:x轴方向的数值;参数2:y轴方向的数值。

ctx.lineTo(250,250);
ctx.lineTo(500,0);

closePath()

关闭路径,把终点和起点连接起来;不需要把终点和起点连接时可以不写。

ctx.closePath();

stroke(),fill()

stroke描边
fill填充
改变边线的颜色
ctx.strokeStyle = 'red';
改变填充的颜色
ctx.fillStyle = 'green';

lineWidth

设置边线的宽度,宽度以边线为中心向两边平分
ctx.lineWidth = 5;

绘制矩形

使用stroke绘制矩形: ctx.storkeRect(x,y,w,h);
绘制有填充颜色的矩形:ctx.fillRect(x,y,w,h);

设置圆角

对线的尾部进行圆角设置(必须关闭closePath)
ctx.lineCap='round';

设置线的交汇处进行圆角处理
ctx.lineJoin='round';

绘制字体

设置字体大小和字体类型
ctx.font='50px 黑体';

绘制文字(文字默认是基线对齐)
设置水平对齐方式
ctx.textAline='right';
设置垂直对齐方式
ctx.textBaseline='bottom';
storkeText()绘制字体
ctx.strokeText('Hello,World',100,100);
fillText()绘制字体
ctx.fillText('Hello,World',100,300,100);

绘制圆

/*
    参数1:圆心的x
    参数2:圆心的y
    参数3:圆的半径
    参数4:起点的位置,根据右侧和设置的弧度制找到起点
    参数5:终点的位置,根据右侧和设置的弧度制找到终点
    参数6:绘制的方向,true代表逆时针,false代表顺时针
    在这个里面的弧度用Math.PI表示。 Math.PI/2 代表90度;
    设置度用 n*Math.PI/180  n为要设置的度数
*/
ctx.arc(250,250,200,Math.PI,Math.PI/2,false);
ctx.stroke();

绘制二次贝塞尔曲线和三次贝塞尔曲线

//绘制曲线(二次贝塞尔曲线)
//使用moveTo放置起点,
//使用quadraticCurveTo()放置基准点和终点
//参数1:基准点的x
//参数2:基准点的y
//参数3:终点的x
//参数4:终点的y

ctx.moveTo(0,0);
ctx.quadraticCurveTo(250,500,500,0);
ctx.stroke();

//绘制曲线(三次贝塞尔曲线)
//参数1: 基准点1的x
//参数2: 基准点1的y
//参数3: 基准点2的x
//参数4: 基准点2的y
//参数5: 终点点1的x
//参数6: 终点点1的y

ctx.moveTo(0,0);
ctx.bezierCurveTo(500,0,0,500,500,500);
ctx.stroke();

画图像img

//如果想把图像画到canvas中,需要先创建image对象
var img=new Image();
img.src='images/1.jpg';

img.onload=function (){
    //必须等图片加载完成之后,才可以进行绘制
    /*
    参数:参数1:img;
    参数2:x;
    参数3:y;
    参数4:宽度width;
    参数5:高度height;
    参数6:图片上的要显示的起点x;
    参数7:图片上的要显示的起点y;
    参数8:图片上以起点开始要显示的宽度width;
    参数9:图片上以起点开始要显示的高度height;
    */
    // ctx.drawImage(img,10,10);
    // ctx.drawImage(img,10,10,200,200);
    ctx.drawImage(img,10,10,200,200,100,100,200,200);
}

清除画布

画布的清除一般在做动画时使用

//清除画布
//四个参数:x,y,w,h
// ctx.clearRect(10,10,200,200);

坐标系移动

ctx.translate(x,y);

坐标系旋转

坐标系的旋转以(0,0)原点为中心

ctx.rotate(Math.PI/6);

简单示例:

时钟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body{
            background: #000;
        }
        canvas{
            background: #fff;
        }
    </style>
</head>
<body>
    <canvas id="cc" width="400px" height="400px"></canvas>
    <script>
         var cc = document.getElementById('cc');
         var ctx = cc.getContext('2d');

         function time(){
            var x = 200;
            var y = 200;
            var r = 150;

            var oDate = new Date();
            var hours = oDate.getHours();
            var minutes = oDate.getMinutes();
            var seconds = oDate.getSeconds();

            var hValue = (-90 + hours * 30 + minutes/2)*Math.PI/180;
            var mValue = (-90 + minutes * 6)*Math.PI/180;
            var sValue = (-90 + seconds * 6)*Math.PI/180;

            ctx.beginPath();
            for(var i=0; i<60 ; i++){
                ctx.moveTo(x,y);
                ctx.arc(x,y,r,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false);
            }
            ctx.closePath();
            ctx.stroke();

            //盖圆盘

            ctx.fillStyle = '#fff';
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r*18/20,0,Math.PI*2,false);
            ctx.closePath();
            ctx.fill();

            //时
            ctx.lineWidth = 3;
            ctx.beginPath();
            for(var i=0; i<12 ; i++){
                ctx.moveTo(x,y);
                ctx.arc(x,y,r,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false);
            }
            ctx.closePath();
            ctx.stroke();

            //盖圆盘
            ctx.fillStyle = '#fff';
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r*16/20,0,Math.PI*2,false);
            ctx.closePath();
            ctx.fill();

            //时针
            ctx.lineWidth = 5;
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r*8/20,hValue,hValue,false);
            ctx.closePath();
            ctx.stroke();
            //分针
            ctx.lineWidth = 3;
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r*14/20,mValue,mValue,false);
            ctx.closePath();
            ctx.stroke();

            //秒针
            ctx.lineWidth = 1;
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r*16/20,sValue,sValue,false);
            ctx.closePath();
            ctx.stroke();
         }

         setInterval(time,1000);

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

推荐阅读更多精彩内容