【问题标题】:Javascript color gradientJavascript颜色渐变
【发布时间】:2011-03-06 01:22:35
【问题描述】:

使用带或不带 Jquery 的 javascript,我需要根据开始和结束颜色创建颜色渐变。这可以通过编程方式完成吗?

结束颜色只会比开始颜色更深,并且它用于无序列表,我无法控制 li 项目的数量。我正在寻找一种解决方案,允许我选择开始和结束颜色,将十六进制值转换为 RGB,以便可以在代码中对其进行操作。起始 RGB 值会增加一个基于项目数计算的步长值。

因此,如果列表有 8 个项目,那么它需要分 8 步增加单独的红绿蓝值以实现最终颜色。有没有更好的方法,如果有,我在哪里可以找到一些示例代码?

【问题讨论】:

  • 你描述的是我会做的方式:只需在三个颜色分量中的每一个的起点和终点之间进行线性插值。
  • 请注意,有不同类型的渐变:如果您要制作穿过红色 -> 黄色 -> 绿色 -> 蓝色的渐变,您可能需要获取 HSL 值而不是 RGB 值。

标签: javascript colors gradient rgb


【解决方案1】:

我创建了一个 JS 库,RainbowVis-JS 来解决这个普遍的问题。您只需使用setNumberRange 设置项目数并使用setSpectrum 设置开始和结束颜色。然后你会得到带有colourAt 的十六进制颜色代码。

var numberOfItems = 8;
var rainbow = new Rainbow(); 
rainbow.setNumberRange(1, numberOfItems);
rainbow.setSpectrum('red', 'black');
var s = '';
for (var i = 1; i <= numberOfItems; i++) {
    var hexColour = rainbow.colourAt(i);
    s += '#' + hexColour + ', ';
}
document.write(s); 
// gives:
// #ff0000, #db0000, #b60000, #920000, #6d0000, #490000, #240000, #000000, 

欢迎您查看该库的源代码。 :)

【讨论】:

  • 完美!这正是我一直在寻找的。谢谢
  • 谢谢,很有帮助。将其用于即将在伊朗举行的选举。 ;)
  • 你的图书馆真的很棒!
  • 感谢异常 :) 找到了我搜索的那个。
【解决方案2】:

生成颜色数组的正确函数!

function hex (c) {
  var s = "0123456789abcdef";
  var i = parseInt (c);
  if (i == 0 || isNaN (c))
    return "00";
  i = Math.round (Math.min (Math.max (0, i), 255));
  return s.charAt ((i - i % 16) / 16) + s.charAt (i % 16);
}

/* Convert an RGB triplet to a hex string */
function convertToHex (rgb) {
  return hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
}

/* Remove '#' in color hex string */
function trim (s) { return (s.charAt(0) == '#') ? s.substring(1, 7) : s }

/* Convert a hex string to an RGB triplet */
function convertToRGB (hex) {
  var color = [];
  color[0] = parseInt ((trim(hex)).substring (0, 2), 16);
  color[1] = parseInt ((trim(hex)).substring (2, 4), 16);
  color[2] = parseInt ((trim(hex)).substring (4, 6), 16);
  return color;
}

function generateColor(colorStart,colorEnd,colorCount){

	// The beginning of your gradient
	var start = convertToRGB (colorStart);    

	// The end of your gradient
	var end   = convertToRGB (colorEnd);    

	// The number of colors to compute
	var len = colorCount;

	//Alpha blending amount
	var alpha = 0.0;

	var saida = [];
	
	for (i = 0; i < len; i++) {
		var c = [];
		alpha += (1.0/len);
		
		c[0] = start[0] * alpha + (1 - alpha) * end[0];
		c[1] = start[1] * alpha + (1 - alpha) * end[1];
		c[2] = start[2] * alpha + (1 - alpha) * end[2];

		saida.push(convertToHex (c));
		
	}
	
	return saida;
	
}

// Exemplo de como usar


