Meine Geige - http://jsbin.com/pitu/1/edit
Ich wollte eine einfache Hex-zu-RGBA-Konvertierung versuchen. Jeder Browser, den ich verwendet habe, rendert Farben standardmäßig mit RGB. Wenn ich also den Farbtastic-Farbwähler verwende, konvertiere ich den Hex-Wert in RGB, indem ich die Hintergrundfarbe greife, die der Hex-Wert generiert (standardmäßig RGB = einfache Konvertierung).
Ich habe versucht, das )
Symbol durch zu ersetzen , 1)
, aber das hat nicht funktioniert, also habe ich mir angesehen, wie die Konvertierung von rgb in rgba funktionieren würde, und ich habe immer noch Probleme.
Die Frage
$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");
Das Ziel
EDIT :
TinyColor ist eine großartige js-Bibliothek zur Farbmanipulation, die alles macht, was ich hier will und mehr. Ich denke, ihr wollt es vielleicht versuchen! - https://github.com/bgrins/TinyColor
quelle
Antworten:
//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) */
quelle
#ff0000aa
?@ ElDoRado1239 hat die richtige Idee, aber es gibt auch einen saubereren Weg:
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);
quelle
#fff
. Das sollte aber leicht zu beheben sein!eslint
ist nur Stildurchsetzung. Es ist nur ein Zufall, dass nichts, was ich geschrieben habe, Ihren Stilvorlieben widerspricht. Tatsächlich würde dies beispielsweise das Projekt, an dem ich gerade arbeite, nicht weitergeben.ES6-Funktion für die Behandlung von Hex mit 6 Zeichen mit oder ohne '#':
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})`; };
Verwendung:
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)
quelle
toString
beiArray
Verknüpfungen mit,
und dierrggbbaa hex
Fakteneingabe sein kann, können Sie sie in const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha ändern } `;${x}${x}
: x, 16)); zurückrgba(${r},${g},${b},${alpha})
; };Saubere TypeScript-Version:
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 `rgb(${r}, ${g}, ${b})`; } }
Basierend auf der Antwort von @ AJFarkas.
quelle
rgb(${r}, ${g}, ${b})
da es kein Alpha hat?Jeder modulare Ansatz in Hex-Form
Die größte Herausforderung besteht darin, dass es ab 2018 einige Formen von HEX gibt. Die traditionelle 6-Zeichen-Form, die 3-Zeichen-Kurzform und eine neue 4- und 8-Zeichen-Form, die Alpha enthält. Die folgende Funktion kann jedes HEX-Formular verarbeiten.
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 kann der Funktion auf folgende Weise bereitgestellt werden:
Ausgabe
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)
quelle
Hier ist eine Funktion, die rgb oder rgba zurückgibt, wenn Sie ein Alpha angeben. Die Funktion konvertiert auch kurze hexadezimale Farbcodes.
Funktion:
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 + ')'; } }
Beispiele:
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)
quelle
ES6 modern, RegEx-frei, Lösung mit Fehlerprüfung und konstanter Pfeilfunktion, die für Fehler null zurückgibt. Wenn kein Alpha angegeben wird, wird der Standardwert Eins verwendet:
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})`; };
Hinweis: Es wird
null
für Fehler zurückgegeben. Sie können durch{return null;}
eine throw-Anweisung ersetzen :{throw "Not a valid hex color!";}
, aber dann sollten Sie sie von innen aufrufentry-catch
:hexToRGB("#3454r5") => null hexToRGB("#345465") => rgba(52, 84, 101, 1) hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)
quelle
Reine JS-Lösung, wenn sie hilft:
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" ist "true" oder "false", je nachdem, ob Sie das Alpha möchten oder nicht.
quelle
else
Schlüsselwort ist in diesem Fall nicht erforderlich. Das Nicht-Alpha wird trotzdem zurückgegeben.#f0a16e
). Ich schlage vor, zuersthex
mit zu konvertierentoUpperCase
.Ich mochte die Antwort von @AJFarkas und fügte die Unterstützung für Shortcut Hex (#fff) hinzu
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));
quelle
Hier ist eine ES2015 + -Version, die etwas defensiver ist und die dreistellige Kurzsyntax verarbeitet.
/* * 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(', ')})`; }
quelle
Und noch eine, die auf Bitverschiebung basiert.
// 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})`; };
quelle
Versuchen
// 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})`
Code-Snippet anzeigen
/// 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>
quelle
Hier ist eine Schnellfunktion, die Farbcodes mit 3, 4, 6 und 8 Zeichen unterstützt:
function hexToRGBA(hex) { // remove invalid characters hex = hex.replace(/[^0-9a-fA-F]/g, ''); if (hex.length < 5) { // 3, 4 characters double-up hex = hex.split('').map(s => s + s).join(''); } // parse pairs of two let rgba = hex.match(/.{1,2}/g).map(s => parseInt(s, 16)); // alpha code between 0 & 1 / default 1 rgba[3] = rgba.length > 3 ? parseFloat(rgba[3] / 255).toFixed(2): 1; return 'rgba(' + rgba.join(', ') + ')'; }
Hier ist was es tut. Es werden alle nicht hexadezimalen Zeichen entfernt. Wenn der HEX kürzer als 5 (3 oder 4) Zeichen ist, wird jedes Zeichen verdoppelt. Anschließend wird der HEX in Paare von zwei Zeichen aufgeteilt und jedes Paar in eine Ganzzahl analysiert. Wenn es ein Alpha-HEX gibt, wird es auf einen Gleitkommawert von 0 bis 1 analysiert, andernfalls wird es standardmäßig auf 1 gesetzt. Die RGBA-Zeichenfolge wird dann durch Verbinden des Arrays gebildet und zurückgegeben.
quelle
Konvertieren Sie HEX mit Alpha (ahex) in 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+')'; }
Probieren Sie es selbst mit Snippet:
Code-Snippet anzeigen
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>
Ursprünglicher Autor
quelle
Hinzufügen zu @ ElDoRado1239
Für diejenigen, die einen Alpha-Wert übergeben möchten (Typoskript-Snippet):
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})`; }
quelle
Das Rad muss nicht erneut implementiert werden:
quelle
Versuche dies
<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>
quelle
hex
undrgba
Funktionen?