Canvas 入门与进阶


简介

  • ​<canvas> 是 HTML5 新增的,可以用来制作照片集或者制作简单的动画,甚至可以进行实时视频处理和渲染的标签
  • ​Canvas 是由 HTML 代码配合高度和宽度属性而定义出的可绘制区域,可以理解称为画布,在该画布中,JavaScript 不能获取画布内元素的 DOM,只能获取整块画布的 DOM
  • Mozilla 程序从 Gecko 1.8 (Firefox 1.5) 开始支持 <canvas> 标签, Internet Explorer 从 IE9 开始 <canvas> 标签,Chrome 和 Opera 9+ 也支持 <canvas> 标签
  • <canvas> 标签只有两个可选属性:width、heigth 属性,如果不设置 widht、height 属性,则默认 width 为300px、height 为 150px。也可以使用 CSS 属性来设置画布的宽高,但如果宽和高属性的比例和初始比例不一致,会出现扭曲,所以,不建议使用 CSS 属性来设置 <canvas> 的宽高

一、Canvas 基础使用

1、canvas 元素不显示替换

  • 由于在一些较老的浏览器(尤其是 IE9 之前的 IE 浏览器)或者本身不支持 HTML 元素 <canvas> 的浏览器上不会显示 <canvas> 画布中的内容,所以在这些浏览器上你应该总是能展示替代内容,类似于 <img src="" alt="" /> 标签的 alt 属性
  • 支持 <canvas> 的浏览器会只渲染 <canvas> 标签,而忽略其中的替代内容。不支持 <canvas> 的浏览器则会直接渲染替代内容
  • <canvas> 标签的结束标签 </canvas> 不可省略。与 <img> 元素不同,如果结束标签 </canvas> 不存在,则 <canvas> 标签之后的其余部分会被认为是替代内容,将不会显示出来

文本替换:

<canvas>
	替换文本内容
</canvas>

图片替换:

<canvas>
	<img src="images/替换图片.jpg" alt="图片不显示时的替换文本">
</canvas>

2、绘制矩形

canvas 提供了三种方法绘制矩形:

  • fillRect(x, y, width, height):绘制一个填充的矩形。
  • strokeRect(x, y, width, height):绘制一个矩形的边框。
  • clearRect(x, y, widh, height):清除指定的矩形区域,然后这块区域会变的完全透明。
  • 参数说明:
    x, y: 指的是矩形的左上角的坐标。(相对于canvas的坐标原点)
    width, height:指的是绘制的矩形的宽和高。

其它:

  • fillStyle="" :可以设置填充颜色(配合 fillRect(x, y, width, height) 使用),不设置默认是 black(黑色)
  • strokeStyle = ‘color’:设置图形轮廓的颜色
  • 不填充矩形的边框颜色默认是灰色
<body>
  <canvas id="canvas" width="300px" height="150px"></canvas>
  <script>
    // 获取 DOM 对象
    const canvas = document.getElementById('canvas')
    
    // 获取 Canvas 对象
    const ctx = canvas.getContext('2d')
    
    // 设置填充颜色
    ctx.fillStyle = 'red'
    
    // 创建填充矩形
    ctx.fillRect(10,10,60,60)
    
    // 创建不填充矩形,边框颜色灰色
    ctx.strokeRect(70, 70, 50, 50)

    // 将指定区域变为透明
    ctx.clearRect(40,40,50,50)
  </script>
</body>

3、绘制路径(Path,也称为线段)

  • beginPath():表示开始绘制路径
  • moveTo(x, y):指定开始绘制坐标
  • lineTo(x, y):指定绘制坐标的终(中)点,设置多个则会形成折线
  • closePath():如果线段数大于等于 2,而且设置 closePath(),就会闭合形成一个多边形
  • fill():填充闭合区域。如果path没有闭合,则fill()会自动闭合路径。
  • stroke():只有设置 stroke() 才会生成线段
  • 参数说明:
    x, y: 指的是矩形的左上角的坐标。(相对于canvas的坐标原点)

其它:

  • lineWidth = Number:表示线宽大小
  • strokeStyle = ‘color’:设置图形轮廓的颜色
  • 不填充矩形的边框颜色默认是黑色
