使用原生js+canvas实现模拟心电图的实例

发布时间 - 2026-01-11 03:19:44    点击率:

从2015年2月转行进入IT行业,到现在也有将近两年的时间了,从最开始的java到现在的前端,前进的路上一直靠自己摸索,一路走到现在,前端大神是绝对谈不上的,最多算一只刚入门的菜鸟。

从最开始的懵懵懂懂,到现在学着开始写github、写博客,其实技术上没有太多可写的,毕竟自己也才刚刚入门,只能说是按照自己的兴趣,写点有意思的小项目,项目上存在的问题,也希望大神能够予以指正,目前这个demo的功能已经实现,后期我会对样式、代码等方面进行优化。

项目运行效果:

项目简介:使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧!

1:在页面上创建一个canvas画布,要让心电图的“线”在我们的页面上动起来,canvas是必不可少的。因为项目比较简单,到此为止页面上的DOM元素已经写完了,主要的工作量集中在js部分

<div class="heartBeat">
   <canvas id="can">Canvas画板</canvas>
 </div>

2:定义几个变量并赋值,运行时会需要用到这些变量进行计算

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

3:初始化画布,给画布设置各种属性

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

可以看到,在这里我们还没有涉及到“画”的动作,仅仅只是初始化了画布尺寸,使画布充满屏幕,同时定义了画笔的颜色、粗细、落笔点等操作,然后使用setInterval方法让画笔不停地按照我们计算的路线运动,如果你对setInterval方法不是很熟悉,建议你看下 setInterVal用法 ,这里不再敷述。因为我们想要让心电图无限循环且自动执行,所以在这里将它封装为start()函数,这样当心电图运动到屏幕最右方时,我们重新执行这个start()函数,就可以实现让心电图无限循环了

4.让心电图动起来!可以说,前面的步骤都没有什么难度,真正的核心代码在于让我们的心电图动起来,并且是按照我们希望的路线前进,下面我们就让心电图真正活过来

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

        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+=5
        }else{
          //假如flag为false,表示向波峰运动,y的值是不断减小的
          y-=5
        }
      }
    }
    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();
  }

5:注意事项,到这里实际上心电图已经可以运行起来了,但是要注意的是,设置你的body高度为100%,否则画布可能无法撑满整个页面

html,body{
   width: 100%;
   height: 100%;
   margin: 0;
  }

项目完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>模拟心电图</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  <style>
    html,body{
      width: 100%;
      height: 100%;
      margin: 0;
    }
  </style>
</head>
<body>
<div id="canvas">
  <canvas id="can">Canvas画板</canvas>
</div>

<script src="js/vue.min.js"></script>
<script>
  var can = document.getElementById('can'),
    pan,
    index = 0,
    flag = true,
    wid = document.body.clientWidth,
    hei = document.body.clientHeight,
    x = 0,
    y = hei/2;
  start();
  function start(){
    can.height = hei;
    can.width = wid;
    pan = can.getContext("2d");//获取2D图像API接口
    pan.strokeStyle = "#08b95a";//设置画笔颜色
    pan.lineJoin = "round";//设置画笔轨迹基于圆点拼接
    pan.lineWidth = 9;//设置画笔粗细
    pan.beginPath();
    pan.moveTo(x,y);
    index = setInterval(move,1);
  };
  function move(){
    x++;
    if(x < 100){

    }else{
      if(x >= wid - 100){

      }else{
        var z = Math.random()*280;
        if(y <= z){
          flag = true
        }
        if((hei - y) <= z){
          flag = false
        }
        if(flag){
          y+=5
        }else{
          y-=5
        }
      }
    }
    if(x == wid){
      pan.closePath();
      clearInterval(index);
      index = 0;
      x = 0;
      y = hei/2;
      flag = true;
      start();
    }
    pan.lineTo(x,y);
    pan.stroke();
  }

 /* */

</script>
</body>
</html>

以上这篇使用原生js+canvas实现模拟心电图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# canvas  # 心电图  # 利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解  # JavaScript canvas实现围绕旋转动画  # 一步步教你利用Canvas对图片进行处理  # canvas基础绘制-绚丽倒计时的实例  # Js利用Canvas实现图片压缩功能  # JS+canvas画一个圆锥实例代码  # 的是  # 在这里  # 让我们  # 大神  # 给大家  # 不做  # 自己的  # 都是  # 圆点  # 有什么  # 几个  # 还没有  # 也有  # 菜鸟  # 一只  # 最多  # 走到  # 都没  # 可以说  # 两年 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  iOS中将个别页面强制横屏其他页面竖屏  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  C语言设计一个闪闪的圣诞树  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  大型企业网站制作流程,做网站需要注册公司吗?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何用低价快速搭建高质量网站?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  三星网站视频制作教程下载,三星w23网页如何全屏?  如何用IIS7快速搭建并优化网站站点?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  html5的keygen标签为什么废弃_替代方案说明【解答】  javascript中的try catch异常捕获机制用法分析  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel如何优化应用性能?(缓存和优化命令)  Swift开发中switch语句值绑定模式  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  在centOS 7安装mysql 5.7的详细教程  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何快速选择适合个人网站的云服务器配置?  Android利用动画实现背景逐渐变暗  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何快速搭建虚拟主机网站?新手必看指南  如何安全更换建站之星模板并保留数据?  如何注册花生壳免费域名并搭建个人网站?  如何在阿里云ECS服务器部署织梦CMS网站?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何快速完成中国万网建站详细流程?  详解vue.js组件化开发实践  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  手机网站制作与建设方案,手机网站如何建设?  再谈Python中的字符串与字符编码(推荐)  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何快速生成可下载的建站源码工具?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  ,交易猫的商品怎么发布到网站上去?  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何快速生成ASP一键建站模板并优化安全性?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】