Есть ли быстрый способ сделать это?
Например, начальный цвет #EEEEEE и конечный цвет #FFFFFF дадут что-то вроде #FEFFEE.
Есть ли быстрый способ сделать это?
Например, начальный цвет #EEEEEE и конечный цвет #FFFFFF дадут что-то вроде #FEFFEE.
Конечно, шестнадцатеричный кодируется как число, но для того, чтобы он имел какой-либо смысл, вы должны сначала извлечь компоненты rgb:
function rgb(string){
return string.match(/\w\w/g).map(function(b){ return parseInt(b,16) })
}
var rgb1 = rgb("#EEEEEE");
var rgb2 = rgb("#FFFFFF");
Затем просто возьмите промежуточное звено всех компонентов:
var rgb3 = [];
for (var i=0; i<3; i++) rgb3[i] = rgb1[i]+Math.random()*(rgb2[i]-rgb1[i])|0;
И, наконец, перестройте цвет как стандартную шестнадцатеричную строку:
var newColor = '#' + rgb3
.map(function(n){ return n.toString(16) })
.map(function(s){ return "00".slice(s.length)+s}).join('');
Обратите внимание, что для получения лучших результатов, в зависимости от вашей цели, например, если вы хотите сохранить яркость, используйте другой цветовое пространство, чем RGB (скажем, HSL или HSV), может оказаться полезным.
d3 делает это очень хорошо, создавая цветовые шкалы:
var color = d3.scale.linear()
.domain([-1, 0, 1])
.range(["red", "white", "green"]);
color(-1) // "#ff0000" red
color(-0.5) // "#ff8080" pinkish
color(0) // "#ffffff" white
color(0.5) // "#80c080" getting greener
color(0.7) // "#4da64d" almost there..
color(1) // "#008000" totally green!
Если я правильно понимаю вопрос, вы хотите, чтобы каждая цифра находилась в одном диапазоне. Вы имеете в виду каждую цифру или каждый компонент (цветовой канал). Для каждой цифры см. моя скрипка
Ключ:
for(var i = 0;i < 6; i++) {
color += (Math.floor(Math.random() * (end-start+1)) + start).toString(16);
}
с началом и концом от 0 до 15
или каждый канал:
for(var i = 0;i < 3; i++) {
color += (Math.floor(Math.random() * (end-start+1)) + start).toString(16);
}
с началом и концом от 0 до 255
Пытаться:
function getRandomColor(start, end){
var min=parseInt(start.replace("#",""), 16);
var max=parseInt(end.replace("#",""), 16);
return "#"+Math.floor((Math.random() * (max - min) + min)).toString(16).toUpperCase();
}
Вот скрипка, с которой можно поиграть.