查看: 136|回复: 1

HTML5 Canvas核心API与JavaScript绘图实践总结

[复制链接]
发表于 昨天 20:00 | 显示全部楼层 |阅读模式
Canvas是HTML5引入的一个用于动态绘制图形的元素,配合JavaScript API可创建图表、游戏图形、数据可视化等。本文将系统地总结Canvas的关键知识点,包括基本绘图、路径、曲线、文本、图像、变换、状态管理、渐变、模式、动画及性能优化,并提供可直接运行的代码示例。

一、Canvas基础与绘图上下文
在HTML中声明Canvas元素时,需指定宽高并通过JavaScript获取2D上下文:
  1. <canvas id="myCanvas" width="500" height="400">您的浏览器不支持canvas元素。</canvas>
  2. <script>
  3. var canvas = document.getElementById('myCanvas');
  4. var ctx = canvas.getContext('2d');
  5. </script>
复制代码

二、矩形绘制
Canvas提供三种矩形方法:
- fillRect(x, y, w, h):绘制填充矩形。
- strokeRect(x, y, w, h):绘制矩形边框。
- clearRect(x, y, w, h):清除指定区域使其透明。
示例:
  1. ctx.fillStyle = 'green';
  2. ctx.fillRect(10, 10, 100, 100);
  3. ctx.strokeStyle = 'blue';
  4. ctx.lineWidth = 5;
  5. ctx.strokeRect(120, 10, 100, 100);
  6. ctx.clearRect(50, 50, 60, 60);
复制代码

三、路径绘制
路径绘制需遵循以下步骤:beginPath()开始新路径,moveTo()移动画笔,lineTo()绘制线段,closePath()闭合路径,最后用fill()或stroke()填充/描边。例如绘制一个矩形边框:
  1. ctx.beginPath();
  2. ctx.moveTo(50, 50);
  3. ctx.lineTo(200, 50);
  4. ctx.lineTo(200, 200);
  5. ctx.lineTo(50, 200);
  6. ctx.closePath();
  7. ctx.stroke();
复制代码

四、贝塞尔曲线与弧线
1)二次贝塞尔曲线:quadraticCurveTo(cpx, cpy, x, y),一个控制点。
2)三次贝塞尔曲线:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y),两个控制点。
3)弧线:arc(x, y, radius, startAngle, endAngle, anticlockwise),角度用弧度表示。绘制完整圆:
  1. ctx.beginPath();
  2. ctx.arc(150, 150, 75, 0, Math.PI * 2, true);
  3. ctx.stroke();
复制代码

五、文本绘制
两种方法:fillText(text, x, y, maxWidth)填充文本,strokeText(text, x, y, maxWidth)描边文本。可通过font、fillStyle、strokeStyle设置样式:
  1. ctx.font = '30px Arial';
  2. ctx.fillStyle = 'black';
  3. ctx.fillText('Hello, Canvas!', 50, 50);
  4. ctx.strokeStyle = 'red';
  5. ctx.strokeText('Hello, Canvas!', 50, 100);
复制代码

六、图像绘制
drawImage方法有三种重载:
- drawImage(img, dx, dy) 在指定位置绘制完整图像。
- drawImage(img, dx, dy, dWidth, dHeight) 缩放到指定尺寸。
- drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 截取源图像部分区域绘制。
注意图像需onload后才可绘制:
  1. var img = new Image();
  2. img.onload = function() {
  3.   ctx.drawImage(img, 10, 10);
  4.   ctx.drawImage(img, 10, 150, 100, 100);
  5.   ctx.drawImage(img, 50, 50, 100, 100, 150, 150, 100, 100);
  6. };
  7. img.src = 'path/to/image.jpg';
复制代码

七、变换操作
1)平移:translate(x, y)移动原点。
2)旋转:rotate(angle)按弧度旋转。
3)缩放:scale(x, y)按倍数缩放。变换影响后续所有绘制,常与save/restore配合使用。
  1. ctx.translate(50, 50);
  2. ctx.fillRect(0, 0, 100, 100); // 实际绘制在(50,50)位置
  3. ctx.rotate(Math.PI / 4);
  4. ctx.fillRect(0, 0, 100, 100); // 旋转后矩形
复制代码

八、状态保存与恢复
save()保存当前状态(变换、裁剪、样式等),restore()恢复上一次保存的状态。适合做复杂变换而不影响后续绘制。

九、渐变与模式
1)线性渐变:createLinearGradient(x0,y0,x1,y1),addColorStop(offset, color)添加色标。
2)径向渐变:createRadialGradient(x0,y0,r0,x1,y1,r1),同理。
3)模式:createPattern(image, repetition)创建重复图案,repetition可为'repeat'/'repeat-x'/'repeat-y'/'no-repeat'。
  1. var linearGradient = ctx.createLinearGradient(0, 0, 200, 0);
  2. linearGradient.addColorStop(0, 'red');
  3. linearGradient.addColorStop(1, 'blue');
  4. ctx.fillStyle = linearGradient;
  5. ctx.fillRect(10, 10, 200, 100);
  6. var radialGradient = ctx.createRadialGradient(100, 100, 20, 100, 100, 100);
  7. radialGradient.addColorStop(0, 'white');
  8. radialGradient.addColorStop(1, 'black');
  9. ctx.fillStyle = radialGradient;
  10. ctx.fillRect(50, 50, 200, 200);
  11. var img = new Image();
  12. img.onload = function() {
  13.   var pattern = ctx.createPattern(img, 'repeat');
  14.   ctx.fillStyle = pattern;
  15.   ctx.fillRect(10, 10, 200, 100);
  16. };
  17. img.src = 'path/to/image.jpg';
复制代码

十、动画实现
推荐使用requestAnimationFrame代替setTimeout/setInterval,它会在浏览器重绘时调用,节省资源且后台标签页自动暂停。典型的动画循环:
  1. var x = 0;
  2. function draw() {
  3.   ctx.clearRect(0, 0, canvas.width, canvas.height);
  4.   ctx.fillRect(x, 50, 50, 50);
  5.   x += 2;
  6.   requestAnimationFrame(draw);
  7. }
  8. draw();
复制代码

十一、性能优化
1)使用requestAnimationFrame而不是定时器,减少不必要的CPU消耗。
2)合并绘图操作,避免频繁清除和重绘。
3)利用离屏Canvas预渲染复杂图形:创建临时canvas并绘制,再用drawImage一次性绘制到主Canvas上。
  1. var offscreenCanvas = document.createElement('canvas');
  2. var offscreenCtx = offscreenCanvas.getContext('2d');
  3. offscreenCanvas.width = 500;
  4. offscreenCanvas.height = 400;
  5. offscreenCtx.fillStyle = 'green';
  6. offscreenCtx.fillRect(0, 0, 100, 100);
  7. ctx.drawImage(offscreenCanvas, 0, 0);
复制代码

总结上述知识点,Canvas为前端图形开发提供了丰富而灵活的API,掌握这些基础操作、变换、动画及优化技巧,可以有效构建高性能的网页图形应用。
回复

使用道具 举报

发表于 昨天 20:10 | 显示全部楼层

Re: HTML5 Canvas核心API与JavaScript绘图实践总结

这篇总结非常全面,从基础到进阶覆盖了Canvas最关键的知识点,代码示例清晰实用,对新手和想回顾的开发者都很有帮助。特别是状态保存/恢复和变换的配合,以及渐变/模式部分,实际项目中经常用到。另外,如果能把性能优化(比如离屏渲染、requestAnimationFrame的用法)也展开一下,可能对做动画的用户更有参考价值。感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-11 00:01 , Processed in 0.075377 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部