Canvas学习笔记

本文详细介绍了HTML5 Canvas的学习笔记,从兼容性、获取上下文到图形绘制,包括矩形、路径、样式修改、文本和图片绘制,以及状态保存、变换、组合图形等。并分享了自转公转模型、时钟、渲染效果和写字版等多个实战案例的实现思路与代码实现。
摘要由CSDN通过智能技术生成

Canvas 学习笔记

0. 参考文档

菜鸟教程
源码github地址

1. 兼容性以及获取上下文

<script>
  var canvas = document.getElementById('plot');
  let ctx = null;
  canvas.getContext &&
    (() => {
    
      console.log(canvas.getContext('2d'));
      ctx = canvas.getContext('2d');
    })();
</script>
  • 创建一个长宽固定的 canvas 标签
  • 通过 id 选择器选择其标签
  • 然后通过检测其 getContext 是否存在,来判断 canvas 标签是否支持 canvas 标签
  • 这里得到的 ctx 对象即为我该 canvas 标签的上下文, 之后对其进行操作即可

2. 画一个矩形

<canvas id="plot" width="300" height="300"></canvas>
<script>
  var canvas = document.getElementById('plot');
  canvas.getContext &&
    (() => {
    
      const ctx = canvas.getContext('2d');
      /* 先设置一个描边的样式stroke */
      ctx.strokeStyle = '#f44';
      ctx.lineWidth = 3;
      /*画出描边的图形*/
      ctx.strokeRect(10, 10, 55, 50);
      ctx.fillStyle = '#eee';
      ctx.fillRect(10, 10, 55, 50);
    })();
</script>
  • 使用 canvas 画图形: 1.使用设置对应的画笔样式 2. 用对应的画笔样式画出图形
  • stoke*描边的图形
  • fill*实心的图形
  • 这里的初始的坐标点是将绘制 canvas 画布的左上角作为原点的,向右和下分别为 x, y 的正坐标
  • 这里画矩形的 strokeRect 参数为 矩形左上角点的的 x, y 离原点的距离以及长和宽

3. 路径的绘制

  • 新建一条路径 (beginPath)
  • 确定路径的起点 (moveTo(x, y))
  • 调用绘制方法绘制路径(直线曲线) (arc, lineTo)
  • 封闭路径 (closePath) -> 这一步如果需要画出闭合的图像可用,如果是一个非封闭图形,可以不用
  • 用描边 stroke() 或者 填充 fill()方法来进行渲染

Notes: 如果使用的是 fill 来进行渲染,那么一定是自动生成闭合图形后进行填充的

通过 moveTo 来指定绘图的起始点,之后若是封闭路径,最后的结束点会和这个起始点连接

1. 直线绘制
<canvas id="plot" width="300" height="300"></canvas>
<script>
  var canvas = document.getElementById('plot');
  canvas.getContext &&
    (() => {
    
      const context = canvas.getContext('2d');
      context.beginPath();
      context.moveTo(30, 30);
      context.lineTo(50, 40);
      context.lineTo(40, 50);
      // 非封闭图形
      // context.closePath();

      context.strokeStyle = '#f44';
      context.stroke();
    })();
</script>
2. 弧形绘制
  • arc(x, y, r, startAngle, endAngle, anticlockwise)
    • x: 圆心的 x 轴坐标
    • y: 圆心的 y 轴坐标
    • startAngle: 开始的弧形弧度 (角度 / 180 * Math.PI)
    • endAngle: 结束的弧形弧度 (角度 / 180 * Math.PI)
    • anticlosewise: 顺逆时针(true: 逆时针, false: 顺时针)

startAngle 为 0 的位置在以圆心为 x 轴的 x 轴上

context.beginPath(0);
context.moveTo(100, 100);
context.arc(100, 100, 50, (Math.PI / 180) * 30, (Math.PI / 180) * 120, false);
context.closePath();
context.strokeStyle = '#f44';
context.stroke();
  • arcTo(x1, y1, x2, y2, radius)
    • x1: 参考点的横坐标
    • y1: 参考点的纵坐标
    • x2: 结束点的横坐标
    • y2: 结束点的纵坐标
    • radius: 指定的半径
context.beginPath();
context.moveTo(100, 100); // 初始点的坐标
context.arcTo(300, 100, 300, 300, 200);
context.closePath();
context.strokeStyle = '#f44';
context.stroke();

Arc参考点起始点,结束点的关系

3. 画贝塞尔曲线
  • 二次贝塞尔曲线 quadraticCurveTo(cp1x, cp1y, x, y)
    • cp1x: 控制点 1 的横坐标
    • cp1y: 控制点 1 的纵坐标
    • x: 结束点 的横坐标
    • y: 结束点 的纵坐标
const canvas = document.getElementById('bezier');
const context = canvas.getContext('2d');
context.beginPath();
context.moveTo(10, 200);
context.quadraticCurveTo(40, 100, 200, 200);
context.stroke();
  • 三次贝塞尔曲线 bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
    • cp1x: 控制点 1 的横坐标
    • cp1y: 控制点 1 的纵坐标
    • cp2x: 控制点 2 的横坐标
    • cp2y: 控制点 2 的纵坐标
    • x: 结束点的横坐标
    • y: 结束点的纵坐标
context.beginPath();
context.moveTo(10, 50);
context.bezierCurveTo(20, 0, 60, 20, 100, 50);
context.strokeStyle = '#f44';
context.stroke();

context.beginPath();
context.moveTo(10, 50);
context.bezierCurveTo(20, 100, 60, 80, 100, 50);
context.strokeStyle = '#f44';
context.stroke();

4. 样式的修改

1. 上色
  1. fillStyle = color; 设置图形的填充颜色
  2. strokeStyle = color; 设置图形轮廓的颜色
    这里的 color 可以是 16 进制纯色例如: ‘#f44’, 或者自带的颜色’red’, 也可以是渐变色
  3. 渐变色设置
var gradient = ctx.createLinearGradient(0, 0, 170, 150);
gradient.addColorStop('0', 'magenta');
gradient.addColorStop('0.3', 'blue');
gradient.addColorStop('0.6', 'red');
gradient.addColorStop('1.0', 'yellow');

ctx.strokeStyle = gradient;
ctx.lineWidth = 5;
ctx.strokeRect(20, 20, 150, 100);
  • 通过 createLinearGradient 创建一个渐变对象,从左上角到右下角的
  • addColorStop(present, color)
    • present: 颜色停止的百分比
    • color: 停止时的颜色
  • 得到的 gradient 即是渐变的颜色
  1. 色谱图的实现
<canvas id="canvas" width="500" height="500"></canvas>
<script>
  const canvas = document.getElementById('canvas');
  const context = canvas.getContext('2d');

  context.lineWidth = 5;
  context.strokeStyle = '#333';
  context.strokeRect(100, 100, 300, 300
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值