乐趣区

关于canvas:canvas-笔记

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="canvas" width="600" height="800" style="background-color: rgb(38, 139, 139); margin:20px">
        
    </canvas>
    <script>
        /** @type {HTMLCanvasElement} */
        let cDom=document.getElementById('canvas')
        let context=cDom.getContext('2d')
// 第一局部
        // 绘制线条
        // context.moveTo(10,20)
        // context.lineTo(70,30)
        // context.lineWidth=12
        // context.strokeStyle="red"
        // context.stroke()

        // context.moveTo(50,80)
        // context.lineTo(50,120)
        // context.lineWidth=7
        // context.strokeStyle='pink'
        // context.stroke()

        // 第二个图案,// context.beginPath()
        // context.moveTo(10,120)
        // context.lineTo(100,120)  // 新建门路 API
        // context.lineWidth=5
        // context.strokeStyle='black'
        // context.stroke()

        // 三角形,// context.beginPath()
        // context.moveTo(10,150)
        // context.lineTo(120,150)
        // context.lineTo(60,180)
        // context.closePath()   // 线路闭合 API
        // context.fillStyle='green' // 填充色彩
        // context.fill() // 填充
        // context.lineWidth=3
        // context.strokeStyle='pink'
        // context.stroke()

        // 矩形
        // context.beginPath()
        // context.rect(20,180,40,50)
        // context.lineWidth=1
        // context.strokeStyle='red'
        // context.stroke()

        // 空心矩形组合 API
        // context.beginPath()
        // context.lineWidth=2
        // context.strokeStyle="pink"
        // context.strokeRect(20, 240, 40, 50);

        // 实心矩形组合 API
        // context.beginPath()
        // context.fillStyle="blue"
        // context.fillRect(30,200,40,50);
        
// 第二局部弧线
        //actTo 弧线原理:三个控制点,x1,x2,x3, 同时内切于 x1-x2 和 x2-x3 两条直线的内切圆
        // context.beginPath();
        // context.moveTo(200, 10);
        // context.arcTo(200, 100, 100, 10, 48);
        // context.lineWidth=3;
        // context.strokeStyle='pink';
        // context.stroke();
        
        // 辅助线
        // context.beginPath();
        // context.moveTo(200, 10);
        // context.lineTo(200, 100);
        // context.lineTo(100, 10);
        // context.closePath();
        // context.lineWidth=1;
        // context.strokeStyle='red';
        // context.stroke();
        
        // arc 画弧原理:确定圆心,半径,起始角度,终止角度,方向
        // context.beginPath();
        // context.arc(100, 200, 30, 0, Math.PI/3, false);
        // context.stroke();

        // 二阶贝塞尔曲线:终点,起点,控制点
        // context.beginPath();
        // context.moveTo(130, 250);
        // context.quadraticCurveTo(130, 280, 160, 265);
        // context.stroke();
        
