原生JS实现动态折线图

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原生JS实现动态折线图</title>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
let N = new CreateMovingLineDiagram();
//N.SetData.cavaswidth = 800//改变canvas宽度
N.play(); function CreateMovingLineDiagram() {
let _this = this;
//默认参数
_this.SetData = {
canvasid: "#canvas",// 画布ID
canvaswidth: 600,//画布宽度
canvasheight: 400,//画布高度
segmentationNum: 50,//分段数,将画布宽度分割成多少分
MoveSpeed: 100,//移动速度
IsShowsegmentationBool: true,//是否开启分段显示
IsCurveBool: true//true使用曲线绘图,false使用直线绘图
}
_this.play = function() {
let canvas = document.querySelector(_this.SetData.canvasid); //获取Canvas元素
canvas.width = _this.SetData.canvaswidth; //设置画布宽
canvas.height = _this.SetData.canvasheight; //设置画布高 let context = canvas.getContext("2d"); //使用Context绘画2D
let segmentation = _this.SetData.segmentationNum //分段数
let Speed = _this.SetData.MoveSpeed //绘画速度
let XYAttr = []; //分段坐标数组
let XZ = canvas.width / segmentation //得到每一段的X坐标
let XW = 0; //已生成的X坐标
let IsShowsegmentation = _this.SetData.IsShowsegmentationBool; //是否显示分段线
let IsCurve = _this.SetData.IsCurveBool; //是否绘画曲线 //进入页面先创建空数组
for (var i = 0; i < segmentation + 1; i++) {
XYAttr.push({
"X": XW,
"Y": canvas.height / 2
})
if (XW != canvas.width) {
XW += XZ;
}
} setInterval(function() {
canvas.height = canvas.height; //先清除画布
if (IsShowsegmentation) {
for (var i = 0; i < segmentation + 1; i++) {
//画线
context.moveTo((i * XZ), 0);
context.lineTo((i * XZ), canvas.height)
context.strokeStyle = "#aaa";
context.stroke();
context.beginPath();
}
} for (var i = 0; i < XYAttr.length; i++) {
if (IsCurve) {
//绘制曲线
if (i > 0) {
context.beginPath();
context.moveTo(XYAttr[i - 1].X, XYAttr[i - 1].Y);
context.quadraticCurveTo(XYAttr[i - 1].X, XYAttr[i].Y, XYAttr[i].X, XYAttr[i].Y); } } else {
//绘制直线
if (i > 0) {
context.beginPath();
context.moveTo(XYAttr[i - 1].X, XYAttr[i - 1].Y);
context.lineTo(XYAttr[i].X, XYAttr[i].Y)
}
} context.strokeStyle = "coral";
context.stroke();
} XYAttr.splice(0, 1);
//随机数据
round = Math.floor(Math.random() * canvas.height); for (var i = 0; i < XYAttr.length; i++) {
XYAttr[i].X = XYAttr[i].X - (XZ * 2)
} XYAttr.push({
"X": XW,
"Y": round
}) }, Speed)
}
} </script>
</body> </html>

效果图

基础代码就是以上写的了,更多高级拓展靠你们的脑袋了,如大佬有更好的做法可以在评论和我说,感激不尽

原生JS实现动态折线图的更多相关文章

  1. 原生js焦点轮播图的实现

    继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题, 简单解析一下思路: 1,首先写好css样式问题 2,考虑全局变量:自动播放的定时器,以及记录图片位置的角标Index 2 ...

  2. 原生js焦点轮播图

    原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...

  3. chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

    chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...

  4. 超酷HTML5 Canvas图表应用Chart.js自定义提示折线图

    超酷HTML5 Canvas图表应用Chart.js自定义提示折线图 效果预览 实例代码 <div class="htmleaf-container"> <div ...

  5. achartengine画出动态折线图

    achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...

  6. 原生js实现轮播图

    原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...

  7. 原生js手动轮播图

    手动轮播图,为轮播图中的一种,轮播图主要有无缝轮播,手动轮播,延迟轮播,切换轮播等等... 轮播图主要用于展现图片,新出商品,词条,又能美观网页.給网页中增加动态效果. 手动轮播,是小编认为最简单的一 ...

  8. 利用原生JS实现网页1920banner图滚动效果

    内容描述:随着PC设备硬件性能的进步和分辨率的不断提高,现在主流网站逐渐开始采用1920banner图,为适应这一趋势,博主设计了1920banner图的滚动效果,代码利用了原生JS实现了1920ba ...

  9. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

随机推荐

  1. JavaScript 流程控制-循环

    1.循环 循环目的 在实际问题中,有许多具有规律性的重复操作,因此在程序中要完成这类操作就需要重复执行某些语句 JS中的循环 在JS中,主要有三种类型的循环语句: for循环 while循环 do.. ...

  2. 预科班D6

    2020.09.14星期一 预科班D6 学习内容: 自习 发布小游戏 1.配置网络 #查看当前ip ifconfig #关闭NetworkManager systemctl stop NetworkM ...

  3. zookeeper(2) 文件系统

    这一节我们主要来看一下zookeeper文件系统的实现. 树结构 为了提高对指定节点的操作,zookeeper使用一个HashMap来存储树结构数据,key为数据路径,value为节点数据. 树节点( ...

  4. hystrix源码小贴士之调用异常处理

    executeCommandAndObserve方法处理onerror异常. return execution.doOnNext(markEmits) .doOnCompleted(markOnCom ...

  5. 论文阅读 A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SEN- TENCE EMBEDDINGS

    这篇论文提出了SIF sentence embedding方法, 作者提供的代码在Github. 引入 作为一种无监督计算句子之间相似度的方法, sif sentence embedding使用预训练 ...

  6. 一道无限极类 PHP 试题

    记某次笔试碰到的一道无限极类试题,当时时间比较紧(满满六页试题),还是手写代码,所以最终写的有点错误.记不住原题了,但是要求都知道,特此记录下来! 试题 有下面一个数组: $arr = [ '小红' ...

  7. java原生程序redis连接(连接池/长连接和短连接)选择问题

    最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下. 这个问题的具体发生在java原生程序和redis的交互中.这个问题对我最 ...

  8. Python self用法详解

    在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数.例如,定义一个 Person 类: class Person: def __init ...

  9. Java知识系统回顾整理01基础03变量08表达式

    一.以 ; 结尾的一段代码,即为一个表达式 表达式是由变量.操作符以及方法调用所构成的结构.如下所示: int i = 5; System.out.println(5); 都是表达式 public c ...

  10. 【学习笔记/题解】虚树/[SDOI2011]消耗战

    题目戳我 \(\text{Solution:}\) 题目很显然可以设\(dp[i]\)表示\(i\)的子树内的关键点都不和\(i\)联通的最小待机,有如下\(dp\)方程: \(v\in son_u, ...