HTML5 cancas

本文介绍了HTML5的canvas元素,用于动态渲染图形。详细讲述了canvas的使用步骤,包括设置宽高、获取上下文及绘制图形的方法。同时,文章对比了canvas与SVG的区别,强调了canvas在图像密集型游戏中的优势,而SVG则适合大型渲染区域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

canvas:画布

canvas : 画布,它是一个标签; 允许脚本(js)动态渲染图形

canvas 的使用

1. html中需要定义一个canvas 标签

 <canvas id="mycanvas" height="" width=""></canvas>

注:canvas 的宽高,要通过height,width属性去设置

2. js 中获取canvas,得到canvas 上下文,调用对应的属性和方法

 var context = document.getElementById("mycanvas").getContext("2d");

3. canvas 绘制图形
3.1直线
在这里插入图片描述

 // 绘制直线
     function drawLine() {
          context.moveTo(0,0) ; //设置起点 x,y
        context.lineWidth=5;
        context.strokeStyle="red";
       //直线中的点
        context.lineTo(500,300);
        // 结束
        context.stroke();
      }

3.2添加折点:
在这里插入图片描述

    function drawLine() {
        context.moveTo(0,0);
        context.lineWidth=5;
        context.strokeStyle="red";
       //直线中的点
        context.lineTo(500,300);
        // 结束
        context.stroke();

        // 新开始路径      context.restore恢复到上一次保存
        context.beginPath();
        context.moveTo(200,200);
        context.lineTo(500,300);
        context.lineWidth=5;
        context.strokeStyle="green";
        context.stroke();
    }

3.3矩形 :
在这里插入图片描述

  // 画矩形
      function drawRect() {
                 //边框线
        context.strokeStyle="red";
        context.lineWidth=2;
        //坐标(x,y)宽高
        context.strokeRect(50,50,100,50);
        //填充
        context.fillStyle="green";
        //调用填充的方法  坐标(x,y)宽高
        context.fillRect(50,50,100,50);
      }

3.4弧度

   //画弧度
      function drawArc() {
          // arc 参数
          /*
          * 1, 圆心x 坐标 2,圆心y坐标 , 3.半径  4.开始的弧度  5.结束的弧度
          * 6. 绘制方向,true:逆时针,false:顺时针
          *
          * 注:角度和弧度的转换公式
          * 角度 = 弧度 * Math.PI /180
          * */
       context.arc(100,100,50,0,360*Math.PI/180,true);
       context.stroke();
      }

4. 图形的变换

 context.translate(x,y);  //平移
 context.scale(x,y); //放大
 context.rotate(x,y); //旋转

画布旋转
在这里插入图片描述

    function roate() {
        context.moveTo(0,0);
        context.lineTo(100,0);
        context.lineWidth=5;
        context.stroke();

        context.beginPath();
        context.rotate(30*Math.PI/180);
        context.moveTo(0,0);
        context.lineTo(100,0);
        context.lineWidth=5;
        context.stroke();


    }
 canvas 原理:
 双缓冲画布,一个用于显示给用户,一个内存中使用的,绘制图像时,都以内存画布为准,进行绘制  
     //画时钟:
     context.beginPath();
     context.closePath();
     context.restore(); //重复到上一次在保存
     context.save()

     context.clearRect();  
  1. canvas 绘制图像
    //绘制图像
    //刷新后出现图像
    function drawImage() {
        // 参数:context.drawImage(img,x,y)
        // 参数:context.drawImage(img,x,y,height,width);  指定要绘制图像的宽高
        context.drawImage(img,0,0,50,50);
    }

在这里插入图片描述

     context.drawImage(img,x,y);  //img:图片对象  x: x坐标,y 
      context.drawImage(img,x,y,width,height);
      //img:图片对象  x: x坐标,y ,width:宽度, height:高

       context.drawImage(img,cut_x,cut_y,cut_width,cut_height , draw_x,draw_y,draw_width,draw_heigth);
  1. canvas vs svg(矢量)

Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的

SVG

SVG 是一种使用 XML 描述 2D 图形的语言。
SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。
在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。

Canvas

Canvas 通过 JavaScript 来绘制 2D 图形。
Canvas 是逐像素进行渲染的。
在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。

Canvas
1.依赖分辨率
2.不支持事件处理器
3.弱的文本渲染能力
4.能够以 .png或 .jpg 格式保存结果图像
5.最适合图像密集型的游戏,其中的许
多对象会被频繁重绘

SVG
1.不依赖分辨率
2.支持事件处理器
3.最适合带有大型渲染区域的应用程序(比如谷歌地图)
4.复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
5.不适合游戏应用

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas{
            border: 1px red solid;
        }
    </style>
</head>
<body>
<!--canvas的宽高只能在标签中设置-->
<canvas id="myCanvas" height="300" width="500">

</canvas>
<img src="img/11.png" alt="" id="img" style="display: none">
<script type="text/javascript">
    let myCanvas = document.getElementById("myCanvas");
    // 得到cancas的上下文,调用对应属性和方法
    let context = myCanvas.getContext("2d");
    let img = document.getElementById("img");

    //调用绘制函数
    // drawLine();
    // drawJuXing();
    // drawYuan();
    roate();

    // drawImage();


    // context.clearRect(x,y,h,w);清除矩形

    //通过canvas画线(绘制图形)
    // 绘制直线
    function drawLine() {
        context.moveTo(0,0);
        context.lineWidth=5;
        context.strokeStyle="red";
       //直线中的点
        context.lineTo(200,200);
        // 结束
        context.stroke();

        // 新开始路径      context.restore恢复到上一次保存
        context.beginPath();
        context.moveTo(200,200);
        context.lineTo(500,300);
        context.lineWidth=5;
        context.strokeStyle="green";
        context.stroke();
    }

    //绘制矩形
    function drawJuXing() {
        //边框线
        context.strokeStyle="red";
        context.lineWidth=2;
        //坐标(x,y)宽高
        context.strokeRect(50,50,100,50);
        //填充
        context.fillStyle="green";
        //调用填充的方法  坐标(x,y)宽高
        context.fillRect(50,50,100,50);

    }

    // 绘制圆形(有弧度的)
    function drawYuan() {
        /*arc(圆心的x坐标,圆心的y坐标,半径,开始的弧度,结束的弧度,
        顺时针还是逆时针(true为逆时针,false为顺时针))
        角度和弧度的转换:角度=弧度*Math.PI/180
        */
       context.arc(100,100,50,0,360*Math.PI/180,true);
       context.stroke();
    }

    //画布旋转
    //canvas双缓冲画布,一个给用户看,一个在内存中使用,绘制图像时,都以内存画布为准
    function roate() {
        context.moveTo(0,0);
        context.lineTo(100,0);
        context.lineWidth=5;
        context.stroke();

        context.beginPath();
        context.rotate(30*Math.PI/180);
        context.moveTo(0,0);
        context.lineTo(100,0);
        context.lineWidth=5;
        context.stroke();


    }

    //绘制图像
    //刷新后出现图像
    function drawImage() {
        // 参数:context.drawImage(img,x,y)
        // 参数:context.drawImage(img,x,y,height,width);  指定要绘制图像的宽高
        context.drawImage(img,0,0,50,50);
    }
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值