当前位置:   article > 正文

canvas 基本用法_canvas用法

canvas用法

一、什么是canvas

Canvas 是 HTML5 新增的元素,它就像一块幕布,可通过JavaScript脚本在 Web 页面上绘制图形、动画和其他可视化内容。

二、canvas用法

  1. <!--1.创建画布-->
  2. <canvas id="myCanvas"></canvas> // 如果没有设置宽高,那么会自动创建一个 300 * 150 的画布(单位默认为 px)
  3. // 2.获取绘图上下文
  4. const canvas = document.getElementById('myCanvas') // 获取画布节点
  5. const ctx = canvas.getContext('2d') // 代表一个二维渲染上下文
  6. // 3.设置绘制属性
  7. canvas.width = 500 // 设置画布宽度
  8. canvas.height = 500 // 设置画布高度
  9. ctx.fillText('我是文本', 30, 20) // 绘制文本内容和坐标
  10. ctx.fillStyle = 'red' // 设置填充颜色
  11. ctx.font = '18px Arial' // 设置文本大小和字体
  12. ctx.textAlign = 'center' // 设置水平对齐方式
  13. ctx.textBaseline = "middle" // 设置垂直对齐方式
  14. ctx.setLineDash([5, 5]) // 设置虚线
  15. ctx.lineWidth = 2 // 设置线条宽度为2像素
  16. // 4.绘制矩形
  17. ctx.fillRect(10, 10, 10, 10) // 绘制填充矩形
  18. ctx.strokeRect(70, 10, 50, 50) // 绘制描边矩形
  19. // 5.绘制路径
  20. ctx.beginPath() // 开始新路径
  21. ctx.moveTo(100, 100) // 移动到起始点
  22. ctx.lineTo(150, 150) // 创建直线路径
  23. ctx.lineTo(200, 100) // 创建直线路径
  24. ctx.closePath() // 关闭路径
  25. ctx.stroke() // 描边路径
  26. ctx.fill() // 填充路径
  27. // 6.清除画布内容
  28. ctx.clearRect(0, 0, canvas.width, canvas.height)

canvas 常用方法如下:

方法描述示例
getContext('2d')获取 2D 绘图上下文对象

const ctx = canvas.getContext('2d');

beginPath()开始一个新的路径

ctx.beginPath();

moveTo(x, y)将路径移动到指定的坐标点

ctx.moveTo(100, 100);

lineTo(x, y)添加一条从当前位置到指定坐标点的直线

ctx.lineTo(200, 200);

closePath()闭合路径

ctx.closePath();

stroke()绘制路径的描边

ctx.stroke();

fill()填充路径

ctx.fill();

fillRect(x, y, width, height)绘制填充矩形

ctx.fillRect(10, 10, 50, 50);

strokeRect(x, y, width, height)绘制描边矩形

ctx.strokeRect(10, 10, 50, 50);

clearRect(x, y, width, height)清除指定矩形区域的内容

ctx.clearRect(0, 0, canvas.width, canvas.height);

strokeText(text, x,  y)在指定位置给文本描边ctx.strokeText('hello', 50, 60)
fillText(text, x, y)在指定位置绘制填充文本

ctx.fillText('Hello, Canvas!', 50, 50);

font设置当前文本样式

ctx.font = '20px Arial';

fillStyle设置绘图的填充颜色或样式

ctx.fillStyle = 'red';

strokeStyle设置绘图的描边颜色或样式

ctx.strokeStyle = 'blue';

lineWidth设置描边线条的宽度

ctx.lineWidth = 2;

arc(x, y, radius, startAngle, endAngle, anticlockwise)创建弧形路径

ctx.arc(100, 100, 50, 0, Math.PI * 2, false);

x,y表示圆心坐标

r 表示圆的半径

startAngle : 表示开始绘制的角度

endAngle : 表示结束绘制的角度

anticlockwise:false顺时针,true逆时针,默认false

drawImage(image, x, y)在指定位置绘制图像

ctx.drawImage(image, 0, 0);

save()保存当前绘图上下文的状态

ctx.save();

restore()恢复之前保存的绘图上下文的状态

ctx.restore();

三、绘制案例

1.绘制直线

  1. <canvas id="myCanvas"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. // 设置直线样式
  5. ctx.strokeStyle = 'red' // 设置线条颜色为红色
  6. ctx.lineWidth = 2 // 设置线条宽度为2像素
  7. // 绘制直线
  8. ctx.beginPath()
  9. ctx.moveTo(50, 130) // 设置直线起点坐标
  10. ctx.lineTo(260, 130) // 设置直线终点坐标
  11. ctx.stroke() // 绘制直线
  12. // 添加备注
  13. ctx.fillStyle = 'red'
  14. ctx.font = '18px Arial'
  15. ctx.fillText('canvas绘制直线', 60, 200)

