首先,分離裝飾邏輯(顏色值)和爲不同顏色設置類別並將其設置爲div
是很好的。 我有那樣的任務和使用的每個香奈兒的罪fuctions不同的振幅,週期和移位每個通道:
var ColorPicker = {
colors: {},
init: function(range){
var ra = 190,
rp = 8/3*range,
rs = range*2/3;
var ga = 190,
gp = range,
gs = 0;
var ba = 150,
bp = 8/3*range,
bs = range;
var pipi = 2*Math.PI;
var r, g, b, w;
for (var i = 0; i < range; i++) {
r = ra*Math.cos(i*pipi/rp + rs*pipi/range);
g = ga*Math.cos(i*pipi/gp + gs*pipi/range);
b = ba*Math.cos(i*pipi/bp + bs*pipi/range);
r = Math.round((r > 0) ? r : 0);
g = Math.round((g > 0) ? g : 0);
b = Math.round((b > 0) ? b : 0);
w = Math.round(i/range*255);
this.colors[i] = {red: r, green: g, blue: b, white: w};
};
},
getColorObj: function(grade){
return this.colors[grade];
},
getRGB: function(grade, coef){
var o = this.colors[grade];
if (!coef){
coef = 1;
}
var r = (Math.round(o.red*coef)>255)?255:Math.round(o.red*coef),
g = (Math.round(o.green*coef)>255)?255:Math.round(o.green*coef),
b = (Math.round(o.blue*coef)>255)?255:Math.round(o.blue*coef);
return 'rgb(' + r + ','
+ g + ','
+ b + ')';
},
// get shades of BW
getW: function(grade){
var o = this.colors[grade];
return 'rgb(' + o.white + ','
+ o.white + ','
+ 0.9*o.white + ')';
},
// opposite to BW
getB: function(grade){
var o = this.colors[grade],
b = 255 - o.white;
// console.log(b);
return 'rgb(' + b + ','
+ b + ','
+ .9*b + ')';
},
};
可能需要重寫,雖然它。現在不要認爲它是最佳解決方案。
這個變量和顏色有什麼關係? '0' ='#f00','1000000' ='#0f0'? (或者最高的號碼可能是...) – 2014-10-20 09:40:07
Woops。可以說任何-1000或以下的東西都是#00ff00(綠色),所有+1000或以上的東西都是#ff0000(紅色),0代表#ffff00(黃色)。 – ohyeah 2014-10-20 09:42:31
RGB顏色由3個顏色通道組成:R(0-255),G(0-255),B(0-255)。所以你可以這樣做:'RGB(數量&255,(數量>> 8)&255,(數量>> 16)&255)',你有一個計算0到16581375之間的顏色的函數。你的值,併爲它提供一個函數很容易 – DoXicK 2014-10-20 09:42:34