Mi violín - http://jsbin.com/pitu/1/edit
Quería probar una conversión fácil de hexadecimal a rgba. Todos los navegadores que he usado renderizan colores usando rgb por defecto, así que cuando uso el selector de color farbtastic, estoy convirtiendo el valor hexadecimal a rgb tomando el color de fondo que genera el valor hexadecimal (como rgb por defecto = conversión simple)
Intenté reemplazar el )
símbolo a , 1)
, pero no funcionó, así que fui a ver cómo funcionaba la conversión de rgb a rgba, y todavía tengo problemas.
El jquery
$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");
La meta
EDITAR :
TinyColor es una gran biblioteca js de manipulación de color que hace todo lo que quiero aquí y más. ¡Creo que ustedes querrán intentarlo! - https://github.com/bgrins/TinyColor
javascript
jquery
colors
Michael Schwartz
fuente
fuente
Respuestas:
//If you write your own code, remember hex color shortcuts (eg., #fff, #000) function hexToRgbA(hex){ var c; if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){ c= hex.substring(1).split(''); if(c.length== 3){ c= [c[0], c[0], c[1], c[1], c[2], c[2]]; } c= '0x'+c.join(''); return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',1)'; } throw new Error('Bad Hex'); } hexToRgbA('#fbafff') /* returned value: (String) rgba(251,175,255,1) */
fuente
#ff0000aa
?@ ElDoRado1239 tiene la idea correcta, pero también hay una forma más limpia:
function hexToRGB(hex, alpha) { var r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16); if (alpha) { return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")"; } else { return "rgb(" + r + ", " + g + ", " + b + ")"; } } hexToRGB('#FF0000', 0.5);
fuente
#fff
. ¡Eso debería ser fácilmente reparable!eslint
es solo aplicación de estilo. Es solo por casualidad que nada de lo que escribí contradice tus preferencias de estilo. De hecho, esto no dejaría de lado el proyecto en el que estoy trabajando actualmente, por ejemplo.Función ES6 para solo manejar hexadecimales de 6 caracteres con o sin el '#':
const hex2rgba = (hex, alpha = 1) => { const [r, g, b] = hex.match(/\w\w/g).map(x => parseInt(x, 16)); return `rgba(${r},${g},${b},${alpha})`; };
Uso:
hex2rgba('#af087b', .5) // returns: rgba(175,8,123,0.5) hex2rgba('af087b', .5) // returns: rgba(175,8,123,0.5) hex2rgba('af087b') // returns: rgba(175,8,123,1)
fuente
toString
on seArray
une con,
y la entrada de hecho puede serrrggbbaa hex
, puede cambiarlo a const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;${x}${x}
x, 16)); volverrgba(${r},${g},${b},${alpha})
; };Versión limpia de TypeScript:
hexToRGB(hex: string, alpha: string) { const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); if (alpha) { return `rgba(${r}, ${g}, ${b}, ${alpha})`; } else { return `rgba(${r}, ${g}, ${b})`; } }
Basado en la respuesta de @ AJFarkas.
fuente
Cualquier enfoque modular de forma hexagonal
El principal desafío es que a partir de 2018 existen algunas formas de HEX. La forma tradicional de 6 caracteres, la forma abreviada de 3 caracteres y una nueva forma de 4 y 8 caracteres que incluye alfa. La siguiente función puede manejar cualquier forma HEX.
const isValidHex = (hex) => /^#([A-Fa-f0-9]{3,4}){1,2}$/.test(hex) const getChunksFromString = (st, chunkSize) => st.match(new RegExp(`.{${chunkSize}}`, "g")) const convertHexUnitTo256 = (hexStr) => parseInt(hexStr.repeat(2 / hexStr.length), 16) const getAlphafloat = (a, alpha) => { if (typeof a !== "undefined") {return a / 255} if ((typeof alpha != "number") || alpha <0 || alpha >1){ return 1 } return alpha } export const hexToRGBA = (hex, alpha) => { if (!isValidHex(hex)) {throw new Error("Invalid HEX")} const chunkSize = Math.floor((hex.length - 1) / 3) const hexArr = getChunksFromString(hex.slice(1), chunkSize) const [r, g, b, a] = hexArr.map(convertHexUnitTo256) return `rgba(${r}, ${g}, ${b}, ${getAlphafloat(a, alpha)})` }
Alpha podría proporcionarse a la función de las siguientes formas:
Salida
const c1 = "#f80" const c2 = "#f808" const c3 = "#0088ff" const c4 = "#0088ff88" const c5 = "#98736" console.log(hexToRGBA(c1)) // rgba(255, 136, 0, 1) console.log(hexToRGBA(c2)) // rgba(255, 136, 0, 0.53125) console.log(hexToRGBA(c3)) // rgba(0, 136, 255, 1) console.log(hexToRGBA(c4)) // rgba(0, 136, 255, 0.53125) console.log(hexToRGBA(c5)) // Uncaught Error: Invalid HEX console.log(hexToRGBA(c1, 0.5)) // rgba(255, 136, 0, 0.5) console.log(hexToRGBA(c3, 0.5)) // rgba(0, 136, 255, 0.5)
fuente
Si desea convertir hexadecimal a rgba, puede usar esta función,
function hex2rgba_convert(hex,opacity){ hex = hex.replace('#',''); r = parseInt(hex.substring(0, hex.length/3), 16); g = parseInt(hex.substring(hex.length/3, 2*hex.length/3), 16); b = parseInt(hex.substring(2*hex.length/3, 3*hex.length/3), 16); result = 'rgba('+r+','+g+','+b+','+opacity/100+')'; return result; }
Aquí hay detalles es hexadecimal a rgba
fuente
Aquí hay una función que devuelve rgb o rgba si proporciona un alfa. La función también convierte códigos de color hexadecimales cortos.
función:
function hexToRgb(hex, alpha) { hex = hex.replace('#', ''); var r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16); var g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16); var b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16); if ( alpha ) { return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')'; } else { return 'rgb(' + r + ', ' + g + ', ' + b + ')'; } }
ejemplos:
hexToRgb('FF0000');// rgb(255, 0, 0) hexToRgb('#FF0000');// rgb(255, 0, 0) hexToRgb('#FF0000', 1);// rgba(255, 0, 0, 1) hexToRgb('F00');// rgb(255, 0, 0) hexToRgb('#F00');// rgb(255, 0, 0) hexToRgb('#F00', 1);// rgba(255, 0, 0, 1)
fuente
ES6 solución moderna, sin RegEx, con verificación de errores y función de flecha constante, que devuelve nulos para errores. Si no se proporciona alfa, se utiliza el valor predeterminado de uno:
const hexToRGB = (hex, alpha = 1) => { let parseString = hex; if (hex.startsWith('#')) {parseString = hex.slice(1, 7);} if (parseString.length !== 6) {return null;} const r = parseInt(parseString.slice(0, 2), 16); const g = parseInt(parseString.slice(2, 4), 16); const b = parseInt(parseString.slice(4, 6), 16); if (isNaN(r) || isNaN(g) || isNaN(b)) {return null;} return `rgba(${r}, ${g}, ${b}, ${alpha})`; };
Nota: Vuelve
null
por errores. Puede reemplazarlo{return null;}
con una instrucción throw:,{throw "Not a valid hex color!";}
pero luego debe llamarlo desde dentrotry-catch
:hexToRGB("#3454r5") => null hexToRGB("#345465") => rgba(52, 84, 101, 1) hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)
fuente
Solución JS pura si ayuda:
function hexToRGB(hex,alphaYes){ var h = "0123456789ABCDEF"; var r = h.indexOf(hex[1])*16+h.indexOf(hex[2]); var g = h.indexOf(hex[3])*16+h.indexOf(hex[4]); var b = h.indexOf(hex[5])*16+h.indexOf(hex[6]); if(alphaYes) return "rgba("+r+", "+g+", "+b+", 1)"; else return "rgb("+r+", "+g+", "+b+")"; }
"alphaYes" es "verdadero" o "falso" dependiendo de si desea el alfa o no.
fuente
else
palabra clave es innecesaria en este caso. Devolverá el no alfa independientemente.#f0a16e
). Sugiero convertirhex
contoUpperCase
primero.Me gustó la respuesta de @AJFarkas y le agrego el soporte para hexadecimal de acceso directo (#fff)
function hexToRGB(hex, alpha) { if (!hex || [4, 7].indexOf(hex.length) === -1) { return; // throw new Error('Bad Hex'); } hex = hex.substr(1); // if shortcuts (#F00) -> set to normal (#FF0000) if (hex.length === 3) { hex = hex.split('').map(function(el){ return el + el + ''; }).join(''); } var r = parseInt(hex.slice(0, 2), 16), g = parseInt(hex.slice(2, 4), 16), b = parseInt(hex.slice(4, 6), 16); if (alpha !== undefined) { return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")"; } else { return "rgb(" + r + ", " + g + ", " + b + ")"; } } document.write(hexToRGB('#FF0000', 0.5)); document.write('<br>'); document.write(hexToRGB('#F00', 0.4));
fuente
Aquí hay una versión de ES2015 + que es un poco más defensiva y maneja la sintaxis taquigráfica de 3 dígitos.
/* * Takes a 3 or 6-digit hex color code, and an optional 0-255 numeric alpha value */ function hexToRGB(hex, alpha) { if (typeof hex !== 'string' || hex[0] !== '#') return null; // or return 'transparent' const stringValues = (hex.length === 4) ? [hex.slice(1, 2), hex.slice(2, 3), hex.slice(3, 4)].map(n => `${n}${n}`) : [hex.slice(1, 3), hex.slice(3, 5), hex.slice(5, 7)]; const intValues = stringValues.map(n => parseInt(n, 16)); return (typeof alpha === 'number') ? `rgba(${intValues.join(', ')}, ${alpha})` : `rgb(${intValues.join(', ')})`; }
fuente
Y otro basado en el cambio de bits.
// hex can be a string in the format of "fc9a04", "0xfc9a04" or "#fc90a4" (uppercase digits are allowed) or the equivalent number // alpha should be 0-1 const hex2rgb = (hex, alpha) => { const c = typeof(hex) === 'string' ? parseInt(hex.replace('#', ''), 16) : hex; return `rgb(${c >> 16}, ${(c & 0xff00) >> 8}, ${c & 0xff}, ${alpha})`; };
fuente
Tratar
// hex - str e.g. "#abcdef"; a - alpha range 0-1; result e.g. "rgba(1,1,1,0)" let hex2rgba= (hex,a)=> `rgb(${hex.substr(1).match(/../g).map(x=>+`0x${x}`)},${a})`
Mostrar fragmento de código
/// hex - str e.g. "#abcdef"; a - alpha range 0-1; result e.g. "rgba(1,1,1,0)" let hex2rgba= (hex,a)=> `rgb(${hex.substr(1).match(/../g).map(x=>+`0x${x}`)},${a})`; function convert() { console.log(hex2rgba(inp.value,1)); }
<input id="inp" value="#abcdef" > <button onclick="convert()">convert</button>
fuente
Convierta HEX con alpha (ahex) en rgba.
function ahex_to_rba(ahex) { //clean # ahex = ahex.substring(1, ahex.length); ahex = ahex.split(''); var r = ahex[0] + ahex[0], g = ahex[1] + ahex[1], b = ahex[2] + ahex[2], a = ahex[3] + ahex[3]; if (ahex.length >= 6) { r = ahex[0] + ahex[1]; g = ahex[2] + ahex[3]; b = ahex[4] + ahex[5]; a = ahex[6] + (ahex[7] ? ahex[7] : ahex[6]); } var int_r = parseInt(r, 16), int_g = parseInt(g, 16), int_b = parseInt(b, 16), int_a = parseInt(a, 16); int_a = int_a / 255; if (int_a < 1 && int_a > 0) int_a = int_a.toFixed(2); if (int_a || int_a === 0) return 'rgba('+int_r+', '+int_g+', '+int_b+', '+int_a+')'; return 'rgb('+int_r+', '+int_g+', '+int_b+')'; }
Pruébelo usted mismo con el fragmento:
Mostrar fragmento de código
function ahex_to_rba(ahex) { //clean # ahex = ahex.substring(1, ahex.length); ahex = ahex.split(''); var r = ahex[0] + ahex[0], g = ahex[1] + ahex[1], b = ahex[2] + ahex[2], a = ahex[3] + ahex[3]; if (ahex.length >= 6) { r = ahex[0] + ahex[1]; g = ahex[2] + ahex[3]; b = ahex[4] + ahex[5]; a = ahex[6] + (ahex[7] ? ahex[7] : ahex[6]); } var int_r = parseInt(r, 16), int_g = parseInt(g, 16), int_b = parseInt(b, 16), int_a = parseInt(a, 16); int_a = int_a / 255; if (int_a < 1 && int_a > 0) int_a = int_a.toFixed(2); if (int_a || int_a === 0) return 'rgba('+int_r+', '+int_g+', '+int_b+', '+int_a+')'; return 'rgb('+int_r+', '+int_g+', '+int_b+')'; } $(function() { $('#go').click(function() { $('p b').text(ahex_to_rba($('#hex').val())); }) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input id="hex" type="text" value="#ffaaffaa"> <input id="go" type="button" value="Go"> <p>Result: <b></b></p>
Autor original
fuente
Añadiendo a @ ElDoRado1239
Para aquellos que quieran pasar el valor alfa (fragmento de texto mecanografiado):
static hexToRGB(hex: string, alpha: number): string { var h = "0123456789ABCDEF"; var r = h.indexOf(hex[1]) * 16 + h.indexOf(hex[2]); var g = h.indexOf(hex[3]) * 16 + h.indexOf(hex[4]); var b = h.indexOf(hex[5]) * 16 + h.indexOf(hex[6]); if (alpha) { return `rgba(${r}, ${g}, ${b}, ${alpha})` } return `rgba(${r}, ${g}, ${b})`; }
fuente
No es necesario volver a implementar la rueda:
fuente
Prueba esto
<div class="torgb" onclick="rgba();" style="background-color:#000; width:20px; height:20px;"></div> <script> function rgba(){ $('.torgb').attr('background-color','rgba(0,0,0,1)'); $('.torgb').attr('onclick','hex();'); } function hex(){ $('.torgb').attr('background-color','#000'); $('.torgb').attr('onclick','rgba();'); } </script>
fuente
hex
yrgba
?