2.绘制曲线

  1. <canvas id="myCanvas" width="500" height="500"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. // 设置曲线样式
  5. ctx.strokeStyle = 'blue'; // 设置线条颜色为蓝色
  6. ctx.lineWidth = 2; // 设置线条宽度为2像素
  7. // 绘制二次贝塞尔曲线
  8. ctx.beginPath();
  9. ctx.moveTo(50, 200); // 设置曲线起点坐标
  10. ctx.quadraticCurveTo(150, 50, 250, 200); // 设置控制点坐标和终点坐标
  11. ctx.stroke(); // 绘制曲线
  12. // 添加备注
  13. ctx.fillStyle = 'black';
  14. ctx.font = '14px Arial';
  15. ctx.fillText('二次贝塞尔曲线', 100, 100);

3.绘制矩形

  1. <canvas id="myCanvas"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. ctx.strokeStyle = 'red'
  5. ctx.beginPath() // 开始绘制
  6. ctx.strokeRect(50, 100, 200, 100) // 参数(x轴坐标, y轴坐标, w宽度, h高度)
  7. ctx.closePath()

4.绘制圆形

  1. <canvas id="myCanvas"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. // 绘制圆形
  5. ctx.beginPath() // 开始路径
  6. ctx.arc(100, 100, 50, 0, 2*Math.PI) // 参数为 (x, y, radius, startAngle, endAngle)
  7. ctx.fillStyle = 'red' // 设置颜色
  8. ctx.fill() // 填充路径
  9. ctx.closePath() // 闭合路径

5.绘制三角形

  1. <canvas id="myCanvas" width="500" height="500"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. // 设置三角形样式
  5. ctx.fillStyle = 'red' // 设置填充颜色为红色
  6. // 绘制三角形
  7. ctx.beginPath();
  8. ctx.moveTo(150, 100) // 设置第一个顶点坐标
  9. ctx.lineTo(100, 200) // 设置第二个顶点坐标
  10. ctx.lineTo(200, 200) // 设置第三个顶点坐标
  11. ctx.closePath() // 将第三个顶点与第一个顶点连接起来
  12. ctx.fill() // 填充三角形
  13. // 添加备注
  14. ctx.fillStyle = 'black'
  15. ctx.font = '14px Arial'
  16. ctx.fillText('三角形示例', 120, 80)

6.绘制扇形

  1. <canvas id="myCanvas" width="500" height="500"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. // 设置扇形样式
  5. ctx.fillStyle = 'red' // 设置填充颜色为红色
  6. // 绘制扇形
  7. ctx.beginPath()
  8. ctx.moveTo(150, 150) // 设置圆心坐标
  9. ctx.arc(150, 150, 100, 0, Math.PI*0.5) // 绘制扇形路径
  10. ctx.closePath() // 将路径闭合
  11. ctx.fill() // 填充扇形
  12. // 添加备注
  13. ctx.fillStyle = 'black'
  14. ctx.font = '14px Arial'
  15. ctx.fillText('扇形示例', 200, 120)

7.绘制图片

  1. <canvas id="myCanvas"></canvas>
  2. const canvas = document.getElementById('myCanvas')
  3. const ctx = canvas.getContext('2d')
  4. const img = new Image()
  5. img.src = 'https://zk-web-object.oss-cn-qingdao.aliyuncs.com/wxy/img/6.jpg'
  6. img.onload = function() {
  7. ctx.drawImage(img, 0, 0, 200, 100) // 参数(要绘制的图片, x轴, y轴, w宽度, h高度)
  8. }

