Canvas标签绘制图形

内容整理自网上!
CanvasRenderingContext2D参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/fillRect

一、绘制图

代码:

<script>
        var CANVAS_WIDTH=500;
        var CANVAS_HEIGHT=500;
        var canvas,context;
        window.onload=function () {
            createCanvas();
            drawRect();
        }
        function createCanvas() {
            document.body.innerHTML="<canvas id='canvas' width='"+CANVAS_WIDTH+"' height='"+CANVAS_HEIGHT+"'></canvas>";
            canvas=document.getElementById('canvas');
            context=canvas.getContext('2d');
        }
        function drawRect() {
            //填充颜色
            context.fillStyle='#4169e1';

            //context.rotate(45);//角度
            //context.translate(200,200);//移动
            //context.scale(2,0.5);//缩放

            //绘制填充矩形,矩形的起点在 (x, y) 位置,矩形的尺寸是 width 和 height
            context.fillRect(0,0,100,100);
        }
    </script>

二、绘制图片

代码:

        function drawImage() {
            var img=new Image();
            img.onload=function () {
                context.drawImage(img,0,0);
            }
            img.src='resource/ok.jpg';
        }

三、绘制圆

效果图:


好多圆

代码:

        function draw(id) {
            var canvas=document.getElementById(id);
            if(canvas==null){
                return false;
            }
            var context=canvas.getContext('2d');
            context.fillStyle="#eeeeef";
            context.fillRect(0,0,300,400);
            for(var i=0;i<10;i++){
                context.beginPath();
                context.arc(i*25,i*25,i*10,0,Math.PI*2,true);
//参数分别为x轴坐标、y轴坐标、圆的半径、圆弧的起始点(x轴方向开始计算)、圆弧终点、true为逆时针绘制,false为顺时针绘制
                context.closePath();//一定要关闭路径!!
                context.fillStyle="rgba(255,0,0,0.25)";//0.25是透明度
                context.fill();
            }
        }

四、绘制渐变图形

效果图:


渐变图

代码:

        function draw(id) {
            var canvas=document.getElementById(id);
            if(canvas==null){
                return false;
            }
            var context=canvas.getContext('2d');
            var g1=context.createLinearGradient(0,0,0,300);
            //参数起点的x轴坐标、起点y轴坐标、终点的x轴坐标、终点的y轴坐标
            g1.addColorStop(0,'rosybrown');
            g1.addColorStop(1,'white');
            context.fillStyle=g1;
            context.fillRect(0,0,500,500);
        }

效果图:


渐变图形
        function draw(id) {
            var canvas=document.getElementById(id);
            if(canvas==null){
                return false;
            }
            var context=canvas.getContext('2d');
            var g1=context.createLinearGradient(0,0,0,300);
            //参数起点的x轴坐标、起点y轴坐标、终点的x轴坐标、终点的y轴坐标
            g1.addColorStop(0,'rosybrown');
            g1.addColorStop(1,'white');
            context.fillStyle=g1;
            context.fillRect(0,0,500,500);
            var g2=context.createLinearGradient(0,0,300,0);
            g2.addColorStop(0,'rgba(0,0,255,0.5)');
            g2.addColorStop(1,'rgba(255,0,0,0.5)');
            for(var i=0;i<10;i++){
                context.beginPath();
                context.fillStyle=g2;
                context.arc(i*25,i*25,i*10,0,Math.PI*2,true);
                context.closePath();
                context.fill();
            }
        }

效果图:


五角星+阴影效果

代码:

        function draw(id) {
            var canvas=document.getElementById(id);
            if(canvas==null){
                return false;
            }
            var context=canvas.getContext('2d');
            context.fillStyle='#eeeeef';
            context.shadowOffsetX=10;
            context.shadowOffsetY=10;
            context.shadowColor='rgba(100,100,100,0.5)';
            context.shadowBlur=7.5;
            context.translate(0,50);
            for(var i=0;i<3;i++){
                context.translate(50,50);
                create5Star(context);
                context.fill();
            }
        }
        function create5Star(context) {
            var n=0;
            var dx=100;
            var dy=0;
            var s=50;
            context.beginPath();
            context.fillStyle='rgba(255,0,0,0.5)';
            var x=Math.sin(0);
            var y=Math.cos(0);
            var dig=Math.PI/5*4;
            for(var i=0;i<5;i++){
                var x=Math.sin(i*dig);
                var y=Math.cos(i*dig);
                context.lineTo(dx+x*s,dy+y*s);
            }
            context.closePath();
        }

