Moje skrzypce - http://jsbin.com/pitu/1/edit
Chciałem wypróbować łatwą konwersję hex na rgba. Kiedykolwiek przeglądarka, której używałem, renderuje kolory przy użyciu rgb jako domyślnego, więc kiedy używam próbnika kolorów farbtastic, konwertuję wartość szesnastkową na rgb, chwytając kolor tła generowany przez wartość szesnastkową (domyślnie rgb = prosta konwersja)
Próbowałem zamienić )
symbol na , 1)
, ale to nie zadziałało, więc poszedłem zobaczyć, jak będzie działać konwersja rgb na rgba, i nadal mam problemy.
Plik jQuery
$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");
Cel
EDYCJA :
TinyColor to świetna biblioteka js do manipulacji kolorami, która robi wszystko, czego chcę, i nie tylko. Myślę, że możecie spróbować! - https://github.com/bgrins/TinyColor
javascript
jquery
colors
Michael Schwartz
źródło
źródło
Odpowiedzi:
//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) */
źródło
#ff0000aa
?@ ElDoRado1239 ma dobry pomysł, ale jest też czystszy sposób:
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);
źródło
#fff
. Jednak powinno to być łatwe do naprawienia!eslint
to tylko egzekwowanie stylu. To tylko przypadek, że nic, co napisałem, nie jest sprzeczne z Twoimi preferencjami dotyczącymi stylu. W rzeczywistości nie przejdzie to na przykład na projekt, nad którym obecnie pracuję.Funkcja ES6 do obsługi tylko 6 znaków szesnastkowych z lub bez znaku „#”:
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})`; };
Stosowanie:
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)
źródło
toString
przyArray
sprzężeniach z,
i wprowadzaniu faktówrrggbbaa hex
można zmienić to na const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;${x}${x}
x, 16)); powrótrgba(${r},${g},${b},${alpha})
; };Czysta wersja 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})`; } }
Na podstawie odpowiedzi @ AJFarkas.
źródło
Dowolne podejście modułowe Hex Form
Głównym wyzwaniem jest to, że od 2018 roku istnieje kilka form HEX. Forma tradycyjna z 6 znakami, forma skrócona z 3 znakami oraz nowa forma z 4 i 8 znakami zawierająca alfę. Następująca funkcja może obsługiwać dowolną postać 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)})` }
Alfę można dostarczyć do funkcji w następujący sposób:
Wynik
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)
źródło
Jeśli chcesz przekonwertować hex na rgba, możesz użyć tej funkcji,
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; }
Oto szczegóły w postaci szesnastkowej do rgba
źródło
Oto funkcja, która zwraca rgb lub rgba, jeśli podasz alfa. Funkcja konwertuje również krótkie szesnastkowe kody kolorów.
funkcjonować:
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 + ')'; } }
przykłady:
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)
źródło
ES6 nowoczesne, wolne od RegEx rozwiązanie ze sprawdzaniem błędów i stałą funkcją strzałki, która zwraca wartość null dla błędów. Jeśli alfa nie jest podana, używana jest domyślna wartość jeden:
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})`; };
Uwaga: zwraca
null
po błędach. Możesz zamienić{return null;}
na instrukcję throw:{throw "Not a valid hex color!";}
ale wtedy powinieneś wywołać ją od wewnątrztry-catch
:hexToRGB("#3454r5") => null hexToRGB("#345465") => rgba(52, 84, 101, 1) hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)
źródło
Czyste rozwiązanie JS, jeśli pomaga:
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” jest „true” lub „false” w zależności od tego, czy chcesz, czy nie chcesz, alfa.
źródło
else
tym przypadku słowo kluczowe jest niepotrzebne. Niezależnie od tego zwróci wartość inną niż alfa.#f0a16e
). Proponuję, aby przekształcićhex
siętoUpperCase
w pierwszej kolejności.Podobała mi się odpowiedź @AJFarkas i dodałem do niej obsługę skrótu szesnastkowego (#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));
źródło
Oto wersja ES2015 +, która jest nieco bardziej defensywna i obsługuje skróconą 3-cyfrową składnię.
/* * 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(', ')})`; }
źródło
I kolejny oparty na przesunięciu bitów.
// 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})`; };
źródło
Próbować
// 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})`
Pokaż fragment kodu
/// 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>
źródło
Konwertuj HEX z alfą (ahex) na 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+')'; }
Wypróbuj sam z fragmentem:
Pokaż fragment kodu
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>
Oryginalny autor
źródło
Dodawanie do @ ElDoRado1239
Dla tych, którzy chcą przekazać wartość alfa (fragment maszynopisu):
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})`; }
źródło
Nie ma potrzeby ponownego zakładania koła:
źródło
Spróbuj tego
<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>
źródło
hex
irgba
?