8.绘制签名画板

  1. <canvas id="signCanvas" width="380" height="200"></canvas>
  2. <button class="btn" id="clearButton">清除</button>
  3. const canvas = document.getElementById('signCanvas');
  4. const ctx = canvas.getContext('2d');
  5. let isDrawing = false;
  6. // 鼠标或触摸事件开始绘制
  7. canvas.addEventListener('mousedown', startDrawing);
  8. canvas.addEventListener('touchstart', startDrawing);
  9. // 鼠标或触摸事件绘制中
  10. canvas.addEventListener('mousemove', draw);
  11. canvas.addEventListener('touchmove', draw);
  12. // 鼠标或触摸事件结束绘制
  13. canvas.addEventListener('mouseup', stopDrawing);
  14. canvas.addEventListener('touchend', stopDrawing);
  15. canvas.addEventListener('mouseout', stopDrawing);
  16. // 清除按钮点击事件
  17. const clearButton = document.getElementById('clearButton');
  18. clearButton.addEventListener('click', clearCanvas);
  19. // 开始绘制
  20. function startDrawing(e) {
  21. isDrawing = true;
  22. const { offsetX, offsetY } = getOffset(e);
  23. ctx.beginPath();
  24. ctx.moveTo(offsetX, offsetY);
  25. }
  26. // 绘制中
  27. function draw(e) {
  28. if (!isDrawing) return;
  29. const { offsetX, offsetY } = getOffset(e);
  30. ctx.lineTo(offsetX, offsetY);
  31. ctx.stroke();
  32. }
  33. // 结束绘制
  34. function stopDrawing() {
  35. isDrawing = false;
  36. }
  37. // 清除画布
  38. function clearCanvas() {
  39. ctx.clearRect(0, 0, canvas.width, canvas.height);
  40. }
  41. // 获取鼠标或触摸事件的偏移量
  42. function getOffset(e) {
  43. const rect = canvas.getBoundingClientRect();
  44. let offsetX, offsetY;
  45. if (e.type.includes('touch')) {
  46. offsetX = e.touches[0].clientX - rect.left;
  47. offsetY = e.touches[0].clientY - rect.top;
  48. } else {
  49. offsetX = e.offsetX;
  50. offsetY = e.offsetY;
  51. }
  52. return { offsetX, offsetY };
  53. }

9.绘制行星运行图

  1. const canvas = document.getElementById('myCanvas')
  2. const ctx = canvas.getContext('2d')
  3. // 定义太阳系中行星的数据
  4. const planets = [
  5. { name: 'Sun', radius: 50, distance: 0, speed: 0, color: 'yellow' },
  6. { name: 'Mercury', radius: 5, distance: 100, speed: 0.02, color: 'gray' },
  7. { name: 'Venus', radius: 8, distance: 150, speed: 0.015, color: 'orange' },
  8. { name: 'Earth', radius: 10, distance: 200, speed: 0.01, color: 'blue' },
  9. { name: 'Spark', radius: 7, distance: 242, speed: 0.008, color: 'red' }
  10. ]
  11. // 动画循环
  12. function draw() {
  13. ctx.clearRect(0, 0, canvas.width, canvas.height)
  14. // 绘制太阳
  15. ctx.beginPath()
  16. ctx.arc(canvas.width / 2, canvas.height / 2, planets[0].radius, 0, Math.PI * 2)
  17. ctx.fillStyle = planets[0].color
  18. ctx.fill()
  19. // 绘制行星和轨道
  20. for (let i = 1; i < planets.length; i++) {
  21. const planet = planets[i]
  22. planet.angle = (planet.angle || 0) + planet.speed
  23. const x = canvas.width / 2 + planet.distance * Math.cos(planet.angle)
  24. const y = canvas.height / 2 + planet.distance * Math.sin(planet.angle)
  25. // 绘制轨道
  26. ctx.beginPath()
  27. ctx.arc(canvas.width / 2, canvas.height / 2, planet.distance, 0, Math.PI * 2)
  28. ctx.strokeStyle = '#999'
  29. ctx.stroke()
  30. // 绘制行星
  31. ctx.beginPath()
  32. ctx.arc(x, y, planet.radius, 0, Math.PI * 2)
  33. ctx.fillStyle = planet.color
  34. ctx.fill()
  35. }
  36. requestAnimationFrame(draw)
  37. }
  38. // 启动动画
  39. draw()

 四、canvas应用场景

领域描述
游戏开发创建2D和3D游戏,绘制游戏场景、角色和动画效果
数据可视化绘制交互式的数据可视化图表和图形,呈现数据分析和趋势
图像处理图像编辑、转换和操作,应用滤镜效果、裁剪和调整图像大小
图形绘制和绘画创建绘画应用、图形编辑器和图形设计工具,实现图形绘制和编辑功能
用户界面创建自定义的用户界面元素和动画效果,实现交互式用户体验
广告和营销创作吸引人的广告和营销内容,展示产品特点和实现交互式广告体验

五、canvas实现小游戏

​贪吃蛇
http://zk-web-object.oss-cn-qingdao.aliyuncs.com/wxy/canvas/game01.html


俄罗斯方块
https://zk-web-object.oss-cn-qingdao.aliyuncs.com/wxy/canvas/game02.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号