五、使用库绘制

下载库(github源码):https://createjs.com/downloads
说明文档:\EaselJS-master\docs\EaselJS_docs里面的index.html
引入文件:\EaselJS-master\lib\easeljs.min.js

绘制文本

代码:

    <canvas id="canvas" width="500px" height="500px"></canvas>
    <script>
        var canvas;
        var stage;
        var txt;
        window.onload = function(){
            canvas = document.getElementById("canvas");
            stage = new createjs.Stage(canvas);
            txt=new createjs.Text("number->","20px Arial","rosybrown");//文字、大小字体、颜色
            stage.addChild(txt);
            stage.update();
        }
    </script>

动态图实现效果:


动态图

代码:

    <canvas id="canvas" width="500px" height="500px"></canvas>
    <script>
        var canvas;
        var stage;
        var txt;
        var count=0;
        window.onload = function(){
            canvas = document.getElementById("canvas");
            stage = new createjs.Stage(canvas);
            txt=new createjs.Text("number->0","20px Arial","rosybrown");//文字、大小字体、颜色
            stage.addChild(txt);
            createjs.Ticker.setFPS(30);//页面每秒显示30帧
            createjs.Ticker.addEventListener('tick',tick);
        }
        function tick(e) {
            count++;
            txt.text="number->"+count;
            stage.update();
        }
    </script>

更酷炫的可以参考\EaselJS-master\examples!
实现效果:


酷炫效果

代码:

<body>
    <canvas id="canvas" width="500px" height="500px"></canvas>
    <script>
        var canvas;
        var stage;
        var img=new Image();
        var sprite;
        window.onload = function(){
            canvas = document.getElementById("canvas");
            stage = new createjs.Stage(canvas);

            stage.addEventListener('stagemousedown',clickCanvas);
            stage.addEventListener('stagemousemove',moveCanvas);

            var data={
                images:['resource/spritesheet_sparkle.png'],
                frames:{width:20,height:20,regX:10,regY:10}
            }
            sprite  = new createjs.Sprite(new createjs.SpriteSheet(data));
            createjs.Ticker.setFPS(20);
            createjs.Ticker.addEventListener("tick",tick);
        }
        function tick(e){
            var t = stage.getNumChildren();
            for(var i = t-1;i>0;i--){
                var s = stage.getChildAt(i);

                s.vY +=2;
                s.vX +=1;
                s.x += s.vX;
                s.y += s.vY;

                s.scaleX = s.scaleY =s.scaleX+ s.vS;
                s.alpha += s.vA;

                if(s.alpha <= 0 || s.y >canvas.height){
                    stage.removeChildAt(i);
                }
            }
            stage.update(e);
        }
        function clickCanvas(e){
            addS(Math.random()*200 + 100,stage.mouseX,stage.mouseY,2);
        }

        function moveCanvas(e){
            addS(Math.random()*2 + 1,stage.mouseX,stage.mouseY,1);
        }
        function addS(count,x,y,speed) {
            for(var i=0;i<count;i++){
                var s=sprite.clone();
                s.x=x;
                s.y=y;
                s.alpha=Math.random()*0.5+0.5; //透明度的变化
                s.scale=s.scaleY=Math.random()+0.3; //缩放的效果

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,799评论 25 707
  • 【因上篇字数不够,故本篇稍长一些。此外,我想测试测试自己的学习能力,所以我打算在学习6个小时以后再写笔记等等,用延...
    芊小璇阅读 410评论 0 2
  • 即使临近考试周,还是有看视频。 最近在看一档真人秀节目《妈妈是超人》,由董洁、梅婷、贾静雯、冉莹颖携娃参加。 跟以...
    小桂阅读 2,966评论 0 1
  • 今天第一天写亲子日记,每天都过的忙忙碌碌的,这几天特别忙,小的生病了特别不听话,今天早上起床晚了都快七点...
    b88e3d08d5fb阅读 170评论 0 0