📚前端面试题速记
Q2

Canvas 动画:用 HTML5 Canvas 做动画的大致步骤?

速记答案(30 秒)

创建canvas获取上下文 → 定义状态和绘制函数 → 清空画布+绘制 → requestAnimationFrame循环。关键:时间步长deltaTime、双缓冲、避免频繁创建对象。

📖 详细讲解

标准面试回答(推荐记住)

用Canvas做动画的步骤:首先在HTML里创建canvas元素并获取2d或webgl上下文;然后定义动画状态(位置、速度、角度等)和绘制函数draw();在draw()里先清空画布,再根据当前状态绘制图形;最后使用requestAnimationFrame做循环,每一帧更新状态再调用draw()。关键优化点包括:使用时间步长deltaTime保证不同帧率下动画一致、双缓冲或分层绘制、避免在动画循环中频繁创建对象。

动画循环核心模式

let lastTime = 0;

function animate(currentTime) {
  const deltaTime = currentTime - lastTime;
  lastTime = currentTime;
  
  update(deltaTime);  // 更新状态
  render();           // 绘制
  
  requestAnimationFrame(animate);
}

性能优化技巧

  • 离屏Canvas:复杂静态内容预渲染
  • 分层绘制:背景层和动画层分离
  • 脏矩形:只重绘变化区域

面试要点

  • 掌握requestAnimationFrame的使用
  • 理解时间步长deltaTime的重要性
  • 知道常见的Canvas性能优化方法

💻 代码示例

Canvas 动画基础
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

let x = 0;
let lastTime = 0;

function animate(currentTime) {
  const deltaTime = (currentTime - lastTime) / 1000;
  lastTime = currentTime;
  
  // 清空画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  
  // 更新状态
  x += 100 * deltaTime; // 100px/秒
  if (x > canvas.width) x = 0;
  
  // 绘制
  ctx.fillStyle = 'blue';
  ctx.fillRect(x, 100, 50, 50);
  
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);