十五、canvas绘制、线、矩形、圆、文字

一、canvas介绍

canvas(画布)是HTML的新标签,它就相当于一张白纸,我们可以利用它绘制出很多酷炫的效果,IE8以下的浏览器都不支持canvas标签,而且我们一般也不要用css来设置它的宽高。如果要想使用它必须先熟练使用JavaScript,如果你已经会用JavaScript,那我们就一起来看一下该如何使用它吧!
首先我们创建一个html文件,结构如下:


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        canvas {  /*为了方便观察,我们给canvas加个轮廓*/
                margin-left: 30px;
                margin-top: 30px;
                outline: 1px solid red;
            }
    </head>
    <body>

        <canvas id="canvas" width="500" height="500">
            你的浏览器不支持canvas标签,请下载最新浏览器
        </canvas>

    </body>

    <script type="text/javascript">
        
    </script>
</html>

二、基础方法

在了解方法之前我们先要了解一下canvas的坐标系。


canvas坐标系
canvas坐标系

1、var ctx = canvas.getContext('2d');

var ctx = canvas.getContext('2d')称之为获取上下文对象(也可以理解为是一支画笔),我们大多数操作都在ctx中进行,暂时不涉及3d。

2、ctx.beginPath(); 开始绘制。

3、ctx.moveTo(x, y); 设置初始点。

4、ctx.lineTo(x, y); 放置点可多次放置。

5、ctx.closePath(); 关闭绘制路径。

注意:会自动连接起始点和结束点。

6、ctx.stroke(); 进行绘制。

小练习:1、绘制直线

// 获取元素
    var canvas = document.getElementById("canvas");

    // 获取上下文对象(画笔)
    var ctx = canvas.getContext('2d');

    // 画一条线
    // 1、开始绘制
    ctx.beginPath();

    // 2、描述开始点,把画笔移到开始位置
    ctx.moveTo(50,50)

    // 3、放置点
    ctx.lineTo(250,250);
    // ctx.lineTo(40,400);

    // 4、结束绘制
    ctx.closePath();

    // 设置线的宽度
    ctx.lineWidth = 10;

    // 设置线的颜色
    ctx.strokeStyle = '#d88adf';

    // 设置线的圆角
       ctx.lineCap = 'round';
    // 设置线的圆角,只针对转角处,两条线的交接点
    // ctx.lineJoin = 'round';
     

    // 5、绘制
    ctx.stroke();

绘制直线

小练习:2、绘制三角形

        // 获取元素
        var canvas = document.getElementById("canvas");

        // 获取上下文对象(画笔)
        var ctx = canvas.getContext('2d');

        // 画一条线
        // 1、开始绘制
        ctx.beginPath();

        // 2、描述开始点,把画笔移到开始位置
        ctx.moveTo(50,50)

        // 3、放置点
        ctx.lineTo(250,250);
        ctx.lineTo(40,400);

        // 4、结束绘制
        ctx.closePath();

        // 设置线的宽度
        ctx.lineWidth = 10;

        // 设置线的颜色
        ctx.strokeStyle = '#d88adf';

        // 设置线的圆角
        // 只针对转角处,两条线的交接点
        ctx.lineJoin = 'round';

        // 5、绘制
        ctx.stroke();
绘制三角形

7、ctx.fill(); 进行填充。

8、绘制矩形。

  • ctx.strokeRect(x, y, w, h)按照矩形画线,前面两个参数为起始点坐标,后面两个参数为矩形的宽高。
  • ctx.fillRect(x, y, w, h)按照矩形填充,前面两个参数为起始点坐标,后面两个参数为矩形的宽高。

9、绘制圆ctx.arc(x, y, r, startAngle, endAngle, direction);

参数说明:
x和y为圆心点坐标;
startAngle和endAngle为起始位置和结束位置的弧度(转化为角度:var deg = Math.PI/180);
direction为绘制方向,false为顺时针方向,true为逆时针方向。