var tmp = generateColor('#000000','#ff0ff0',10);

for (cor in tmp) {
  $('#result_show').append("<div style='padding:8px;color:#FFF;background-color:#"+tmp[cor]+"'>COLOR "+cor+"° - #"+tmp[cor]+"</div>")
 
}
	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result_show"></div>

【讨论】:

  • 正是我所寻找的。谢谢。
  • 你能用多种颜色做到这一点吗?我试过但无法得到它stackoverflow.com/questions/51659031/…
  • @FussinHussin 是的,我创建了另一个函数,它基本上使用从generateColor 生成的两个数组,其中我传入了开始、中间和结束颜色。然后组合数组及其 3 色渐变。
  • 一些小问题:[GOOD CODE BASE] //要计算的颜色数量 var len = colorCount - 1; // 最后一种颜色 ... //Alpha 混合量 var alpha = 0.0; var saya = []; // 最后一个颜色 saida.push(colorEnd.toUpperCase()); ... saya.reverse();返回赛达;
【解决方案3】:

是的,绝对的。

我在 Java 中执行此操作,在 JavaScript 中也应该相当简单。

首先,您需要将颜色分解为 RGB 分量。

然后计算组件的开始和结束之间的差异。

最后,计算百分比差异并乘以每个组件的起始颜色,然后将其与起始颜色相加。

假设您可以获得 RGB 值,应该这样做:

var diffRed = endColor.red - startColor.red;
var diffGreen = endColor.green - startColor.green;
var diffBlue = endColor.blue - startColor.blue;

diffRed = (diffRed * percentFade) + startColor.red;
diffGreen = (diffGreen * percentFade) + startColor.green;
diffBlue = (diffBlue * percentFade) + startColor.blue;

“percentFade”是一个浮动小数,表示淡入“endColor”的程度。 1 将是完全淡入淡出(从而创建最终颜色)。 0 表示不褪色(起始颜色)。

【讨论】:

  • 第二组分配是一组新颜色
【解决方案4】:

