Javascript颜色渐变

IT技术 javascript colors gradient rgb
2021-01-20 23:16:10

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

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

因此,如果列表有 8 个项目,则需要分 8 步增加单独的 Red Green Blue 值以获得最终颜色。有没有更好的方法来做到这一点,如果有,我在哪里可以找到一些示例代码?

6个回答

我创建了一个 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, 

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

你的图书馆真的很棒!
2021-03-14 23:16:10
谢谢,很有帮助。将其用于即将举行的伊朗选举。;)
2021-03-22 23:16:10
完美的!这正是我正在寻找的。谢谢
2021-04-02 23:16:10
谢谢 异常 :) 得到了我搜索的确切答案。
2021-04-11 23:16:10

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

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/...
2021-03-22 23:16:10
一些小问题: [GOOD CODE BASE] // 要计算的颜色数量 var len = colorCount - 1; // 最后一种颜色 ... //Alpha 混合量 var alpha = 0.0; var saya = []; // 最后一种颜色 saida.push(colorEnd.toUpperCase()); ... saya.reverse(); 返回赛达;
2021-03-27 23:16:10
正是我所寻找的。谢谢你。
2021-03-31 23:16:10
@FussinHussin 是的,我创建了另一个函数,该函数基本上使用从generateColor我传入开始、中间和结束颜色的位置生成的两个数组然后组合数组及其 3 色渐变。
2021-04-10 23:16:10

是的,一点没错。

我在 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 表示不褪色(起始颜色)。

第二组分配是一组新颜色
2021-03-18 23:16:10

我根据@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"

desau 的回答很棒。这是在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();