P: ¿Como obtengo los colores intermedios de 2 dados en n pasos?
R: ¿Aplicando la función transitar que se describe abajo, con los 2 colores y n como parámetros?
Código:
function decahex(n) {
return hexa.charAt(n / 16) + hexa.charAt(n % 16);
}
function colorHexa(c) {
return "#" + decahex(c[0]) + decahex(c[1]) + decahex(c[2]);
}
function transitar(ini, fin, pasos) {
var dato = desglose(ini);
var rIni = dato[0];
var gIni = dato[1];
var bIni = dato[2];
var intermedios = new Array(pasos);
intermedios[0] = dato;
var dato = desglose(fin);
intermedios[pasos - 1] = dato;
var rFin = dato[0];
var gFin = dato[1];
var bFin = dato[2];
var rMed = (rFin - rIni) / (pasos - 1);
var gMed = (gFin - gIni) / (pasos - 1);
var bMed = (bFin - bIni) / (pasos - 1);
for (var i = 1; i < pasos - 1; i ++) {
var rgb = new Array(3);
rgb[0] = parseInt(rIni + (rMed * i));
rgb[1] = parseInt(gIni + (gMed * i));
rgb[2] = parseInt(bIni + (bMed * i));
intermedios[i] = rgb;
}
for (i = 0; i < intermedios.length; i ++)
intermedios[i] = colorHexa(intermedios[i]);
return intermedios;
}
function desglose(color) {
if (color.length != 6)
return "poblema";
else {
devolver = new Array(3);
devolver[0] = hexadec(color.substr(0, 2));
devolver[1] = hexadec(color.substr(2, 2));
devolver[2] = hexadec(color.substr(4, 2));
}
return devolver;
}
var hexa = "0123456789abcdef";
function hexadec(x) {
x = x.toLowerCase();
return parseInt(hexa.indexOf(x.charAt(0))) * 16 + parseInt(hexa.indexOf(x.charAt(1)))
}
Notas:
Los colores deben escribirse en hexadecimal (String) y sin el carácter #.
La función transitar devuelve un array de colores hexadecimales aplicables directamente a los atributos color de los tags que lo soporten (p.e. font) y a los estilos color, background-color y border-color.
Ejemplo de utilización:
var colores = transitar("000000", "ffffff", 3);
Devuelve el siguiente array: ["#000000", "#7f7f7f", "#ffffff"];
Aplicaciones: crear fondos degradados como el ejemplo que hay en estas mismas FAQs