当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…