SOURCE

console 命令行工具 X clear

                    
>
console
var can = document.getElementById('can'),
//画布对象
pan,
//获取2D图像API接口
index = 0,
//用来接收setinerval的值
flag = true,
//用来控制心电图折线的运行方向
wid = 400,
//获取浏览器宽度
hei = 400,
//获取浏览器高度
x = 0,
//心电图的“点”在画布上的x轴坐标,从0开始
y = hei / 2; //心电图的“点”在画布上的y轴坐标,从页面y轴居中位置开始

start();

function start() {
  can.height = hei; //设置画布高度
  can.width = wid; //设置画布宽度
  pan = can.getContext("2d"); //获取2D图像API接口
  pan.strokeStyle = "#08b95a"; //设置画笔颜色
  pan.lineJoin = "round"; //设置画笔轨迹基于圆点拼接
  pan.lineWidth = 2; //设置画笔粗细
  pan.beginPath(); //开始一条画笔的路径
  pan.moveTo(x, y); //定位我们的“落笔点”
  index = setInterval(move, 20); //让我们的画笔动起来
};

function move() {
  x++; //x轴是始终运动的,所以x一直自增
  if (x < 40) {
    //前100px,我们不希望做垂直运动,让点只沿垂直方向运动即可,所以不做任何操作
  } else {
    if (x >= wid - 40) {
      //最后的100px,同样希望心电图只做水平运动,不会上下波动,所以不做任何操作
      y=hei / 2;
    } else {
      //为了让心电图看起来更加逼真,我们希望心电图在运动时每次的波峰和波谷都是随机的,这样更类似于人类的心跳,所以我们给它一个随机值z
      var z = Math.random() * 180;

      if (y <= z) {
        //画布的坐标是从左上角开始计算的,也就是最左上角的点的坐标是(0,0),y是当前画笔所在坐标的y轴,假如y小于z,就代表y已经到达波峰位置,准备开始向波谷运动
        flag = true
      }
      if ((hei - y) <= z) {
        //假如当前画笔在y轴的坐标y距离浏览器底部hei的差值已经小于随机值z,代表当前的画笔已经运行到波谷位置,准备转向波峰位置运动
        flag = false
      }
      if (flag) {
        //假如flag为true,代表画笔仍然向波谷位置前进,需要花点功夫理解的是,因为画布左上角的点的坐标是(0,0),所以y的值越大,画笔在y轴的位置越靠近浏览器底部,所以向波谷运动时,y的值是不断增加的,同时为了让波峰波谷更陡峭,我这里设置y += 5,
        y += 3
      } else {
        //假如flag为false,表示向波峰运动,y的值是不断减小的
        y -=3
      }
    }
  }
  if (x == wid) {
    //当画笔运动到浏览器右侧边缘,停止绘图
    pan.closePath();
    //清除循环
    clearInterval(index);
    //将index置零,准备下一次循环
    index = 0;
    //重新定位画笔到屏幕左侧上下居中的位置
    x = 0;
    y = hei / 2;
    flag = true;
    //重新进行下一次心电图的绘制
    start();
  }
  //lineTo和stroke函数负责描绘运动轨迹
  pan.lineTo(x, y);
  pan.stroke();
}
<div class="heartBeat">
    
  <canvas id="can">
    Canvas画板
  </canvas>
</div>