canvas初学笔记整理

任何一门语言都是长期不用就容易忘记语法,这次抽时间整理了一下,以备后面需要时使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>canvas知识点笔记整理</title>
    <style>*{margin: 0;padding: 0;}
    </style>
</head>
<body>
    <canvas id="canvas"></canvas>
    <script>
        var canvas = document.getElementById('canvas');   
        var ctx = canvas.getContext('2d');
        let doc =  document.documentElement || document.body;
            canvas.setAttribute('width',doc.offsetWidth);
            canvas.setAttribute('height',doc.clientHeight);
        class Canval{
            constructor(ctx){
                this.pi = Math.PI / 180;
                this.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
            }
            demo(){
                ctx.fillRect(25,25,100,100);
                ctx.clearRect(45,45,60,60);
                ctx.strokeRect(50,50,50,50);
                ctx.beginPath();
                ctx.moveTo(150,20);
                ctx.lineTo(150,70);
                ctx.lineTo(180,45);
                ctx.fill();

                ctx.beginPath();
                ctx.arc(200,200,50,0,this.pi*360,false);
                ctx.moveTo(235,200);
                ctx.arc(200,200,35,0,this.pi*180,false);
                ctx.moveTo(180,190);
                ctx.arc(180,190,1,0,this.pi*360,false);
                ctx.moveTo(185,190);
                ctx.arc(180,190,5,0,this.pi*360,false);
                ctx.moveTo(220,190);
                ctx.arc(220,190,1,0,this.pi*360,false);
                ctx.moveTo(225,190);
                ctx.arc(220,190,5,0,this.pi*360,false);
                ctx.stroke();
            }
            demo1(){
                for(var i = 0; i < 4; i++){
                    for(var j = 0; j < 3; j++){
                        ctx.beginPath();
                        var x = 500 + 20*j;
                        var y = 50 + 20*i;
                        var angleDirect = i % 2 == 0 ? false : true;
                        ctx.arc(x,y,5,0,this.pi*(90*j+180),angleDirect);
                        angleDirect ? (ctx.stroke()) : (ctx.fill());
                        ctx.closePath();
                    }
                };
                ctx.save();
                ctx.translate(600,0);
                ctx.beginPath();
                ctx.moveTo(40,80);
                ctx.quadraticCurveTo(35,35,100,37.5);
                ctx.quadraticCurveTo(135,37.5,130,80);
                ctx.quadraticCurveTo(130,100,70,100);
                ctx.quadraticCurveTo(75,120,50,130);
                ctx.quadraticCurveTo(70,90,40,100);
                ctx.quadraticCurveTo(40,70,40,80);
                ctx.stroke();
                ctx.restore();
                ctx.save();
                ctx.translate(800,100);
                ctx.fillStyle = 'red';
                ctx.strokeStyle = 'red';
                ctx.beginPath();
                ctx.moveTo(0,0);
                ctx.bezierCurveTo(40,-20,20,40,0,40);
                ctx.bezierCurveTo(-20,40,-40,-20,0,0);
                ctx.fill();
                ctx.save();
            }
            rect(){
                ctx.beginPath();
                for(var i = 0; i < 6 ;i++){
                    var x = 50 + i*20;
                    var y = 40;
                    ctx.rect(x,y,10,10);
                    ctx.fillRect(x,y+40,10,10);
                    ctx.stroke();
                }
            }
            path2d(){
                var circle = new Path2D();
                    circle.moveTo(100,100);
                    circle.arc(80,100,10,0, this.pi*360);
                    ctx.stroke(circle);
            }
            fillStyle(){
                for(var i = 0; i < 3; i++){
                    for(var j = 0; j < 3;j++){
                        ctx.fillStyle = `rgba(200,${50+i*50},${100+j*50},1)`
                        ctx.fillRect(50+j*10,10*i,10,10);
                    }
                }
            }
            fillArc(){
                for(let i = 0; i < 10; i++){
                    for(let j = 0; j <10; j++){
                        ctx.strokeStyle = `rgba(100,${255-i*2.5},${255-j*2.5},.3)`;
                        ctx.beginPath();
                        ctx.arc(50+j*20,20*i+20,5,0,this.pi*360,false);
                        ctx.stroke();
                    }
                }
            }
            globalAlpha(){  //透明
                ctx.fillStyle = 'orange';
                ctx.fillRect(20,20,40,40);
                ctx.fillStyle = 'green';
                ctx.fillRect(60,20,40,40);
                ctx.fillStyle = '#09F';
                ctx.fillRect(20,60,40,40);
                ctx.fillStyle = '#F30';
                ctx.fillRect(60,60,40,40);
                ctx.globalAlpha = '.2';
                ctx.fillStyle = 'white';
                for(var a = 0; a < 10; a++){
                    ctx.beginPath();
                    ctx.arc(60,60,5*a,0,this.pi*360,false);
                    ctx.fill();
                }
            }
            lineWidth(){
                for(let i = 0; i < 10; i++){
                    ctx.beginPath();
                    ctx.lineWidth = i*1;
                    ctx.moveTo(20*i+20,20);
                    ctx.lineTo(20*i+20,40);
                    ctx.stroke();
                }
            }
            lineargradient(){ //渐变
                var LinearGradient = ctx.createLinearGradient(0,100,100,100);  //四个参数初始xy,终点xy
                    LinearGradient.addColorStop(0,'white');  //一个参数为渐变位置,0-1;
                    LinearGradient.addColorStop(0.5,'red');  //可以设置多个渐变色;
                    LinearGradient.addColorStop(1,'black'); //0-1为开始到终点的范围;
                    ctx.fillStyle = LinearGradient;
                    ctx.fillRect(0,0,100,100);
            }
            RadialGradient(){// 径向渐变   1,2,4,5参数为原点,3,6参数为起始范围和终点范围半径;
                    var radia = ctx.createRadialGradient(100,100,0,100,100,80);
                        radia.addColorStop(0,'orange');
                        radia.addColorStop(0.5,'green');
                        radia.addColorStop(1,'pink');
                        ctx.fillStyle = radia;
                        ctx.arc(100,100,80,0,this.pi*360,false);
                        ctx.fill();

            }
            createPattern(){  // 图案样式,可以设置一个图案的背景样式, backgroud-image类似;
                var  img = new Image();
                    img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
                    img.onload = function(){
                        var pattren = ctx.createPattern(img,'no-repeat');
                            //第二个参数:repeat,repeat-x,repeat-y 和 no-repeat;
                        ctx.fillStyle = pattren;
                        ctx.fillRect(0,0,1000,1000);
                    }
            }
            shadow(){
                ctx.shadowOffsetX = 2;  
                ctx.shadowOffsetY = -2;  //这两个参数值一样,正往右下,负值往上左;
                ctx.shadowBlur = 2; // 模糊程度;
                ctx.shadowColor = 'green';  //阴影颜色;
                ctx.font = '40px';
                ctx.fillStyle = 'black';
                ctx.fillText('demo shadow',50,50);
            }
            fill(){  //填充规则 nonzero  和 evenodd
                ctx.arc(50,50,50,0,this.pi*360,false);
                ctx.arc(50,50,20,0,this.pi*360,false);
                ctx.fill('evenodd');
            }
            text(){ //绘制文本
                //  实体文字和空心文字:第一个参数为文本,后面两个为xy位置;
                ctx.font = '30px serif';  //字体样式
                // ctx.textAlign = 'center';
                //var len =  ctx.measureText('demo') //测试文本宽度;
                ctx.textBaseline  = 'top';
                ctx.fillText('hello canvas',20,50);  
                ctx.shadowOffseY = -2; 
                ctx.shadowOffsetX = 2;
                ctx.shadowBlur = 5;
                ctx.shadowColor = 'green';
                ctx.strokeText('hello canvas',20,100);
            }
            img(){
                // drawImage()  //第一个参数为img,2,3为xy位置,4,5为宽高;6,7为截取放置位置,8,9为大小
                    //4,5图片大小,决定了裁剪后图片的裁剪位置;
                var img = new Image();
                    img.src = this.src;
                    img.onload = function(){
                            ctx.drawImage(img,0,0,100,100,100,100,40,40); 
                };

            }
            saveAndRestore(){   //ctx.save() 保存到栈中, ctx.restore() 从栈中恢复上一次参数;
                ctx.fillRect(0,0,400,400);
                ctx.save();
                ctx.fillStyle = 'black';
                ctx.globalAlpha = 0.5;
                ctx.fillRect(20,20,360,360);
                ctx.save();
                ctx.fillStyle = 'orange';
                ctx.globalAlpha = 1;
                ctx.fillRect(40,40,320,320);
                ctx.restore();
                ctx.fillRect(60,60,280,280);
                ctx.restore();
                ctx.fillRect(80,80,240,240);
            }
            translate(){  //例子
                for(var j = 0; j <3; j++){
                    for(var i = 0; i < 3; i++){
                        ctx.save();
                        ctx.translate(20*i+20,20+20*j);
                        ctx.strokeStyle = 'green';
                        ctx.strokeRect(0,0,10,10);
                        ctx.restore();           
                    }
                }
            }
            rotate(){
                ctx.translate(400,400);
                for(var i = 1 ; i <= 6; i++){
                    ctx.save();
                    for(var j = 0; j <i*6; j++){
                        ctx.beginPath();
                        ctx.rotate( (this.pi*360) / (i*6) );
                        ctx.arc(i*10,0,5,0,this.pi*360,false);
                        ctx.stroke();
                        ctx.closePath();
                    };
                    ctx.restore();
                }
            }
            scale(){  //缩放
                    // 这个缩放和css3里面的不一样 ,这个类似于翻书对称翻转,js默认右下为正向;scale(-1,-1)可以反转成数学里面的笛卡尔坐标系
                    //数值越大会使得像素变大,导致内容变大
                ctx.scale(-1,1);
                ctx.fillText('demo',-40,20);
            }
            demo2(){
                ctx.translate(100,100);
                var pi = this.pi;
                for(var i = 0; i < 12; i++){
                    ctx.save();
                    ctx.globalAlpha = (1-0.08*i);
                    ctx.rotate( (pi*360)/12 * i);
                    ctx.fillRect(12,0,30,5);
                    ctx.restore();
                };
            }
            globalCompositeOperation(){  //图像的合成与裁剪 //暂时还没掌握
                let operation = null;
                ctx.globalCompositeoperation = 'destination-over';
                ctx.beginPath();
                ctx.fillStyle = 'green';
                ctx.arc(200,200,20,0,this.pi*360,false);
                ctx.fill();
                ctx.beginPath();
                ctx.fillStyle = 'orange';
                ctx.arc(215,220,20,0,this.pi*360,false);
                ctx.fill();
                ctx.beginPath();
                ctx.fillStyle = 'pink';
                ctx.arc(230,200,20,0,this.pi*360,false);
                ctx.fill();
            }
            drawStar(r,color){  //绘制
                ctx.save();
                ctx.beginPath()
                ctx.moveTo(r,0);
                for (var i=0;i<9;i++){
                    ctx.rotate(Math.PI/5);
                    if(i%2 == 0) {
                    ctx.lineTo((r/0.525731)*0.200811,0);
                    } else {
                    ctx.lineTo(r,0);
                    }
                }
                ctx.closePath();
                ctx.fillStyle = color;
                ctx.fill();
                ctx.restore();
            }
            random(max,min){
                return Math.floor( Math.random()*(max-min)+min );
            }
            draw(){
                var colorSkin = ['red','orange','blue','pink','green'];
                ctx.arc(100,100,100,0,this.pi*360,false);
                // ctx.clip();  // 裁剪区域,让裁剪区域内显示内容
                for(var i = 0;i<100;i++){
                    var x = this.random(doc.offsetWidth,20);
                    var y = this.random(doc.offsetHeight,20);
                    var r = this.random(10,2);
                    var randColor = this.random(5,0);
                    ctx.save();
                    ctx.translate(x,y);
                    this.drawStar(r,colorSkin[randColor]);
                    ctx.restore();
                }
            }
            drawClock(){
                var pi = Math.PI/180;
                ctx.translate(400,400);
                ctx.rotate(pi*-60);
                // ctx.save();
                for( let i = 0; i < 12 ; i++ ){ //hour
                    ctx.save();
                    ctx.rotate(pi*(360/12*i));
                    ctx.moveTo(200,0);
                    ctx.lineTo(220,0);
                    ctx.font = '10px serif';
                    ctx.fillText(i+1,190,0);
                    ctx.stroke();
                    ctx.restore();
                };
                for( let i = 0; i < 60;i++ ){  //min
                    if( i % 5 !== 0 ){
                        ctx.save();
                        ctx.rotate(pi*(360/60)*i);
                        ctx.moveTo(210,0);
                        ctx.lineTo(220,0);
                        ctx.stroke();
                        ctx.restore();
                    }
                };
                var pis = pi;
                function draw(){
                    let timer = new Date();
                    let hour = timer.getHours(),
                        minutes = timer.getMinutes(),
                        seconds = timer.getSeconds();
                    let secondsAngle = pis*(360/60)*seconds;
                    let minutesAngle = pis*(360/60)*minutes;
                    let hourAngle = pis*(360/(12)*hour);
                    ctx.save();
                    ctx.beginPath();
                    ctx.rotate(secondsAngle);
                    ctx.moveTo(0,0);
                    ctx.lineTo(120,0);
                    ctx.stroke();
                    ctx.restore();
                    ctx.beginPath();
                    ctx.rotate(hourAngle);
                    ctx.moveTo(0,0);
                    ctx.lineTo(80,0);
                    ctx.stroke();
                    ctx.restore();
                    ctx.beginPath();
                    ctx.rotate(minutesAngle);
                    ctx.moveTo(0,0);
                    ctx.lineTo(100,0);
                    ctx.stroke();
                };
                draw();
            }
            
        }var initCanvas = new Canval(ctx);
            
    ;</script>
</body>
</html>
posted @ 2020-01-19 14:13  忧伤还是快乐i  阅读(189)  评论(0编辑  收藏  举报