当前位置:首页 > JavaScript

js 实现监控图

2026-04-04 15:57:35JavaScript

使用 Canvas 绘制基础监控图

Canvas 是 HTML5 提供的绘图 API,适合实现动态监控图。通过 getContext('2d') 获取绘图上下文,使用 lineTo()stroke() 绘制折线。

const canvas = document.getElementById('monitorCanvas');
const ctx = canvas.getContext('2d');

function drawLineChart(data) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();
  data.forEach((value, index) => {
    const x = index * (canvas.width / (data.length - 1));
    const y = canvas.height - value * (canvas.height / 100);
    index === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
  });
  ctx.strokeStyle = '#3498db';
  ctx.stroke();
}

使用 Chart.js 快速构建

Chart.js 是流行的开源图表库,只需几行代码即可生成交互式监控图。引入库后创建 Chart 实例,配置 type: 'line' 即可。

import Chart from 'chart.js/auto';

const ctx = document.getElementById('monitorChart').getContext('2d');
const chart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: Array(24).fill().map((_, i) => `${i}:00`),
    datasets: [{
      label: 'CPU Usage',
      data: [30, 45, 60, 55, 70, 65],
      borderColor: 'rgb(75, 192, 192)'
    }]
  }
});

实时数据更新策略

监控图通常需要动态更新数据。使用 requestAnimationFrame 实现平滑动画,或通过 WebSocket 连接实时数据源。

// 模拟实时数据
function updateChart() {
  const newData = Math.random() * 100;
  chart.data.datasets[0].data.push(newData);
  chart.data.datasets[0].data.shift();
  chart.update();
  setTimeout(updateChart, 1000);
}
updateChart();

性能优化技巧

对于高频更新的监控图,采用双缓冲技术减少闪烁。离屏 Canvas 预渲染图像,再通过 drawImage 快速切换。

const offscreenCanvas = document.createElement('canvas');
offscreenCanvas.width = canvas.width;
offscreenCanvas.height = canvas.height;
const offscreenCtx = offscreenCanvas.getContext('2d');

function render() {
  // 在离屏Canvas绘制
  offscreenCtx.clearRect(0, 0, canvas.width, canvas.height);
  // ...绘制逻辑

  // 主Canvas快速渲染
  ctx.drawImage(offscreenCanvas, 0, 0);
  requestAnimationFrame(render);
}

响应式设计实现

通过监听 resize 事件动态调整图表尺寸,使用 CSS 百分比确保容器自适应。

window.addEventListener('resize', () => {
  chart.resize();
});

<style>
  .chart-container {
    width: 80vw;
    height: 60vh;
  }
</style>

异常数据处理

监控数据可能包含缺失值,通过线性插值填充空白点保持曲线连贯性。

js 实现监控图

function interpolateMissing(data) {
  return data.map((val, i) => {
    if (val !== null) return val;
    const prev = data.slice(0, i).reverse().find(v => v !== null);
    const next = data.slice(i).find(v => v !== null);
    return prev && next ? (prev + next) / 2 : 0;
  });
}

标签: js
分享给朋友:

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…