//3 绘图款式

        // context.beginPath();
        // context.moveTo(10, 20);
        // context.lineTo(200, 300);
        // context.lineWidth=5;
        // 默认值
        // context.lineCap='butt';
        // 圆角
        // context.lineCap='round';
        // 矩形
        // context.lineCap='square';
        // 虚线
        // context.setLineDash([7,10,15,20,30]);        
        // context.stroke();

        // 线性突变
        // context.beginPath();
        // x1,y1,x2,y2
        // let gradient= context.createLinearGradient(50,150,100,290)
        // gradient.addColorStop(0, 'pink');
        // gradient.addColorStop(0.7, 'red');
        // gradient.addColorStop(1, 'pink');
        // context.fillStyle=gradient;
        // context.fillRect(25,150,200,150);

        // 径向突变
        // context.beginPath();
        // 圆心一,半径一,圆心二,半径二
        // let gradient2=context.createRadialGradient(190, 440, 5, 140, 450, 80);
        // gradient2.addColorStop(0,'green')
        // gradient2.addColorStop(0.2,'pink')
        // gradient2.addColorStop(0.4,'green')
        // gradient2.addColorStop(0.6,'pink')
        // gradient2.addColorStop(0.8,'green')
        // gradient2.addColorStop(1,'pink')
        // context.fillStyle=gradient2;
        // context.fillRect(40,350,200,200);
        
        // 纹理款式 填充图片
        // context.beginPath();
        // let img1=new Image();
        // img1.src='./mao.gif'
        // img1.onload=function(){//     let pattern=context.createPattern(img1, 'repeat');
        //     context.fillStyle=pattern;
        //     context.fillRect(30,600,200,120);
            
        // }
        
        // 绘制文本
        // context.beginPath();
        // 字体款式
        // context.font='200px Times New Roman';
        // 暗影右偏移
        // context.shadowOffsetX=2;
        // 暗影下偏移
        // context.shadowOffsetY=6;
        // 暗影含糊度
        // context.shadowBlur=6;
        // 暗影色彩
        // context.shadowColor='red';    
        // 填充文本
        // context.fillText(text, x, y, maxWidth);
        // 轮廓文本
        // context.strokeText('hello', 150, 150);
        // 纹理填充
        // let img=new Image();
        // img.src='./mao.gif'
        // img.onload=function(){//     let pattern=context.createPattern(img, 'repeat');
        //     context.fillStyle=pattern;
        //     context.fillText('hello', 150, 300);
        // }

        // 绘制图片      
        // context.beginPath();
        // let img=new Image()
        // img.src="./tuzi.png"        
        // img.onload=function(){
            // 图片,x,y, 宽,高,// context.drawImage(img, 10, 20,100,100);
            // 从图片上扣取某局部放到画布上:图片,图片里的 x, 图片的 y, 剪裁的宽度,剪裁的高度,画布的 x, 画布的 y, 搁置的宽度,搁置的高度
            // context.drawImage(img, 100, 500,100,100,100,500,100,100);
        // }
        
// 进阶     
        // 变形 平移:translate,选装:rotate,缩放;scale
        // 平移
        // context.beginPath();
        // context.fillStyle='red';
        // 状态保留:坐标,色彩
        // context.save();
        // context.fillRect(0,0,100,100);
        // context.translate(400, 400);
        // context.fillRect(0,0,100,100);
        // 复原之前的状态,当然也能够 context.translate(-400 -400);
        // context.restore();
        // context.fillStyle='black';
        // context.fillRect(0,0,50,50);
        
        // 选装
        // context.beginPath();
        // context.fillStyle='yellow';
        // context.save();
        // context.rotate(30 * Math.PI / 180);
        // context.fillRect(100,100,40,40);
        // context.restore();
        // context.fillRect(100,100,40,40);

        // 缩放
        // context.beginPath();
        // context.fillStyle='blue';
        // context.save();
        // context.scale(1.5, 2);
        // context.fillRect(200,200,50,50);
        // context.restore();
        // context.fillRect(200,200,50,50);        
        
        // transform 线性代数矩阵变换
        // a   c   e
        // b   d   f
        // 0   0   1
        // a 程度缩放 1
        // b 程度歪斜 0
        // c 垂直歪斜 0
        // d 垂直缩放 1
        // e 程度位移 0
        // f 垂直位移 0
        // context.beginPath();
        // context.save();
        // context.transform(1, 0, 0, 1, 100, 200);
        // context.fillStyle='pink';
        // context.fillRect(0,0,100,100);
        
        // 合成: 共提供了 26 中混排模式,用的时候现查就能够了。// 后绘制的放到上面 destination-over
        // 后绘制的镂空先绘制的 destination-out
        // context.globalCompositeOperation='destination-over';
        // context.fillStyle='blue';
        // context.fillRect(100,100,200,200);
        //     context.fillStyle='red';
        // context.fillRect(200,200,200,200);

        // 裁剪
        // context.lineWidth='1px';
        // context.rect(0, 0, 150, 150);
        // context.stroke();
        // context.clip();  // 只在上方的闭合曲线内显示 
        // context.fillStyle='blue';
        // context.font='44px sans-serif';
        // context.fillText('hello', 100, 100);
                
    </script>
</body>
</html>
退出移动版