先构建一个基础页面,左上角画一个矩形。

数据可视化(上) - 图1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>canvas Test</title>
  6. <style type="text/css">
  7. #box {
  8. background: #000;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <canvas id="box" width="600" height="300"></canvas>
  14. <script type="text/javascript">
  15. const cvs = document.querySelector('#box');
  16. const ctx = cvs.getContext('2d');
  17. console.log(ctx);
  18. // https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/fillRect
  19. ctx.fillStyle = "red";
  20. ctx.fillRect(0, 0, 20, 10)
  21. </script>
  22. </body>
  23. </html>

基础

我想让它在左下角

数据可视化(上) - 图2

  1. const height = cvs.height
  2. const width = cvs.width
  3. ctx.fillStyle = 'red'
  4. ctx.fillRect(0, height - 10, 20, 10)

画两个接起来,然后用变量来标识它们,然后找规律。

  1. w = 20
  2. h = 10
  3. ctx.fillStyle = 'red'
  4. ctx.fillRect(0, height - h, w, h)
  5. ctx.fillRect(0, height - 2 * h - 2, w, h)

多弄几个再找。

  1. w = 20
  2. h = 10
  3. ctx.fillStyle = 'red'
  4. ctx.fillRect(0, height - h, w, h)
  5. ctx.fillRect(0, height - 2 * h - 2, w, h)
  6. ctx.fillRect(0, height - 3 * h - 4, w, h)
  7. ctx.fillRect(0, height - 4 * h - 6, w, h)

然后再补一些变量,这样就找到规律了。

  1. ctx.fillRect(0, height - 1 * h - 0, w, h)
  2. ctx.fillRect(0, height - 2 * h - 2, w, h)
  3. ctx.fillRect(0, height - 3 * h - 4, w, h)
  4. ctx.fillRect(0, height - 4 * h - 6, w, h)

用循环写出来。

  1. let w = 20
  2. let h = 10
  3. let margin = 2 // 间隔
  4. let size = 4 // 方块数目
  5. ctx.fillStyle = 'red'
  6. for (let i = 0; i <= size; i++) {
  7. ctx.fillRect(0, height - (i + 1) * h - margin * i, w, h)
  8. }

假设有一个 255 以内的随机数据,我们要映射到一个 20 的范围,获取百分比,乘以最大值即可。

  1. let ramdom = 255 * Math.random()
  2. let maxSize = 20 // -> 255
  3. currentSize = Math.ceil((ramdom / 255) * maxSize)
  4. console.log(currentSize)

每一帧都设置这个值,这样就动起来了。

数据可视化(上) - 图3

  1. function Run() {
  2. let ramdom = 255 * Math.random()
  3. let maxSize = 20 // -> 255
  4. currentSize = Math.ceil((ramdom / 255) * maxSize)
  5. ctx.clearRect(0, 0, width, height)
  6. for (let i = 0; i <= currentSize; i++) {
  7. ctx.fillRect(0, height - (i + 1) * h - margin * i, w, h)
  8. }
  9. requestAnimationFrame(Run)
  10. }
  11. Run()