10、绘制文字

  • ctx.fillText(text, x, y, maxWidth?) ; 填充文字
  • ctx.strokeText(text, x, y, maxWidth?) ; 描边文字
    参数说明:
    text为要绘制的文本内容;
    x和y为绘制文字的起始坐标点,默认为文字的右下角;
    maxWidth?为文本的宽度;

三、基础属性

1、颜色

  • ctx.strokeStyle = "red" 线的颜色
  • ctx.fillStyle = "red" 填充颜色

2、线

  • ctx.lineWidth = 10; 设置线的宽度可以是number或者string。
  • ctx.lineJoin = 'round'; 设置线的圆角 ,只针对转角处,两条线的交接点。
  • ctx.lineCap = 'round'; 设置线的圆角。

3、文字

  • ctx.textAlign = "left"; 文字水平对齐方式。
    值有三种,start或者left,center,end或者right。
  • ctx.textBaseline = "top"; 垂直对齐方式。
    值有三种,top,middle,bottom。
  • ctx.font = "50px 宋体"; 注意单独设置字体大小不起作用,需要同时设置字体。

4、阴影

  • ctx.shadowColor = 'red'; 阴影颜色
  • ctx.shadowOffsetX = 10; 阴影X轴偏移量
  • ctx.shadowOffsetY = 10; 阴影Y轴偏移量
  • ctx.shadowBlur = 10; 阴影模糊程度

*5、渐变

  • ctx.createLinearGradient(x1, y1, x2, y2);
    创建一个从(x1, y1)点到(x2, y2)点的线性渐变对象。
  • ctx.createRadialGradient(x1, y1, r1, x2, y2, r2);
    创建一个从以(x1, y1)点为圆心、r1为半径的圆到以(x2, y2)点为圆心、r2为半径的圆的径向渐变对象。
  • addColorStop(position, color); position表示添加颜色的位置,取值范围为[0, 1],0表示起点,1表示终点;color表示添加的颜色,取值可以是任何CSS颜色值。

渐变对象创建并配置完成之后就可以将其赋予Context对象的strokeStyle属性或者fillStyle属性,然后绘制的图形就具有了所需的渐变效果。

四、练习

1、绘制五角星

五角星

代码如下:


    // 获取元素
    var canvas = document.getElementById("canvas");

    // 获取上下文对象(画笔)
    var ctx = canvas.getContext('2d');

    var x1 = 500*Math.sin(Math.PI/10);  //18度角所对的直角边
    var h1 = 500*Math.cos(Math.PI/10);  //18度角所在的直角边

    var x2 = 500*Math.cos(Math.PI/5);   //36度角所在的直角边
    var h2 = 500*Math.sin(Math.PI/5);   //36度角所对的直角边

    // 开始绘制
    ctx.beginPath();
    // 放置起始点
    ctx.moveTo(250,0);
    ctx.lineTo(250 - x1, h1);
    ctx.lineTo(250 - x1 + x2, h1 - h2);
    ctx.lineTo(0, h1 - h2);
    ctx.lineTo(250 + x1, h1);
    ctx.lineTo(250, 0);
    // 设置填充颜色
    ctx.fillStyle = 'red';
    // 填充
    ctx.fill();

2、绘制矩形

矩形

代码如下:


    // 获取元素
    var canvas = document.getElementById("canvas");
    // 随机数
    var randomFun = function (max, min) {
        return parseInt(Math.random()*(max - min) + min)
    }
    // 随机颜色
    var colorFun = function () {
        return 'rgb('+ randomFun(255,0) + ',' + randomFun(255,0) + ',' + randomFun(255,0) + ')';
    }

    // 获取上下文对象(画笔)
    var ctx = canvas.getContext('2d');
    var w = 200;
    var x = 0;
    var y = 0;
    // 绘制
    for (var i = 0; i < 11; i++) {
        ctx.fillStyle = colorFun();
        ctx.fillRect(x + i*30,y + i*30,w,w)
    }

