入门canvas

99 阅读3分钟

canvas和SVG的区别

SVG是使用XML标签来绘制图形的,而canvas是通过js当笔刷绘制图形的。

正文

canvas是HTML5新增的标签,这个标签会占据一块页面区域,根据其自身提供的api,动态的在画布上绘制图片。

创建< canvas>元素时至少要设置width和height属性来表示画布的宽和高;

要在画布上绘制图形,首先要取得绘图上下文。使用getContext()方法可以获取对绘图上下文的引用。

<canvas id="drawing" width="200" height="200">
    A drawing of something.
</canvas>
<script>
    let drawing = document.getElementById("drawing");
    // 确保浏览器支持 
    if (drawing.getContext) {
        // 需要给这个方法传入参数‘2d’表示要获取2D上下文对象。
        let context = drawing.getContext("2d");
        // 其他代码 
    }
</script>

2D绘图上下文提供了绘制2D图形的方法,包括矩形、弧形和路径。它的坐标原点(0,0)默认在canvas画布的左上角。

填充和描边

2D 上下文有两个基本绘制操作:填充(fillStyle)和描边(strokeStyle)。相当于css里的background-color和border-color

<script>
    let drawing = document.getElementById("drawing");
    if (drawing.getContext) {
        let context = drawing.getContext("2d");
        context.strokeStyle = "red";
        context.fillStyle = "#0000ff";
    }
</script>
绘制矩形

绘制矩形的3个相关api,都接收4个参数,x坐标、y坐标、矩形宽度和矩形高度:

  • fillRect()
  • strokeRect();
  • clearRect();
<script>
    let drawing = document.getElementById("drawing");
    if (drawing.getContext) {
        let context = drawing.getContext("2d");
        // 绘制红色矩形 
        context.fillStyle = "#ff0000"; 
        context.fillRect(10, 10, 50, 50); 
        // 绘制半透明蓝色矩形 
        context.fillStyle = "rgba(0,0,255,0.5)"; 
        context.fillRect(30, 30, 50, 50);
    }
</script>

以上代码先将 fillStyle 设置为红色并在坐标点(10, 10)绘制了一个宽高均为 50 像素的矩形。接 着,使用 rgba()格式将 fillStyle 设置为半透明蓝色,并绘制了另一个与第一个部分重叠的矩形。 结果就是可以透过蓝色矩形看到红色矩形。

image.png

<script>
    let drawing = document.getElementById("drawing");
    if (drawing.getContext) {
        let context = drawing.getContext("2d");
        // 绘制红色矩形 
        context.strokeStyle = "#ff0000"; 
        context.strokeRect(10, 10, 50, 50); 
        // 绘制半透明蓝色矩形 
        context.strokeStyle = "rgba(0,0,255,0.5)"; 
        context.strokeRect(30, 30, 50, 50);
    }
</script>

以上代码同样绘制了两个重叠的矩形,不过只有轮廓,而不是实心的。

image.png

<script>
    let drawing = document.getElementById("drawing");
    if (drawing.getContext) {
        let context = drawing.getContext("2d");
        // 绘制红色矩形 
        context.fillStyle = "#ff0000"; 
        context.fillRect(10, 10, 50, 50); 
        // 绘制半透明蓝色矩形 
        context.fillStyle = "rgba(0,0,255,0.5)"; 
        context.fillRect(30, 30, 50, 50);
        
        // 在前两个矩形重叠的区域擦除一个矩形区域
        context.clearRect(40, 40, 10, 10);
    }
</script>

以上代码在两个矩形重叠的区域上擦除了一个小矩形

image.png

绘制路径

2D绘图上下文支持绘制路径的api 通过路径可以创建复杂的形状和线条,绘制路径前需要调用beginPath()

  • arc(x, y, radius, startAngle, endAngle, counterclockwise):以坐标(x, y)为圆 心,以 radius 为半径绘制一条弧线,起始角度为 startAngle,结束角度为 endAngle(都是 弧度)。最后一个参数 counterclockwise 表示是否逆时针计算起始角度和结束角度(默认为 顺时针)。
// 创建路径
context.beginPath();
// 绘制圆形
context.arc(100, 100, 99, 0, 2 * Math.PI, false);
// 描边
context.stroke();

image.png

  • arcTo(x1, y1, x2, y2, radius):以给定半径 radius,经由(x1, y1)绘制一条从上一点 到(x2, y2)的弧线。
  • bezierCurveTo(c1x, c1y, c2x, c2y, x, y):以(c1x, c1y)和(c2x, c2y)为控制点, 绘制一条从上一点到(x, y)的弧线(三次贝塞尔曲线)。
  • lineTo(x, y):绘制一条从上一点到(x, y)的直线。
  • moveTo(x, y):不绘制线条,只把绘制光标移动到(x, y)。 - quadraticCurveTo(cx, cy, x, y):以(cx, cy)为控制点,绘制一条从上一点到(x, y) 的弧线(二次贝塞尔曲线)。
  • ... 创建路径之后,可以使用 closePath()方法绘制一条返回起点的线。如果路径已经完成,则既可 以指定 fillStyle 属性并调用 fill()方法来填充路径,也可以指定 strokeStyle 属性并调用 stroke()方法来描画路径,
绘制文本
  • font:以 CSS 语法指定的字体样式、大小、字体族等,比如"10px Arial"。
  • textAlign:指定文本的对齐方式,可能的值包括"start"、"end"、"left"、"right"和 "center"。推荐使用"start"和"end",不使用"left"和"right",因为前者无论在从左到右 书写的语言还是从右到左书写的语言中含义都更明确。
  • textBaseLine :指定文本的基线,可能的值包括 "top" 、 "hanging" 、 "middle" 、 "alphabetic"、"ideographic"和"bottom"。