我试图获取基于值的3种混合颜色的十六进制代码。

例:


开始-#FF0000(红色)。
中-#FFFF00(黄色)。
结束-#008000(绿色)。


如果值为:

1-十六进制代码为#FF0000

50-十六进制代码为#FFFF00

100-十六进制代码为#008000

介于1-50之间的十六进制代码应与红黄色混合。

根据值增加,将50-100十六进制代码与黄绿色混合。

我怎样才能做到这一点?

最佳答案

尝试



function change(e) {
  box.style.background = gradient(e.target.value/100,'#FF0000','#FFFF00','#008000');
}

// t in ragne 0..1, start-middle-end are colors in hex e.g. #FF00FF
function gradient(t,start,middle,end) {
  return t>=0.5 ? linear(middle,end,(t-.5)*2) : linear(start,middle,t*2);
}

function linear(s,e,x) {
  let r = byteLinear(s[1]+s[2], e[1]+e[2], x);
  let g = byteLinear(s[3]+s[4], e[3]+e[4], x);
  let b = byteLinear(s[5]+s[6], e[5]+e[6], x);
  return "#" + r + g + b;
}

// a,b are hex values from 00 to FF; x is real number in range 0..1
function byteLinear(a,b,x) {
  let y = (('0x'+a)*(1-x) + ('0x'+b)*x)|0;
  return y.toString(16).padStart(2,'0') // hex output
}

#box { width: 50px; height: 50px; background: #FF0000 }

<input type="range" min="0" max="100" oninput="change(event)" value="0">
<div id="box"></div>

09-08 06:51