我根据@desau 回答使用这个函数:

 getGradientColor = function(start_color, end_color, percent) {
   // strip the leading # if it's there
   start_color = start_color.replace(/^\s*#|\s*$/g, '');
   end_color = end_color.replace(/^\s*#|\s*$/g, '');

   // convert 3 char codes --> 6, e.g. `E0F` --> `EE00FF`
   if(start_color.length == 3){
     start_color = start_color.replace(/(.)/g, '$1$1');
   }

   if(end_color.length == 3){
     end_color = end_color.replace(/(.)/g, '$1$1');
   }

   // get colors
   var start_red = parseInt(start_color.substr(0, 2), 16),
       start_green = parseInt(start_color.substr(2, 2), 16),
       start_blue = parseInt(start_color.substr(4, 2), 16);

   var end_red = parseInt(end_color.substr(0, 2), 16),
       end_green = parseInt(end_color.substr(2, 2), 16),
       end_blue = parseInt(end_color.substr(4, 2), 16);

   // calculate new color
   var diff_red = end_red - start_red;
   var diff_green = end_green - start_green;
   var diff_blue = end_blue - start_blue;

   diff_red = ( (diff_red * percent) + start_red ).toString(16).split('.')[0];
   diff_green = ( (diff_green * percent) + start_green ).toString(16).split('.')[0];
   diff_blue = ( (diff_blue * percent) + start_blue ).toString(16).split('.')[0];

   // ensure 2 digits by color
   if( diff_red.length == 1 ) diff_red = '0' + diff_red
   if( diff_green.length == 1 ) diff_green = '0' + diff_green
   if( diff_blue.length == 1 ) diff_blue = '0' + diff_blue

   return '#' + diff_red + diff_green + diff_blue;
 };

例子:

getGradientColor('#FF0000', '#00FF00', 0.4);
=> "#996600"

【讨论】:

    【解决方案5】:

    desau's answer 很棒。这是在javascript中:

    function hexToRgb(hex) {
      var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
      return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
      } : null;
    }
    
    function map(value, fromSource, toSource, fromTarget, toTarget) {
      return (value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget;
    }
    
    function getColour(startColour, endColour, min, max, value) {
      var startRGB = hexToRgb(startColour);
      var endRGB = hexToRgb(endColour);
      var percentFade = map(value, min, max, 0, 1);
    
      var diffRed = endRGB.r - startRGB.r;
      var diffGreen = endRGB.g - startRGB.g;
      var diffBlue = endRGB.b - startRGB.b;
    
      diffRed = (diffRed * percentFade) + startRGB.r;
      diffGreen = (diffGreen * percentFade) + startRGB.g;
      diffBlue = (diffBlue * percentFade) + startRGB.b;
    
      var result = "rgb(" + Math.round(diffRed) + ", " + Math.round(diffGreen) + ", " + Math.round(diffBlue) + ")";
      return result;
    }
    
    function changeBackgroundColour() {
      var count = 0;
      window.setInterval(function() {
        count = (count + 1) % 200;
    
        var newColour = getColour("#00FF00", "#FF0000", 0, 200, count);
    
        document.body.style.backgroundColor = newColour;
      }, 20);
    }
    
    changeBackgroundColour();

    【讨论】:

      【解决方案6】:

      有一个可以创建颜色渐变的 JavaScript 库:

      javascript-color-gradient

      import Gradient from "javascript-color-gradient";
      const colorGradient = new Gradient();
      colorGradient.setGradient("#e6062d", "#408247"); // from red to green
      colorGradient.setMidpoint(8); // set to 8 color steps
      colorGradient.getArray(); // get all 8 colors: [ "#d11630", "#bd2534", ... ]
      colorGradient.getColor(1); // #bd2534
      

      【讨论】:

        【解决方案7】:

        xolor library 具有渐变功能。这将创建一个具有 8 种颜色的数组,从起始颜色到结束颜色的渐变:

        var gradientColors = []
        var startColor = "rgb(100,200,50)", endColor = "green"
        var start = xolor(startColor)
        for(var n=0; n<8; n++) {
           gradientColors.push(start.gradient(endColor, n/8))
        }  
        

        在 github 上查看更多信息:https://github.com/fresheneesz/xolor

        【讨论】:

          【解决方案8】:

          基于@drinor 的回答 - TypeScript 支持

          const getGradientColor = (startColor: string, endColor: string, percent: number) => {
              // strip the leading # if it's there
              startColor = startColor.replace(/^\s*#|\s*$/g, '');
              endColor = endColor.replace(/^\s*#|\s*$/g, '');
          
              // convert 3 char codes --> 6, e.g. `E0F` --> `EE00FF`
              if (startColor.length === 3) {
                startColor = startColor.replace(/(.)/g, '$1$1');
              }
          
              if (endColor.length === 3) {
                endColor = endColor.replace(/(.)/g, '$1$1');
              }
          
              // get colors
              const startRed = parseInt(startColor.substr(0, 2), 16),
                startGreen = parseInt(startColor.substr(2, 2), 16),
                startBlue = parseInt(startColor.substr(4, 2), 16);
          
              const endRed = parseInt(endColor.substr(0, 2), 16),
                endGreen = parseInt(endColor.substr(2, 2), 16),
                endBlue = parseInt(endColor.substr(4, 2), 16);
          
              // calculate new color
              let diffRed = endRed - startRed;
              let diffGreen = endGreen - startGreen;
              let diffBlue = endBlue - startBlue;
          
              diffRed = ((diffRed * percent) + startRed);
              diffGreen = ((diffGreen * percent) + startGreen);
              diffBlue = ((diffBlue * percent) + startBlue);
          
              let diffRedStr = diffRed.toString(16).split('.')[0];
              let diffGreenStr = diffGreen.toString(16).split('.')[0];
              let diffBlueStr = diffBlue.toString(16).split('.')[0];
          
              // ensure 2 digits by color
              if (diffRedStr.length === 1) diffRedStr = '0' + diffRedStr;
              if (diffGreenStr.length === 1) diffGreenStr = '0' + diffGreenStr;
              if (diffBlueStr.length === 1) diffBlueStr = '0' + diffBlueStr;
          
              return '#' + diffRedStr + diffGreenStr + diffBlueStr;
          }

          示例:

          getGradientColor('#FF0000', '#00FF00', 0.4);
          

          => "#996600"

          【讨论】:

            【解决方案9】:

            没有那么强大,但在大多数情况下都可以工作,并且您不必为以下代码包含除 jQuery 之外的任何其他库:

            HTML:

            <div id="colors"></div>
            

            JavaScript:

            function rainbow(value, s, l, max, min, start, end) {
                value = ((value - min) * (start - end) / max)+end;
                return 'hsl(' + value + ','+s+'%,'+l+'%)';
            }
            
            function createRainbowDiv(start,end){
                var gradient = $("<div>").css({display:"flex", "flex-direction":"row",height:"100%"});
                for (var i = start; ((i <= end) && (i >= start)) || ((i >= end) && (i <= start)); 
                    i += (end-start) / Math.abs(end-start)){
                        gradient.append($("<div>").css({float:"left","background-color":rainbow(i, 100,50, Math.max(start,end), Math.min(start,end), start,end),flex:1}));
                }
            
                return gradient;
            }
            
            $("#colors").append(createRainbowDiv(0,150));
            $("#colors").css("width","100%").css("height","10px");
            

            这应该会创建一个包含彩虹的 div。见http://jsfiddle.net/rootandy/54rV7/

            【讨论】:

              【解决方案10】:

              我需要为一组未知的动态元素创建足够大的颜色选项数组,但我需要每个元素通过起始颜色和结束颜色递增。这种遵循“百分比淡化”方法,除非我很难遵循这种逻辑。这就是我使用两个 rgb 颜色值的输入并计算页面上的元素数量来处理它的方法。

              这里有一个 link to a codepen 来演示这个概念。

              下面是问题的代码sn-p。

                  <style>
                    #test {
                        width:200px;
                        height:100px;
                        border:solid 1px #000;
                    }
              
                    .test {
                        width:49%;
                        height:100px;
                        border:solid 1px #000;
                        display: inline-block;
                    }
                  </style>
              </head>
              <body>
              
              <div id="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
              <div class="test"></div>
              
                  <script>
              
                    var GColor = function(r,g,b) {
                        r = (typeof r === 'undefined')?0:r;
                        g = (typeof g === 'undefined')?0:g;
                        b = (typeof b === 'undefined')?0:b;
                        return {r:r, g:g, b:b};
                    };
              
              
                    // increases each channel by the difference of the two
                    // divided by 255 (the number of colors stored in the range array)
                    // but only stores a whole number
                    // This should respect any rgb combinations
                    // for start and end colors
              
                    var createColorRange = function(c1) {
                        var colorList = [], tmpColor, rr = 0, gg = 0, bb = 0;
                        for (var i=0; i<255; i++) {
                          tmpColor = new GColor();
                            if (rExp >= 0) {
              
                              tmpColor.r = Math.floor(c1.r - rr);
                              rr += rAdditive;
              
                            } else {
              
                              tmpColor.r = Math.floor(c1.r + rr);
                              rr += rAdditive;
                            }
              
                            if (gExp >= 0) {
              
                              tmpColor.g = Math.floor(c1.g - gg);
                              gg += gAdditive;
              
                            } else {
              
                              tmpColor.g = Math.floor(c1.g + gg);
                              gg += gAdditive;
                            }
              
                            if (bExp >= 0) {
              
                              tmpColor.b = Math.floor(c1.b - bb);
                              bb += bAdditive;
              
                            } else {
              
                              tmpColor.b = Math.floor(c1.b + bb);
                              bb += bAdditive;
              
                            }
              
                            console.log(tmpColor);
              
              
                            colorList.push(tmpColor);
                        }
                        return colorList;
                    };
              
                    /* ==================
                       Testing Code Below
                       ================== */
              
              
                    var firstColor = new GColor(255, 24, 0);
                    var secondColor = new GColor(255, 182, 0);
              
                    // Determine the difference
                    var rExp = firstColor.r - secondColor.r;
              
                    // Divide that difference by length of the array
                    // you would like to create (255 in this case)
                    var rAdditive = Math.abs(rExp)/255;
              
                    var gExp = firstColor.g - secondColor.g;
                    var gAdditive = Math.abs(gExp)/255;
              
                    var bExp = firstColor.b - secondColor.b;
                    var bAdditive = Math.abs(bExp)/255;
              
                    var range = createColorRange(firstColor, secondColor);
                    console.log(range);
                    var pointer = 0;
              
              
                    // This gently cycles through
                    // all the colors on a single element
                    function rotateColors() {
                        var currentColor = range[pointer];
                        document.getElementById("test").style.backgroundColor = "rgb("+currentColor.r+","+currentColor.g+","+currentColor.b+")";
                        pointer++;
                        if (pointer < range.length) window.setTimeout(rotateColors, 5);
                    }
              
                     rotateColors();
              
                    // say I have 5 elements
                    // so I need 5 colors
                    // I already have my first and last colors
                    // but I need to locate the colors between
                    // my start color and my end color
                    // inside of this range
                    // so I divide the range's length by the
                    // number of colors I need
                    // and I store the index values of the middle values
              
                    // those index numbers will then act as my keys to retrieve those values
                    // and apply them to my element
              
                    var myColors = {};
                    var objects = document.querySelectorAll('.test');
                      myColors.num = objects.length;
              
              
                    var determineColors = function(numOfColors, colorArray) {
                      var colors = numOfColors;
              
                      var cRange = colorArray;
                      var distance = Math.floor(cRange.length/colors);
                      var object = document.querySelectorAll('.test');
              
                      var j = 0;
                      for (var i = 0; i < 255; i += distance) {
              
                        if ( (i === (distance*colors)) ) {
                          object[j].style.backgroundColor = "rgb(" + range[255].r + ", " + range[255].g + ", " + range[255].b + ")";
              
                          j = 0;
                          // console.log(range[i]);
                        } else {
              
                              // Apply to color to the element
                               object[j].style.backgroundColor = "rgb(" + range[i].r + ", " + range[i].g + ", " + range[i].b + ")";
              
              
                                // Have each element bleed into the next with a gradient
                             // object[j].style.background = "linear-gradient( 90deg, rgb(" + range[i].r + ", " + range[i].g + ", " + range[i].b + "), rgb(" + range[i+distance].r + ", " + range[i+distance].g + ", " + range[i+distance].b + "))";
              
                          j++;
                        }
              
                      }
                    };
              
              
                    setTimeout( determineColors(myColors.num, range), 2000);
              
                  </script>
              </body>
              

              【讨论】:

                【解决方案11】:

                您可以检索元素列表。我不熟悉 jQuery,但prototypejs 有 Element.childElements() 它将返回一个数组。一旦你知道了数组的长度,你就可以确定每一步要改变多少像素分量。下面的一些代码我还没有以我呈现的形式进行测试,但希望它能给你一个想法。

                function hex (c) {
                  var s = "0123456789abcdef";
                  var i = parseInt (c);
                  if (i == 0 || isNaN (c))
                    return "00";
                  i = Math.round (Math.min (Math.max (0, i), 255));
                  return s.charAt ((i - i % 16) / 16) + s.charAt (i % 16);
                }
                
                /* Convert an RGB triplet to a hex string */
                function convertToHex (rgb) {
                  return hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
                }
                
                /* Remove '#' in color hex string */
                function trim (s) { return (s.charAt(0) == '#') ? s.substring(1, 7) : s }
                
                /* Convert a hex string to an RGB triplet */
                function convertToRGB (hex) {
                  var color[];
                  color[0] = parseInt ((trim(hex)).substring (0, 2), 16);
                  color[1] = parseInt ((trim(hex)).substring (2, 4), 16);
                  color[2] = parseInt ((trim(hex)).substring (4, 6), 16);
                }
                
                
                /* The start of your code. */
                var start = convertToRGB ('#000000');    /* The beginning of your gradient */
                var end   = convertToRGB ('#ffffff');    /* The end of your gradient */
                var arr = $('.gradientList').childElements();
                var len = arr.length();                  /* The number of colors to compute */
                var alpha = 0.5;                         /* Alpha blending amount */
                
                for (i = 0; i < len; i++) {
                    var c = [];
                
                    c[0] = start[0] * alpha + (1 - alpha) * end[0];
                    c[1] = start[1] * alpha + (1 - alpha) * end[1];
                    c[2] = start[2] * alpha + (1 - alpha) * end[2];
                
                    /* Set the background color of this element */
                    arr[i].setStyle ({ 'background-color': convertToHex (c) });
                }
                

                【讨论】:

                • 考虑用简单的&lt;num&gt;.toString(16) 替换您的hex 函数。
                • 这里有多个错误。例如 convertToRGB 实际上并没有返回任何东西 :)
                【解决方案12】:

                基本 Javascript - 背景渐变

                这是一个将元素背景设置为渐变的现成函数

                使用 CSS

                Element.prototype.setGradient = function( from, to, vertical ){
                   this.style.background = 'linear-gradient(to '+(vertical ? 'top' : 'left')+', '+from+', '+to+' 100%)';
                }
                

                和用法:

                document.querySelector('.mydiv').setGradient('red','green');
                

                这是在 chrome 上测试的,我会尝试为其他浏览器更新

                使用画布

                最基本的水平是:

                Element.prototype.setGradient = function( fromColor, toColor ){
                
                    var canvas = document.createElement('canvas');
                    var ctx    = canvas.getContext('2d');
                    var b      = this.getBoundingClientRect();
                    var grd    = ctx.createLinearGradient(0, 0, b.width, 0);
                
                    canvas.width = b.width;
                    canvas.height = b.height;
                
                    grd.addColorStop(0, fromColor);
                    grd.addColorStop(1, toColor);
                
                    ctx.fillStyle = grd;
                    ctx.fillRect(0, 0, b.width, b.height);
                
                    this.style.backgroundImage = 'url('+canvas.toDataURL()+')';
                }
                

                和用法:

                document.querySelector('.mydiv').setGradient('red','green');
                

                小提琴: https://jsfiddle.net/jch39bey/

                -

                添加垂直渐变

                设置垂直的简单标志

                Element.prototype.setGradient = function( fromColor, toColor, vertical ){
                
                    var canvas = document.createElement('canvas');
                    var ctx    = canvas.getContext('2d');
                    var b      = this.getBoundingClientRect();
                    var grd    = ctx.createLinearGradient(0, 0, vertical ? 0 : b.width, vertical ? b.height : 0);
                
                    canvas.width = b.width;
                    canvas.height = b.height;
                
                    grd.addColorStop(0, fromColor);
                    grd.addColorStop(1, toColor);
                
                    ctx.fillStyle = grd;
                    ctx.fillRect(0, 0, b.width, b.height);
                
                    this.style.backgroundImage = 'url('+canvas.toDataURL()+')';
                }
                

                和用法:

                document.querySelector('.mydiv').setGradient('red','green',true);
                

                【讨论】:

                  【解决方案13】:

                  根据@desau 的回答和其他地方的一些代码,这里有一个 jQuery 分步演练:

                  function coloursBetween(fromColour, toColour, numberOfColours){
                  
                      var colours = []; //holds output
                      var fromSplit = getRGBAValues(hexToRGBA(fromColour, 1.0)); //get raw values from hex
                      var toSplit = getRGBAValues(hexToRGBA(toColour, 1.0));
                      
                      var fromRed = fromSplit[0]; //the red value as integer
                      var fromGreen = fromSplit[1];
                      var fromBlue = fromSplit[2];
                      
                      var toRed = toSplit[0];
                      var toGreen = toSplit[1];
                      var toBlue = toSplit[2];
                      
                      var difRed = toRed - fromRed; //difference between the two
                      var difGreen = toGreen - fromGreen;
                      var difBlue = toBlue - fromBlue;
                      
                      var incrementPercentage = 1 / (numberOfColours-1); //how much to increment percentage by
                      
                      for (var n = 0; n < numberOfColours; n++){
                  
                          var percentage = n * incrementPercentage; //calculate percentage 
                          var red = (difRed * percentage + fromRed).toFixed(0); //round em for legibility
                          var green = (difGreen * percentage + fromGreen).toFixed(0);
                          var blue = (difBlue * percentage + fromBlue).toFixed(0);
                          var colour = 'rgba(' + red + ',' + green + ',' + blue + ',1)'; //create string literal
                          colours.push(colour); //push home
                          
                      }
                      
                      return colours;
                  }
                  function getRGBAValues(string) {
                      
                    var cleaned = string.substring(string.indexOf('(') +1, string.length-1);
                    var split = cleaned.split(",");
                    var intValues = [];
                    for(var index in split){
                        intValues.push(parseInt(split[index]));
                    }
                    return intValues;
                  }
                  function hexToRGBA(hex, alpha){
                      var c;
                      if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){
                          c= hex.substring(1).split('');
                          if(c.length== 3){
                              c= [c[0], c[0], c[1], c[1], c[2], c[2]];
                          }
                          c= '0x'+c.join('');
                          return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+','+alpha+')';
                      }
                      return rgba(0,0,0,1);
                      //throw new Error('Bad Hex');
                  }
                  

                  共有三个功能:

                  1. coloursBetween(fromColour, toColour, numberOfColours)
                  2. getRGBAValues(string)
                  3. hexToRGBA(hex, alpha)

                  调用主函数coloursBetween(),传入起始颜色和结束颜色,以及您想要返回的颜色总数。因此,如果您要求返回十种颜色,您将获得第一种颜色 + 8 种渐变颜色 + 最终颜色。

                  coloursBetween 函数首先将传入的十六进制颜色(例如 #FFFFFF、#000000)转换为 rgba(例如 rgba(255,255,255,1) rgba(0,0,0,1)),然后减去红色、绿色和每个的蓝色值。

                  然后计算红色、绿色和蓝色之间的差异。在此示例中,每种情况下的值为 -255。计算一个增量并将其与红色、绿色和蓝色的新增量值相乘。 Alpha 始终假定为 1(完全不透明)。然后将新值添加到颜色数组中,并在 for 循环完成后返回。

                  最后,像这样调用(从红色到蓝色):

                  var gradientColours = coloursBetween("#FF0000", "#0000FF", 5);
                  

                  你可以用它来做这样的事情:

                  【讨论】:

                    【解决方案14】:

                    这是一个可以满足您要求的脚本: https://gist.github.com/av01d/538b3fffc78fdc273894d173a83c563f

                    非常容易使用:

                    let colors;
                    colors = ColorSteps.getColorSteps('#000', 'rgba(255,0,0,0.1)', 10);
                    colors = ColorSteps.getColorSteps('red', 'blue', 5);
                    colors = ColorSteps.getColorSteps('hsl(180, 50%, 50%)', 'rgba(200,100,20,0.5)', 10);
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-04-26
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2022-12-21
                      • 1970-01-01
                      • 2010-11-19
                      相关资源
                      最近更新 更多