Table of Contents generated with DocToc

Canvas

Mozilla 官方 <canvas> 教程在这里

画布 <canvas> 的默认宽高为 300 与 150 ,但是同样可以使用 CSS 设定宽高。但因为 CSS 与 JavaScript 在渲染工程中有速度的差异,所以不建议使用 CSS 对 <canvas> 的宽高做设定。

  1. <canvas id="canvasId" width="300" height="150">
  2. </canvas>

渲染上下文对象

下面的 ctx 即为渲染上下文对象。globalCompositeOperation 为对于 canvas 绘画时的渲染属性设置,具体表现如下图所示。

  1. var canvas = document.getElementById('canvasId');
  2. var ctx = canvas.getContext('2d');
  3. // 绘画 canvas 的属性
  4. ctx.globalCompositeOperation = 'destination-over';

Canvas - 图1

绘图步骤

Canvas - 图2

一个周期就是完整的一帧的绘画过程。

Canvas - 图3

  1. var sun = new Image();
  2. var moon = new Image();
  3. var earth = new Image();
  4. function init() {
  5. sun.src = 'Canvas_sun.png';
  6. moon.src = 'Canvas_moon.png';
  7. earth.src = 'Canvas_earth.png';
  8. window.requestAnimationFrame(draw);
  9. }
  10. function draw(){
  11. var ctx = document.getElementById('canvas').getContext('2d');
  12. ctx.globalCompositeOperation = 'destination-over';
  13. // 清空画布内容
  14. ctx.clearRect(0, 0, 300, 300);
  15. ctx.fillStyle = 'rgba(0, 0, 0, 0.4)';
  16. ctx.strokeStyle = 'rgba(0, 153, 255, 0.4)';
  17. // 保存画布状态
  18. ctx.save();
  19. ctx.translate(150, 150);
  20. // 开始绘制图形
  21. // 地球
  22. var time = new Date();
  23. ctx.rotate(((2*Math.PI)/60)* time.getSeconds() + ((2*Math.PI)/60000)*time.getMilliseconds());
  24. ctx.translate(105, 0);
  25. // 阴影
  26. ctx.fillRect(0, -12, 50, 24);
  27. ctx.drawImage(earth, -12, -12);
  28. // 月亮
  29. ctx.rotate(((2*Math.PI)/6)*time.getSeconds() + ((2*Math.PI)/6000)*time.getMilliseconds());
  30. ctx.translate(0, 28.5);
  31. ctx.drawInmage(moon, -3.5, -3.5);
  32. // 恢复画布状态
  33. ctx.restore();
  34. ctx.beginPath();
  35. ctx.arc(150, 150, 105, 0, Math.PI*2, false);
  36. ctx.stroke();
  37. ctx.drawImage(sun, 0, 0, 300, 300);
  38. window.requestAnimationFrame(draw);
  39. }
  40. init();