3、绘制多重圆环

多重圆环

代码如下:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    var r = 20;
    var x = 100;
    var y = 250;

    for (var i = 0; i < 10; i++) {
        ctx.beginPath();
        ctx.strokeStyle = (i % 2 == 0) ? 'cyan' : 'red';
        ctx.arc(x + i * 20, y , r + i * 20, Math.PI*2 , false);
        ctx.stroke();
    }

4、躁动的小球

躁动的小球

代码如下:


        // 获取元素
        var canvas = document.getElementById("canvas");

        var randomFun = function (max, min) {
            return parseInt(Math.random() * (max - min + 1) + min);
        }
        randomFun()

        var colorFun = function () {
            return 'rgba('+ randomFun(255, 0) + ',' + randomFun(255, 0) + ',' + randomFun(255, 0) + ',' + (Math.random() + 0.1) + ')';
        }
        canvas.width = document.body.offsetWidth;
        canvas.height = document.body.offsetHeight;
        console.log(document.body.offsetHeight);

        var w = canvas.width;
        var h = canvas.height;

        // 获取上下文对象(画笔)
        var ctx = canvas.getContext('2d');

        // 普通版
        // for (var i = 0; i < 200; i++) {
        //     var r = randomFun(40,20);
        //     var x = randomFun(w - r, r);
        //     var y = randomFun(h - r, r);
        //     ctx.beginPath();
        //     ctx.fillStyle = colorFun();
        //     ctx.arc(x,y,r,Math.PI*2,false);
        //     ctx.fill()
        // }



        // 面向对象版
        function Ball(x, y, r, color) {
            this.r = r || randomFun(30, 10);
            this.x = x || randomFun(w - this.r, this.r);
            this.y = y || randomFun(h - this.r, this.r);
            this.color = color || colorFun();


            this.show = function () {
                ctx.beginPath();
                ctx.fillStyle = this.color;
                ctx.arc(this.x, this.y, this.r, Math.PI*2, false);
                ctx.fill();
            }
        }

        for (var i = 0; i < 500; i++) {
            var ball = new Ball();
            ball.show()
        }

5、绘制文字

文字

        // 获取元素
        var canvas = document.getElementById("canvas");


        // 获取上下文对象(画笔)
        var ctx = canvas.getContext('2d');

        var str1 = '蒹葭苍苍';
        var str2 = '白露为霜';
        var str3 = '所谓伊人';
        var str4 = '在水一方';
        ctx.font = '50px 黑体';

        ctx.beginPath()
        ctx.fillStyle = 'purple';
        ctx.textBaseline = 'top';
        ctx.fillText(str1, 0 , 0);



        ctx.fillStyle = 'red';
        ctx.textAlign = 'right'
        ctx.textBaseline = 'top';
        ctx.fillText(str2, 500 , 0);

        ctx.fillStyle = 'green';
        ctx.textAlign = 'left'
        ctx.textBaseline = 'bottom';
        ctx.fillText(str3, 0 , 500);

        ctx.fillStyle = 'blue';
        ctx.textAlign = 'right'
        ctx.textBaseline = 'bottom';
        ctx.fillText(str4, 500 , 500);

(未完待续•••••••••••••!)


以上内容纯属个人理解,由于水平有限,若有错漏之处敬请指出斧正,小弟不胜感激。

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

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,674评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,940评论 3 40
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,509评论 0 4
  • 一.Canvas的基本介绍 1.什么是Canvas 定义:是HTML5提供的一种新标签, ie9才开始支持的,Ca...
    LiLi原上草阅读 691评论 0 3
  • 文 | 蔡尖尖 1 多年前,我先生和我刚刚开始发展革命合作道路的时候,我挺迷恋这个男人的,觉得怎么好像没有他不懂的...
    蔡尖尖阅读 1,351评论 2 6