How to get color value from gradient by percentage with javascript?

后端 未结 5 1129
离开以前
离开以前 2020-12-08 10:54

I have a fixed width div with gradient applied using css. I want to build slider based color picker based on this gradient.

When i drag the slider i calculate the pe

5条回答
  •  忘掉有多难
    2020-12-08 11:33

    Three color gradient

    Just in case someone wants a 3 color gradient, here's an example using red, yellow and green:

    The github JS code for the colorGradient function is available here.

    function colorGradient(fadeFraction, rgbColor1, rgbColor2, rgbColor3) {
        var color1 = rgbColor1;
        var color2 = rgbColor2;
        var fade = fadeFraction;
    
        // Do we have 3 colors for the gradient? Need to adjust the params.
        if (rgbColor3) {
          fade = fade * 2;
    
          // Find which interval to use and adjust the fade percentage
          if (fade >= 1) {
            fade -= 1;
            color1 = rgbColor2;
            color2 = rgbColor3;
          }
        }
    
        var diffRed = color2.red - color1.red;
        var diffGreen = color2.green - color1.green;
        var diffBlue = color2.blue - color1.blue;
    
        var gradient = {
          red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10),
          green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10),
          blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10),
        };
    
        return 'rgb(' + gradient.red + ',' + gradient.green + ',' + gradient.blue + ')';
    }
    

    Demo:

    // Gradient Function
    function colorGradient(fadeFraction, rgbColor1, rgbColor2, rgbColor3) {
        var color1 = rgbColor1;
        var color2 = rgbColor2;
        var fade = fadeFraction;
    
        // Do we have 3 colors for the gradient? Need to adjust the params.
        if (rgbColor3) {
          fade = fade * 2;
    
          // Find which interval to use and adjust the fade percentage
          if (fade >= 1) {
            fade -= 1;
            color1 = rgbColor2;
            color2 = rgbColor3;
          }
        }
    
        var diffRed = color2.red - color1.red;
        var diffGreen = color2.green - color1.green;
        var diffBlue = color2.blue - color1.blue;
    
        var gradient = {
          red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10),
          green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10),
          blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10),
        };
    
        return 'rgb(' + gradient.red + ',' + gradient.green + ',' + gradient.blue + ')';
    }
      
    // Implementation sample
    var spans = $('.gradient-test');
    var count = spans.length, color;
    var color1 = {
      red: 19, green: 233, blue: 19
    };
    var color2 = {
      red: 255, green: 0, blue: 0
    };
    var color3 = {
      red: 255, green: 255, blue: 0
    };
    $('.gradient-test').each(function(i, span) {
      var g = Math.round(((i+1) * 100) / count);
      if (g < 10){
        g = '0' + g;
      }
      g = +('0.' + g)
      color = colorGradient(g, color1, color2, color3);
      $(span).css('background-color', color);
    });
    .gradient-test {
      width: 1rem;
      height: 1rem;
      display: inline-block;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

提交回复
热议问题