You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据投票百分比将进度颜色从黄过渡到红?优化多if判断实现

替代多分支if的投票进度颜色方案

你可以用两种更简洁的方式替代多分支if,既保持原有的区间颜色逻辑,也能实现平滑渐变效果:

一、分段映射(保持原区间逻辑,无冗余判断)

把颜色区间和对应色值做成配置数组,通过查找匹配区间来返回颜色,后期修改区间或颜色只需调整数组,不用动判断逻辑:

function progressColor(progress) {
  // 定义区间与颜色的映射表,和原逻辑完全对应
  const colorMap = [
    { min: 0, max: 24, color: '#FFE169' },
    { min: 25, max: 49, color: '#FFDE59' },
    { min: 50, max: 74, color: '#FF914D' },
    { min: 75, max: 89, color: '#FF7A7A' },
    { min: 90, max: 100, color: '#FF5757' }
  ];
  
  // 找到匹配的区间
  const matched = colorMap.find(item => progress >= item.min && progress <= item.max);
  // 兜底返回默认色(防止进度超出0-100范围)
  return matched ? matched.color : '#FFE169';
}

二、平滑颜色渐变(更自然的视觉过渡)

如果想要颜色随百分比平滑变化,可以通过线性插值计算RGB通道值,实现从浅黄到深红的自然过渡。你可以自定义关键颜色节点,既支持分段渐变也支持全程平滑渐变:

// 辅助函数:计算两个数值间的线性插值
function lerp(start, end, ratio) {
  return start + (end - start) * ratio;
}

// 辅助函数:十六进制转RGB对象
function hexToRgb(hex) {
  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);
  return { r, g, b };
}

// 辅助函数:RGB对象转十六进制
function rgbToHex(r, g, b) {
  return '#' + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
}

function progressColor(progress) {
  // 自定义关键颜色节点,这里用原逻辑的区间节点,也可以改成少数几个节点实现全程平滑渐变
  const keyPoints = [
    { percent: 0, color: '#FFE169' },
    { percent: 24, color: '#FFE169' },
    { percent: 25, color: '#FFDE59' },
    { percent: 49, color: '#FFDE59' },
    { percent: 50, color: '#FF914D' },
    { percent: 74, color: '#FF914D' },
    { percent: 75, color: '#FF7A7A' },
    { percent: 89, color: '#FF7A7A' },
    { percent: 90, color: '#FF5757' },
    { percent: 100, color: '#FF5757' }
  ];

  // 定位当前进度所在的两个关键节点
  let startNode, endNode;
  for (let i = 0; i < keyPoints.length - 1; i++) {
    if (progress >= keyPoints[i].percent && progress <= keyPoints[i+1].percent) {
      startNode = keyPoints[i];
      endNode = keyPoints[i+1];
      break;
    }
  }

  // 兜底返回默认色
  if (!startNode || !endNode) return '#FFE169';

  // 计算当前进度在节点区间内的占比
  const segmentRatio = (progress - startNode.percent) / (endNode.percent - startNode.percent);
  // 转换颜色为RGB并插值计算
  const startRgb = hexToRgb(startNode.color);
  const endRgb = hexToRgb(endNode.color);
  const r = Math.round(lerp(startRgb.r, endRgb.r, segmentRatio));
  const g = Math.round(lerp(startRgb.g, endRgb.g, segmentRatio));
  const b = Math.round(lerp(startRgb.b, endRgb.b, segmentRatio));

  return rgbToHex(r, g, b);
}

如果想要全程平滑渐变,只需要修改keyPoints为几个关键节点即可,比如:

const keyPoints = [
  { percent: 0, color: '#FFE169' },
  { percent: 50, color: '#FF914D' },
  { percent: 100, color: '#FF5757' }
];

jQuery 调用示例

逻辑和原生JS一致,只是用jQuery方法设置样式:

// 更新指定进度条的颜色
function updateProgressBar(progress, selector) {
  const color = progressColor(progress);
  $(selector).css('background-color', color);
}

// 使用示例:给类名为.progress-bar的元素设置60%进度的颜色
updateProgressBar(60, '.progress-bar');

内容的提问来源于stack exchange,提问作者Khaled Al Hariri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:52:48