【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门

大家好,我是Java1234_小锋老师,最近更新 《一天学会 HTML5 视频教程(无废话版) 》专辑,感谢大家支持。

本课程主要介绍和讲解 HTML5简介,文档结构,文本与排版标签,链接与图片,列表标签,表格标签,表单基础以及增强,容器与页面结构基础,语义化标签,音频与视频,Canvas 基础以及动画入门,SVG 基础,Web Storage 本地存储 ,文件 API,拖放 API,地理定位 API,Web Workers 入门。

视频教程+课件+源码 打包下载 :

链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234

提取码:1234

HTML5(在第二阶段目录里)

HTML5 Canvas 基础以及动画入门

HTML5 Canvas 是一个用 JavaScript 绘制图形的位图画布。它适合做动画、游戏、图表、图像处理等。核心思想是:Canvas 是"立即模式",画上去就变成像素,不保留图形对象;做动画时,每一帧都要清空并重绘。

1. 基本使用

hmtl 复制代码
<canvas id="cv" width="600" height="400"></canvas>
<script>
  const canvas = document.getElementById('cv');
  const ctx = canvas.getContext('2d'); // 获取 2D 绘图上下文
</script>

坐标系:

  • 原点 (0,0) 在左上角
  • x 向右增大,y 向下增大
  • 单位是像素
  • canvas.width / height 是画布缓冲区尺寸,CSS 的 width/height 是显示尺寸,最好保持一致或处理高清屏。

2. 常用绘制 API

html 复制代码
// 矩形
ctx.fillStyle = 'skyblue'; // 设置填充颜色
ctx.fillRect(50, 50, 100, 80); // 绘制矩形

ctx.strokeStyle = 'red'; // 设置边框颜色
ctx.lineWidth = 3; // 设置边框宽度
ctx.strokeRect(200, 50, 100, 80); // 绘制矩形

// 路径:三角形
ctx.beginPath(); // 开始绘制路径
ctx.moveTo(350, 50); // 移动到起点
ctx.lineTo(450, 100); // 绘制直线
ctx.lineTo(400, 180); // 绘制直线
ctx.closePath(); // 闭合路径
ctx.fillStyle = 'orange'; // 设置填充颜色
ctx.fill(); // 填充路径
ctx.stroke(); // 描边路径

// 圆
ctx.beginPath(); // 开始绘制路径
ctx.arc(150, 250, 40, 0, Math.PI * 2); // 绘制圆
ctx.fillStyle = '#3498db'; // 设置填充颜色
ctx.fill(); // 填充路径

// 文本
ctx.font = '20px sans-serif'; // 设置字体
ctx.fillStyle = '#333'; // 设置填充颜色
ctx.fillText('Hello Canvas', 300, 250); // 绘制文本

常用状态:

  • fillStyle:填充色/渐变
  • strokeStyle:描边色
  • lineWidth:线宽
  • globalAlpha:透明度
  • save() / restore():保存和恢复状态,适合配合 translate、rotate、scale

3. 动画核心:requestAnimationFrame

动画三步:

  1. 清空画布:ctx.clearRect(0, 0, canvas.width, canvas.height)
  2. 更新数据:位置、速度、角度等
  3. 重新绘制
  4. 用 requestAnimationFrame 请求下一帧

不要用 setInterval 做动画,requestAnimationFrame 会跟随浏览器刷新率,通常约 60 FPS,后台标签页还会自动暂停。

4. 完整示例:弹跳小球

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Canvas 动画入门</title>
  <style>
    canvas {
      display: block;  /* 设置为块级元素 */
      margin: 20px auto; /* 设置外边距 */
      border: 1px solid #ccc; /* 设置边框 */
      background: #f7f7f7; /* 设置背景颜色 */
    }
  </style>
</head>
<body>
  <canvas id="cv" width="600" height="400"></canvas> <!-- 创建 canvas 元素 -->

  <script>
    const canvas = document.getElementById('cv'); // 获取 canvas 元素
    const ctx = canvas.getContext('2d'); // 获取 2D 绘图上下文

    let x = 100; // 小球 x 坐标
    let y = 100; // 小球 y 坐标
    let vx = 180; // 像素/秒
    let vy = 120; // 小球 y 速度
    let r = 20; // 小球半径

    let lastTime = 0; // 上次更新时间

    function update(dt) { // 更新小球
      x += vx * dt; // 更新小球 x 坐标
      y += vy * dt; // 更新小球 y 坐标

      // 左右边界反弹
      if (x - r < 0) { // 小球左边界
        x = r; // 小球 x 坐标
        vx = Math.abs(vx); // 小球 x 速度
      } else if (x + r > canvas.width) { // 小球右边界
        x = canvas.width - r; // 小球 x 坐标
        vx = -Math.abs(vx); // 小球 x 速度
      }

      // 上下边界反弹
      if (y - r < 0) { // 小球上边界
        y = r; // 小球 y 坐标
        vy = Math.abs(vy); // 小球 y 速度
      } else if (y + r > canvas.height) { // 小球下边界
        y = canvas.height - r; // 小球 y 坐标
        vy = -Math.abs(vy); // 小球 y 速度
      }
    }

    function draw() { // 绘制小球
      // 1. 清空
      ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布

      // 2. 绘制小球
      ctx.beginPath(); // 开始绘制路径
      ctx.arc(x, y, r, 0, Math.PI * 2); // 绘制圆
      ctx.fillStyle = '#3498db'; // 设置填充颜色
      ctx.fill(); // 填充路径

      ctx.lineWidth = 3; // 设置边框宽度
      ctx.strokeStyle = '#1c6ea4'; // 设置边框颜色
      ctx.stroke(); // 描边路径
    }

    function loop(now) { // 循环
      if (!lastTime) lastTime = now; // 上次更新时间

      // 秒为单位的时间差,限制最大 dt 防止切后台后跳变
      const dt = Math.min((now - lastTime) / 1000, 0.05); // 时间差 限制最大 dt 防止切后台后跳变
      lastTime = now; // 上次更新时间

      update(dt); // 更新小球
      draw(); // 绘制小球

      requestAnimationFrame(loop); // 请求动画帧
    }

    requestAnimationFrame(loop); // 请求动画帧
  </script>
</body>
</html>
相关推荐
知了学历孙老师4 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu6 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说6 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵8 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot8 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot8 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI8 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance8 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写8 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端