from green to red color depend on percentage

前端 未结 14 1987
北恋
北恋 2020-11-30 20:00

I have a poll system and I want answers for this poll to be colored. For example: If it\'s 10% it would be red, if 40% it would be yellow and if 80% it would be green, so I

相关标签:
14条回答
  • 2020-11-30 20:48

    Based on Jacobs answer I made a loadbar. This one is from green to red, but you can change the colors. For those interested here's my code and the jsfiddle ( http://jsfiddle.net/rxR3x/ )

    var percentColors = [
        { pct: 0, color: '#00FF00' },   { pct: 3, color: '#12FF00' },   { pct: 6, color: '#24FF00' },
        { pct: 10, color: '#47FF00' },  { pct: 13, color: '#58FF00' },  { pct: 16, color: '#6AFF00' },
        { pct: 20, color: '#7CFF00' },  { pct: 23, color: '#8DFF00' },  { pct: 26, color: '#9FFF00' },
        { pct: 30, color: '#B0FF00' },  { pct: 33, color: '#C2FF00' },  { pct: 36, color: '#D4FF00' },
        { pct: 40, color: '#E5FF00' },  { pct: 43, color: '#F7FF00' },  { pct: 46, color: '#FFF600' },
        { pct: 50, color: '#FFE400' },  { pct: 53, color: '#FFD300' },  { pct: 56, color: '#FFC100' },
        { pct: 60, color: '#FFAF00' },  { pct: 63, color: '#FF9E00' },  { pct: 66, color: '#FF8C00' },
        { pct: 70, color: '#FF7B00' },  { pct: 73, color: '#FF6900' },  { pct: 76, color: '#FF5700' },
        { pct: 80, color: '#FF4600' },  { pct: 83, color: '#FF3400' },  { pct: 86, color: '#FF2300' },
        { pct: 90, color: '#FF1100' },  { pct: 93, color: '#FF0000' },  { pct: 96, color: '#FF0000' },
        { pct: 100, color: '#FF0000' }
    ];
    var getColorPercent = function(selector, percent, time){
        var i = 0;
        var percentInterval = setInterval(function() {
             i++;
             if(percent >= percentColors[i].pct) {
                console.log(percentColors[i].color);
                $(selector).css('background-color', percentColors[i].color);
            }
            if(percentColors[i].pct>=percent) {
                clearInterval(percentInterval);
            }
        }, time/25);
        $(selector).animate({width:(200/100)*percent}, time);
    }
    getColorPercent('#loadbar_storage', 100, 1500);
    

    var percentColors = [
        { pct: 0, color: '#00FF00' },	{ pct: 3, color: '#12FF00' },	{ pct: 6, color: '#24FF00' },
        { pct: 10, color: '#47FF00' },	{ pct: 13, color: '#58FF00' },	{ pct: 16, color: '#6AFF00' },
        { pct: 20, color: '#7CFF00' },	{ pct: 23, color: '#8DFF00' },	{ pct: 26, color: '#9FFF00' },
        { pct: 30, color: '#B0FF00' },	{ pct: 33, color: '#C2FF00' },	{ pct: 36, color: '#D4FF00' },
        { pct: 40, color: '#E5FF00' },	{ pct: 43, color: '#F7FF00' },	{ pct: 46, color: '#FFF600' },
        { pct: 50, color: '#FFE400' },	{ pct: 53, color: '#FFD300' },	{ pct: 56, color: '#FFC100' },
        { pct: 60, color: '#FFAF00' },	{ pct: 63, color: '#FF9E00' },	{ pct: 66, color: '#FF8C00' },
        { pct: 70, color: '#FF7B00' },	{ pct: 73, color: '#FF6900' },	{ pct: 76, color: '#FF5700' },
        { pct: 80, color: '#FF4600' },	{ pct: 83, color: '#FF3400' },	{ pct: 86, color: '#FF2300' },
        { pct: 90, color: '#FF1100' },	{ pct: 93, color: '#FF0000' },	{ pct: 96, color: '#FF0000' },
        { pct: 100, color: '#FF0000' }
    ];
    var getColorPercent = function(selector, percent, time) {
      var i = 0;
      var percentInterval = setInterval(function() {
        i++;
        if (percent >= percentColors[i].pct) {
          $(selector).css('background-color', percentColors[i].color);
        }
        if (percentColors[i].pct >= percent) {
          clearInterval(percentInterval);
        }
      }, time / 25);
      $(selector).animate({
        width: (200 / 100) * percent
      }, time);
    }
    getColorPercent('#loadbar', 100, 1500);
    #loadbar_wrapper {
      width: 200px;
      height: 25px;
      border: 1px solid #CECECE;
    }
    
    #loadbar {
      width: 0px;
      height: 25px;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="loadbar_wrapper">
      <div id="loadbar"></div>
    </div>

    0 讨论(0)
  • 2020-11-30 20:48

    I've modified zmc's answer to give a gradient from green (0%) to red(100%).

    const getGreenToRed = (percent) => {
        const r = 255 * percent/100;
        const g = 255 - (255 * percent/100);
        return 'rgb('+r+','+g+',0)';
    }
    
    0 讨论(0)
  • 2020-11-30 20:49

    This may be more than you need, but this lets you set up any arbitrary color map:

    var percentColors = [
        { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },
        { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } },
        { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } } ];
    
    var getColorForPercentage = function(pct) {
        for (var i = 1; i < percentColors.length - 1; i++) {
            if (pct < percentColors[i].pct) {
                break;
            }
        }
        var lower = percentColors[i - 1];
        var upper = percentColors[i];
        var range = upper.pct - lower.pct;
        var rangePct = (pct - lower.pct) / range;
        var pctLower = 1 - rangePct;
        var pctUpper = rangePct;
        var color = {
            r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),
            g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),
            b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper)
        };
        return 'rgb(' + [color.r, color.g, color.b].join(',') + ')';
        // or output as hex if preferred
    };
    
    0 讨论(0)
  • 2020-11-30 20:52

    This is what I came up with:

    function rgbify(maxval, minval, val, moreisgood) {
        var intnsty = (val - minval) / (maxval - minval);
        var r, g;
        if (moreisgood) {
            if (intnsty > 0.5) {
                g = 255;
                r = Math.round(2 * (1 - intnsty) * 255);
            } else {
                r = 255;
                g = Math.round(2 * intnsty * 255);
            }
    
        } else { //lessisgood
            if (intnsty > 0.5) {
                r = 255;
                g = Math.round(2 * (1 - intnsty) * 255);
            } else {
                g = 255;
                r = Math.round(2 * intnsty * 255);
            }
        }
        return "rgb(" + r.toString() + ", " + g.toString() + ", 0)";
    }
    

    jsfiddle

    The moreisgood flag toggles if higher values should be red or green. maxval and minval are the threshold values for your range. val is the value to be converted to rgb

    0 讨论(0)
  • 2020-11-30 20:52

    Changing from red to green color using HLS. The value should be from 0 to 100, in this case simulating percentage (%).

    function getColorFromRedToGreenByPercentage(value) {
        const hue = Math.round(value);
        return ["hsl(", hue, ", 50%, 50%)"].join("");
    }
    
    0 讨论(0)
  • 2020-11-30 20:55

    Modify these two lines in Jacob's code:

    var lower = percentColors[i - 1];
    var upper = percentColors[i];
    

    to:

    var lower = (i === 0) ?  percentColors[i] : percentColors[i - 1];
    var upper = (i === 0) ? percentColors[i + 1] : percentColors[i];
    

    if you want to make it work for the two extremes (i.e. 0.0 and 1.0).

    0 讨论(0)
提交回复
热议问题