<body>
  <canvas id="canvas" width="300px" height="150px"></canvas>
  <script>
    // 获取 DOM 对象
    const canvas = document.getElementById('canvas')
    
    // 获取 Canvas 对象
    const ctx = canvas.getContext('2d')
    
    // 表示开始绘制路径
    ctx.beginPath()

	// 设置线条宽度
	ctx.lineWidth = 1
	
 	// 设置线条颜色
    ctx.strokeStyle = 'blue';

    // 起始坐标 moveTo(x, y)
    ctx.moveTo(30, 30)

    // 第一段线的终点坐标 lineTo(x, y)
    ctx.lineTo(100, 100)

    // 如果绘制的是折线,还可以继续指定从当前终点坐标作为起点到下一个终点坐标
    // ctx.lineTo(180, 80)
    // ……

    // 如果线段数大于等于 2,而且设置 closePath(),就会闭合形成一个多边形
    // ctx.closePath()
    
    //填充闭合区域。如果path没有闭合,则fill()会自动闭合路径。
    ctx.fill(); 
    
    // 只有设置 stroke() 才会生成线段
    ctx.stroke()
  </script>
</body>

4、绘制圆弧

  • beginPath():表示开始绘制路径
  • arc(x, y, r, startAngle, endAngle, anticlockwise):以(x, y) 为圆心,以r 为半径,从 startAngle 弧度开始到endAngle弧度结束。anticlosewise 是布尔值,true 表示逆时针,false 表示顺时针(默认是顺时针)
  • stroke():只有设置 stroke() 才会生成边框
  • fill():绘制圆形的填充色(配合 fillStyle=‘颜色’ 使用)

其它:

  • lineWidth = Number:表示线宽大小
  • strokeStyle = ‘颜色’:设置圆边框线条颜色
  • fillStyle = ‘颜色’:设置圆内部填充颜色
  • 不填充矩形的边框颜色默认是黑色
<body>
  <canvas id="canvas" width="300px" height="150px"></canvas>
  <script>
    // 获取 DOM 对象
    const canvas = document.getElementById('canvas')
    
    // 获取 Canvas 对象
    const ctx = canvas.getContext('2d')
    
    // 表示开始绘制路径
    ctx.beginPath()

	// 设置圆形边框线条宽度
	ctx.lineWidth = 1
	
 	// 设置圆形边框线条颜色
    ctx.strokeStyle = 'blue'
	
	// 设置圆形内部填充颜色
    ctx.fillStyle = 'red'
    
    // 绘制圆形
    ctx.arc(150, 75, 50, 0, 2 * Math.PI)

	// 绘制圆形的边框
    ctx.stroke()

	// 填充圆形内部颜色,需要搭配 fillStyle 使用
    ctx.fill()
    
  </script>
</body>

5、绘制文本

canvas 提供了两种方法来渲染文本:

  • fillText(text, x, y [, maxWidth]) :在指定的 (x,y) 位置填充指定的文本,绘制的最大宽度是可选的,文本内填充
  • strokeText(text, x, y [, maxWidth]) :在指定的 (x,y) 位置绘制文本边框,绘制的最大宽度是可选的,文本不填充

给文本添加样式:

  • font = value 当前我们用来绘制文本的样式:这个字符串使用和 CSS font 属性相同的语法,默认的字体是 10px sans-serif
  • textAlign = value 文本对齐选项:可选的值包括:start、end、left、right、center,默认值是 start
  • textBaseline = value 基线对齐选项:可选的值包括:top、hanging、middle、alphabetic、ideographic、bottom,默认值是 alphabetic
  • direction = value 文本方向:可能的值包括:ltr、rtl、inherit,默认值是 inherit
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext("2d");
// 设置字体大小和选用字体
ctx.font = "20px sans-serif"
// 文本内填充
ctx.fillText("测试文本", 10, 10);
// 文本不填充
ctx.strokeText("测试文本", 10, 20)

6、绘制图片

二、Canvas 进阶

1、设置线条末端样式 lineCap

lineCap = type 线条末端样式:

  • butt:线段末端以方形结束
  • round:线段末端以圆形结束,两端分别增加了以线宽为直径的半圆
  • square:线段末端以方形结束,但是增加了一个宽度和线段相同,高度是线段厚度一半的矩形区域。
var lineCaps = ["butt", "round", "square"];
 
for (var i = 0; i < 3; i++){
    ctx.beginPath();
    ctx.moveTo(20 + 30 * i, 30);
    ctx.lineTo(20 + 30 * i, 100);
    ctx.lineWidth = 20;
    ctx.lineCap = lineCaps[i];
    ctx.stroke();
}

2、虚线

  • 用 setLineDash 方法和 lineDashOffset 属性来制定虚线样式
  • setLineDash([实线长度, 间隙长度]) 方法接受一个数组,来指定线段与间隙的交替
  • lineDashOffset = Number 属性设置起始偏移量
var canvas = document.getElementById('canvas');

var ctx = canvas.getContext("2d");
 
ctx.setLineDash([20, 5]);  // [实线长度, 间隙长度]
ctx.lineDashOffset = -0;
ctx.strokeRect(50, 50, 210, 210);

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值