canvas入门教程-附demo

一、canvas简介

  • canvas(“画布”)本身是HTML5提供的一种新标签, 标签本身只是图形容器,需要通过脚本 (通常是JavaScript)可以进行图形的绘制(canvas有多种绘制路径、矩形、圆形、字符以及添加图像的方法)。
  • canvas目前主要可以应用于游戏、数据可视化、图片的操作等领域。
二、canvas基础用法 1.canvas标签 canvas标签可以说是我们绘制的容器,内容的绘制我们需要依靠canvas的context对象来实现,标签有两个自有的属性width和height,用来规定画布的宽高, 标签支持 HTML 的全局属性,另外我们可以在标签中嵌入后备内容,在不支持的设备上让用户了解当前内容。
您的浏览器不支持canvas,请更换浏览器。

2.canvas的坐标系 在进行绘制操作前我们还需要了解一下canvas的坐标
canvas入门教程-附demo
文章图片

3.基本api context:canvas的上下文、绘制环境,所有操作的api都是基于context,我们需要通过js来操作context来进行绘制,可以结合注释进行学习
从下面的代码中我们可以学习如何进行文字、线段、矩形、圆形等基本图形的绘制
const canvasDom = document.getElementById('myCanvas') // 获取画布元素 const ctx = canvasDom.getContext('2d') // 获取canvas对象 2D绘图的上下文 ctx.font = '38px Arial' // 文本相关设置 ctx.fillStyle = 'orange' // 填充色 ctx.fillText('一些基础图形', 320, 300) // 绘制填充的文本 ctx.fillRect(50, 198, 50, 104) // 绘制矩形ctx.beginPath() // 绘制路径开始 ctx.lineWidth = 3 // 线条宽度 ctx.strokeStyle = 'red' // 填充色 ctx.moveTo(100, 200) // 绘制起点(x, y) ctx.lineTo(300, 300) // 绘制直线(x,y) ctx.lineTo(100, 300) ctx.closePath() // 绘制路径闭合 闭合路径会自动把结束的点和开始的线连在一起 ctx.stroke() // 绘制线段ctx.beginPath() ctx.lineWidth = 16 ctx.strokeStyle = 'blue' ctx.fillStyle = 'green' // 绘制圆形 圆心坐标 半径长度 初始角度 结束角度 顺时针、逆时针绘制 // (x,y,r,sAngle,eAngle,counterclockwise) ctx.arc(220, 194, 50, 0, 1 * Math.PI, false) ctx.stroke() ctx.fill() // 是将闭合的路径的内容进行填充 ctx.beginPath() ctx.strokeStyle = 'green' ctx.fillStyle = 'blue' ctx.arc(220, 194, 50, 0, 1 * Math.PI, true) ctx.stroke() ctx.fill() ctx.beginPath() ctx.fillStyle = 'red' ctx.lineWidth = 2 ctx.rect(110, 240, 50, 50) // 绘制矩形 (x, y, width, height) ctx.stroke() ctx.fill()

运行效果如图:
canvas入门教程-附demo
文章图片

最后我们可以使用clearRect进行清除操作,可以实现涂鸦的橡皮擦也可以整个画面做清空操作
参数和绘制矩形一样 坐标以及清除的长宽(x, y, width, hegiht)
ctx.clearRect(110, 240, 20, 20) // 清除局部 ctx.clearRect(0, 0, 800, 800) // 初始点坐标 加容器宽高 清除全部

canvas入门教程-附demo
文章图片

图片的绘制会在下面案例进行讲解
三、canvas基础案例 1.图片的放大旋转 绘制图片需要使用drawImage方法
drawImage(img,sx,sy,swidth,sheight,x,y,width,height)

参数 说明 是否必须
img 规定要使用的图像、画布或视频
sx 开始剪切的 x 坐标位置
sy 开始剪切的 y 坐标位置
swidth 被剪切图像的宽度
sheight 被剪切图像的高度
x 在画布上放置图像的 x 坐标位置
y 在画布上放置图像的 y 坐标位置
width 要使用的图像的宽度
height 要使用的图像的高度
下面我们结合实例看一下
您的浏览器不支持canvas,请更换浏览器 您的浏览器不支持canvas,请更换浏览器

canvas入门教程-附demo
文章图片

2.本地压缩图片下载&&常规文件格式体积限制

canvas入门教程-附demo
文章图片

3.解决canvas转图片不清晰 在开发中我曾经遇到了绘制的图片看起来十分的模糊,实际上是画布尺寸与画布范围内实际像素不一致造成。为了解决这个问题,优化用户体验我才用的方案是直接解决canvas转图片不清晰,直接容器宽高*2处理的
const canvas = document.getElementById('canvas') canvas.style.backgroundColor = '#FFF' canvas.style.width = _width + 'px' canvas.style.height = _height + 'px' canvas.width = _width * 2 canvas.height = _height * 2

更优的方案应该是根据设备的dpr去做
const canvas = document.getElementById('canvas') const dpr = (scale = window.devicePixelRatio || 1) const rect = canvas.getBoundingClientRect() canvas.width = rect.width * dpr canvas.height = rect.height * dpr canvas.style.width = rect.width + 'px' canvas.style.height = rect.height + 'px'

处理前
canvas入门教程-附demo
文章图片

处理后
canvas入门教程-附demo
文章图片

4.最后附上一个小效果
您的浏览器不支持canvas,请更换浏览器

canvas入门教程-附demo
文章图片

四、浏览器支持
  • canvas的基础支持基本覆盖当前主流浏览器
  • canvas在移动端的兼容情况非常不错
  • IE9以下浏览器可以考虑使用 Explorercanvas
canvas入门教程-附demo
文章图片

*目前3D(WebGL)和2D在一些老版本浏览器兼容有所不同
canvas入门教程-附demo
文章图片

canvas入门教程-附demo
文章图片

【canvas入门教程-附demo】更多相关支持可以查看 caniuse
五、第三方库推荐
  • IE9以下浏览器使用canvas Explorercanvas
  • echart 可视化图表库
  • paperjs 矢量图形脚本框架
  • pixijs 2D sprite渲染引擎

    推荐阅读