当前位置:首页 > JavaScript

js实现环图

2026-03-15 19:52:09JavaScript

使用 Canvas 绘制环图

Canvas 是 HTML5 提供的绘图 API,适合动态生成图形。以下代码示例展示如何绘制一个基础环图:

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const radius = 100;
const lineWidth = 30;

function drawRing(percentage, color) {
  const startAngle = -Math.PI / 2;
  const endAngle = startAngle + (percentage * Math.PI * 2);

  ctx.beginPath();
  ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);
  ctx.strokeStyle = '#eee';
  ctx.lineWidth = lineWidth;
  ctx.stroke();

  ctx.beginPath();
  ctx.arc(centerX, centerY, radius, startAngle, endAngle);
  ctx.strokeStyle = color;
  ctx.lineWidth = lineWidth;
  ctx.stroke();
}

drawRing(0.75, '#4285F4'); // 75% 完成度

使用 SVG 创建环图

SVG 是矢量图形标准,适合需要缩放且保持清晰度的场景:

<svg width="200" height="200" viewBox="0 0 200 200">
  <circle cx="100" cy="100" r="80" 
          stroke="#eee" stroke-width="20" fill="none"/>
  <circle cx="100" cy="100" r="80" 
          stroke="#4285F4" stroke-width="20" 
          stroke-dasharray="502.65" 
          stroke-dashoffset="${502.65 * (1 - 0.75)}" 
          fill="none" transform="rotate(-90 100 100)"/>
</svg>

计算公式:

js实现环图

  • 周长 = 2 π r → 2 3.1416 80 ≈ 502.65
  • dashoffset = 周长 * (1 - 百分比)

使用 Chart.js 库

Chart.js 提供现成的环形图(doughnut chart)组件:

const ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
  type: 'doughnut',
  data: {
    datasets: [{
      data: [75, 25],
      backgroundColor: ['#4285F4', '#eee'],
      borderWidth: 0
    }]
  },
  options: {
    cutout: '70%'
  }
});

使用 CSS 实现简易环图

纯 CSS 方案适合简单场景,通过 conic-gradient 实现:

js实现环图

<div class="ring" style="--percent:75;--color:#4285F4;"></div>

<style>
.ring {
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: conic-gradient(
    var(--color) 0% calc(var(--percent) * 1%),
    #eee calc(var(--percent) * 1%) 100%
  );
  position: relative;
}
.ring::after {
  content: '';
  position: absolute;
  width: 80%;
  height: 80%;
  background: white;
  border-radius: 50%;
  top: 10%;
  left: 10%;
}
</style>

添加动画效果

为 SVG 环图添加 CSS 动画:

circle[stroke="#4285F4"] {
  animation: ringFill 1.5s ease-out forwards;
}

@keyframes ringFill {
  from { stroke-dashoffset: 502.65; }
  to { stroke-dashoffset: 125.66; } /* 对应 75% */
}

响应式设计技巧

确保环图适应不同屏幕尺寸:

function resizeCanvas() {
  const container = document.querySelector('.chart-container');
  canvas.width = container.clientWidth;
  canvas.height = container.clientWidth; // 保持正方形
  drawRing(); // 重绘
}

window.addEventListener('resize', resizeCanvas);

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现图表

js实现图表

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

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…