zoukankan      html  css  js  c++  java
  • html canvas

    canvas :可以理解为一个div,作用是一块画板

    如果想要使用canvas,需要创建一个“画家”。生成画家的方法:

    var huaban = document.querySelector('.canvas');//画板
    var bicaso = huaban.getContext('2d');//画家  canvas上下文对象
    //绘画操作  
    //表示在距离画板左上10px 10px的位置画了一个长宽分别为50px的矩形,默认填充颜色黑色  绘制矩形
    bicaso.fillRect(10,10,50,50);
    //表示绘制轮廓线
    bicaso.strokeRect(10,10,50,50);
    //绘制画笔颜色
    bicaso.fillStyle='颜色';
    //擦除矩形方法
    bicaso.clearRect(x,y,要擦除的矩形宽度,要擦除的矩形高度);

    Transparency(透明度)

    globalAlpha = transparencyValue: 这个属性影响到 canvas 里所有图形的透明度,有效的值范围是 0.0 (完全透明)到 1.0(完全不透明),默认是 1.0。

    globalAlpha 属性在需要绘制大量拥有相同透明度的图形时候相当高效。不过,我认为使用rgba()设置透明度更加好一些。

     

    canvas基础demo

    <!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>Document</title>
    </head>
    <body>
        <!-- 在页面中添加canvas元素 -->
    
        <!--1. 创建一块画布。必须定义canvas的id属性以方便js调用。  可以使用css控制canvas的外观 -->
        <canvas id="myCanvas" width="300" height="300" style="border: 2px solid red;">
            <!-- 通过javascript可以在画布中添加线条文字图片动画,也可以绘画 -->
            <!-- 有些浏览器不支持canvas元素,会直接忽略canvas元素显示替代内容。所以需要为这些浏览器提供替代canvas的显示内容 -->
            您的浏览器不支持canvas,请更新或更换浏览器。
        </canvas>
    
        <canvas id="canvas2" width="300" height="300" style="border: 2px solid red;">您的浏览器不支持canvas</canvas>
    
        <canvas id="tutorial" width="300" height="300" style="border: 2px solid red;">您的浏览器不支持canvas</canvas>
        
    
    
        <script>
            // 2.在js脚本中获取到canvas元素
            var canvas = document.getElementById('myCanvas');
    
            // 判断getContext()方法是否存在,来检测浏览器是否支持canvas==========================
            if(canvas.getContext) {
                alert("您的浏览器支持canvas");
            }else {
                alert("您的浏览器不支持canvas");
            }
            // ===============================================================================
    
            // 3.通过canvas的getContext()方法获取画布上下文,即创建context对象。以获取允许进行绘画的2D环境。  或者3D环境("3D")
            var context = canvas.getContext("2d");//getContext("2d")该方法用于返回一个内建的h5对象,该对象提供了用于绘图的方法和属性,使用该对象可以在canvas画布中绘制图形。  相当于画笔。
            
            // 4.绘制图形的操作  =============================================================================================================
            
            //绘制一个矩形,填充色为蓝色,矩形坐标为(10,10) 长50宽80。-------------------------------
            context.fillStyle="blue";
            context.fillRect(10,10,50,80);//strokeRect(x,y,width,height)  clearRect(x, y, widh, height):清除指定的矩形区域,然后这块区域会变的完全透明。
            // 循环生成若干个40px的小矩形,边框颜色随机-------------------------------------------------
            function draw0(){
                var canvas = document.getElementById('canvas2');
                if (!canvas.getContext) return;
                var ctx = canvas.getContext("2d");
                for (var i = 0; i < 6; i++){//6行6列
                    for (var j = 0; j < 6; j++){
                        ctx.fillStyle = "rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})";
                        // ctx.fillStyle = "rgb(randomInt(0, 255),randomInt(0, 255),randomInt(0, 255))";
                        ctx.strokeRect(j * 50, i * 50, 40, 40);
                        // ctx.fillRect(j * 50, i * 50, 40, 40);
                    }
                }
            }
            draw0();
            /**
             返回随机的 [from, to] 之间的整数(包括from,也包括to)           颜色随机生成失败????????????????
             */
            function randomInt(from, to){
                return parseInt(Math.random() * (to - from + 1) + from);
            }
              
            
            //绘制一条直线-------------------------------------------------
            context.moveTo(0,0);
            context.lineTo(200,30);
            context.stroke();
    
            // 绘制复杂图形--------使用绘制路径方法--------Math.sin()----Math.cos()------Math.PI------beginPath()---lineTo()----closePath()-----------
            var n = 0;
            var dx = 150;
            var dy = 150;
            var s = 100;
            context.beginPath();//开始一条路径 或重置当前路径
            context.fillStyle = 'orange';//填充属性设置
            context.strokeStyle = 'yellow';//边框样式
            context.lineWidth = '1';//边框宽度
            var x = Math.sin(0);//使用sin cos三角函数计算顶点坐标x,y
            var y = Math.cos(0);
            var dig = Math.PI / 15 * 11;//Math.PI返回的是圆周率 π 
            for(var i = 0;i<30;i++) {//表示30个点的连线
                var x = Math.sin(i * dig);
                var y = Math.cos(i * dig);
                context.lineTo(dx+x*s,dy+y*s);
            }
            context.closePath();//关闭路径
            context.fill();//填充 默认填充黑色
            context.stroke();//边框  默认黑色
    
            // 绘制圆形----------------beginPath()----arc()-----closePath()-------------------------------
            // arc(x,y,r,sAngle,eAngle,counterclockwise);---x,y表示圆心坐标---r表示圆版半径---sAngle起始角【0】---eAngle结束角【2*Math.PI】---counterclockwise规定逆时针还是顺时针绘图(false顺时针,true逆时针)  
            context.fillStyle = "blue";//设置画笔填充颜色样式
            context.strokeStyle = 'red';//设置边框颜色样式
            context.strokeWidth = '2';
            context.beginPath();//开始创建路径
            context.arc(50,50,50,0,2*Math.PI,true);//圆心坐标(50,50) 半径50 逆时针旋转 从0°~360°
            context.closePath();
            context.fill();
            context.stroke();
    
            // 绘制14条弧形-------------------------0°表示水平线  +90°表示负y轴方向-----------------------------------------------------------
            for(var i=0;i<15;i++) {
                context.strokeStyle='red';
                context.beginPath();
                context.arc(10,300,i*10,0,Math.PI*3/2,true);//弧心坐标(0,300) 半径10*i  逆时针旋转0°~((1/2)π)° 逆时针旋转0°~90°
                context.closePath();//从当前点到开始点的闭合路径操作
                context.stroke();
            }
            // 绘制圆弧-------------通过使用控制点----arcTo(x1,y1,x2,y2,r);--控制点1坐标  控制点2坐标 圆弧半径----------------------------------------
            context.beginPath();
            context.moveTo(150,150)//起点坐标
            context.arcTo(200,150,200,250,60);//arcTo表示绘制的图形由两条切换所决定。l1为起始点和控制点1的直线,l2为控制点1和控制点2的直线
            context.lineTo(250,250);//到达的下一点的坐标
            context.stroke();//绘图
            context.fill();//填充
    
    
            // 绘制路径------------------------路径都是闭合的----------------------------------
            function draw1() {
                context.fillStyle="orange";
                context.beginPath();//新建一条路径
                context.moveTo(10,10);//将画笔移动到指定坐标
                context.lineTo(200,50);
                context.lineTo(10,50);
                context.closePath();//闭合
                context.stroke();//绘制路径
                context.fill();//填充闭合区域
            }
            draw1();
    
            // 透明度  Transparency(0.0,1.0)  globalAlpha = transparencyValue;  如果不是大量需要设置透明度,用rgba就够了
    
            // lineWidth  线条宽度
    
            // lineCap = type  线条末端样式  butt--末端以方形结束  round--末端以圆形结束  square--末端以方形结束,但两端都增加了一个长度为线宽一半的矩形区域
    
            // lineJoin=type  线条接合处样式  round--弧形  bevel--接合处以横线为底  miter(默认)--接合处延申相连部分的外边缘,形成灵性
            function draw3(){
                var canvas = document.getElementById('tutorial');
                if (!canvas.getContext) return;
                var ctx = canvas.getContext("2d");
                var lineJoin = ['round', 'bevel', 'miter'];
                ctx.lineWidth = 20;  
                for (var i = 0; i < lineJoin.length; i++){
                    ctx.lineJoin = lineJoin[i];
                    ctx.beginPath();
                    ctx.moveTo(50, 50 + i * 50);
                    ctx.lineTo(100, 100 + i * 50);
                    ctx.lineTo(150, 50 + i * 50);
                    ctx.lineTo(200, 100 + i * 50);
                    ctx.lineTo(250, 50 + i * 50);
                    ctx.stroke();
                }
            }
            draw3(); 
    
            
        </script>
    </body>
    </html>

    小白进阶,期待学友共同讨论和补充

    每天进步一点点
  • 相关阅读:
    Mac zsh: command not found zsh 所有命令在终端失效
    Java根据FreeMarker模板生成Word(doc)文档(带图片)
    2021年Java面试总结——自我篇
    toArray转换踩坑 java.lang.ClassCastException
    并发和并行
    protoBuf3学习
    StringBuffer和StringBuilder区别
    深拷贝和浅拷贝
    从不订购的客户
    使用jenkins遇到的问题汇总
  • 原文地址:https://www.cnblogs.com/677a/p/11732045.html
Copyright © 2011-2022 走看看