Erstellen Sie eine hexadezimale Farbe basierend auf einem String mit JavaScript
Lesezeit: 8 Minuten
Darragh Enright
Ich möchte eine Funktion erstellen, die jede alte Zeichenfolge akzeptiert (normalerweise ein einzelnes Wort) und daraus irgendwie generiert einen Hexadezimalwert zwischen #000000 und #FFFFFFsodass ich es als Farbe für ein HTML-Element verwenden kann.
Vielleicht sogar ein abgekürzter Hex-Wert (z. B.: #FFF) wenn das weniger kompliziert ist. Tatsächlich wäre eine Farbe aus einer „websicheren“ Palette ideal.
Könnten Sie einige Beispieleingaben und / oder Links zu ähnlichen Fragen geben?
– qw3n
6. August 2010 um 17:59 Uhr
Keine Antwort, aber vielleicht finden Sie Folgendes hilfreich: Um eine Hexadezimalzahl in eine ganze Zahl umzuwandeln, verwenden Sie parseInt(hexstr, 10). Um eine Ganzzahl in eine Hexadezimalzahl umzuwandeln, verwenden Sie n.toString(16)wobei n eine ganze Zahl ist.
– Cristian Sánchez
6. August 2010 um 18:00 Uhr
@qw3n – Beispieleingabe: nur kurze, einfache alte Textzeichenfolgen … wie ‘Medizin’, ‘Chirurgie’, ‘Neurologie’, ‘Allgemeinmedizin’ usw. Zwischen 3 und sagen wir 20 Zeichen … kann nicht gefunden werden die andere, aber hier ist die Java-Frage: stackoverflow.com/questions/2464745/… @Daniel – Danke. Ich muss mich hinsetzen und es noch einmal ernsthaft versuchen. könnte nützlich sein.
– Darragh Enright
6. August 2010 um 18:42 Uhr
Joe Freemann
Hier ist eine Adaption der Antwort von CD Sanchez, die durchgehend einen 6-stelligen Farbcode zurückgibt:
var stringToColour = function(str) {
var hash = 0;
for (var i = 0; i < str.length; i++) {
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
var colour="#";
for (var i = 0; i < 3; i++) {
var value = (hash >> (i * 8)) & 0xFF;
colour += ('00' + value.toString(16)).substr(-2);
}
return colour;
}
(Eine alternative/einfachere Lösung könnte darin bestehen, einen Farbcode im rgb(…)-Stil zurückzugeben.)
Dieser Code funktioniert hervorragend in Verbindung mit automatisch generierten NoSQL-IDs, Ihre Farbe wird jedes Mal für denselben Benutzer gleich sein.
– Deviavir
26. Juni 2014 um 20:57 Uhr
Ich brauchte den Alphakanal auch für die Transparenz in meinen Hex-Codes. Dies hat geholfen (Hinzufügen von zwei Ziffern für den Alphakanal am Ende meines Hex-Codes): gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
– Husterknupp
28. Oktober 2018 um 20:10 Uhr
@Tjorriemorrie Upvoted für den Hinweis, dass es sich um Farbe und nicht um Farbe handelt. Ja, ja, es ist nicht wirklich ein Thema, aber es ist etwas, das mir wichtig ist (als ich es ursprünglich geschrieben habe, habe ich es beide Male „Farbe“ geschrieben!). Vielen Dank.
– Pryftan
13. März 2019 um 16:43 Uhr
Interessant, dass die Farbe für die gleiche Zeichenfolge auf verschiedenen Browsern/Betriebssystemen unterschiedlich ist – zB Chrome+Windows und Chrome+Android – meine E-Mail=>Farbe ist auf dem einen blau und auf dem anderen grün. Irgendeine Idee warum?
– Avenmore
11. August 2019 um 18:51 Uhr
Vielen Dank! eine Anpassung daran, um pastellfarbene / leuchtende Farben aus einer Zeichenfolge zu generieren, nur stackoverflow.com/a/64490863/403372
– Joviano Dias
22. Oktober 2020 um 21:37 Uhr
Cristian Sánchez
Portieren Sie einfach den Java-Hex-Farbcode von Compute für eine beliebige Zeichenfolge nach Javascript:
function hashCode(str) { // java String#hashCode
var hash = 0;
for (var i = 0; i < str.length; i++) {
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
return hash;
}
function intToRGB(i){
var c = (i & 0x00FFFFFF)
.toString(16)
.toUpperCase();
return "00000".substring(0, 6 - c.length) + c;
}
Zum Konvertieren würden Sie Folgendes tun:
intToRGB(hashCode(your_string))
Es muss die Hex-Strings auffüllen, wie zum Beispiel: ("00" + ((this >> 24) & 0xFF).toString(16)).slice(-2) + ("00" + ((this >> 16) & 0xFF).toString(16)).slice(-2) + ("00" + ((this >> 8) & 0xFF).toString(16)).slice(-2) + ("00" + (this & 0xFF).toString(16)).slice(-2);
– Thymin
6. Februar 2014 um 22:38 Uhr
Ich konvertiere eine Reihe von Musikgenre-Tags in Hintergrundfarben und das hat mir viel Zeit gespart.
– Kyle Penell
25. Februar 2016 um 5:18 Uhr
Ich wünschte, ich könnte das in PHP umwandeln.
– Nimit E.
11. Juni 2016 um 10:17 Uhr
Ich habe einige Probleme mit fast gleichen Farben für ähnliche Saiten, zum Beispiel: intToRGB(hashCode('hello1')) -> "3A019F"intToRGB(hashCode('hello2')) -> "3A01A0" Und ich erweitere Ihren Code, indem ich eine Multiplikation für den endgültigen Hashwert hinzufüge: return 100 * hash;
– SirWojtek
24. August 2017 um 1:43 Uhr
Vergessen Sie nicht, ‘#’ hinzuzufügen, wie return “#” + “00000”.substring(0, 6 – c.length) + c;
– Cédric Arnould
21. März 2019 um 19:51 Uhr
Thymin
Ich wollte einen ähnlichen Farbreichtum für HTML-Elemente, ich war überrascht, dass CSS jetzt hsl()-Farben unterstützt, also ist eine vollständige Lösung für mich unten:
Siehe auch Wie generiert man automatisch N “unterschiedliche” Farben? für weitere Alternativen, die dieser ähnlicher sind.
Bearbeiten: Aktualisierung basierend auf @zeis Version (mit amerikanischer Schreibweise)
var stringToColor = (string, saturation = 100, lightness = 75) => {
let hash = 0;
for (let i = 0; i < string.length; i++) {
hash = string.charCodeAt(i) + ((hash << 5) - hash);
hash = hash & hash;
}
return `hsl(${(hash % 360)}, ${saturation}%, ${lightness}%)`;
}
// For the sample on stackoverflow
function colorByHashCode(value) {
return "<span style="color:" + stringToColor(value) + "">" + value + "</span>";
}
document.body.innerHTML = [
"javascript",
"is",
"nice",
].map(colorByHashCode).join("<br/>");
span {
font-size: 50px;
font-weight: 800;
}
In HSL ist es Farbton, Sättigung, Helligkeit. Der Farbton zwischen 0-359 erhält also alle Farben, Sättigung ist, wie satt die Farbe sein soll, 100% funktioniert für mich. Und Helligkeit bestimmt die Tiefe, 50 % sind normal, 25 % sind dunkle Farben, 75 % sind Pastellfarben. Ich habe 30%, weil es am besten zu meinem Farbschema passt.
Eine sehr vielseitige Lösung.
– Mastababa
18. Mai 2015 um 15:02 Uhr
Danke für das Teilen einer Lösung, bei der Sie entscheiden können, wie bunt die Farben sein sollen!
– Florian Bauer
28. Mai 2016 um 12:22 Uhr
@haykam Danke, dass du daraus ein Snippet gemacht hast!
– Thymin
15. Oktober 2018 um 17:59 Uhr
Dieser Ansatz ist wirklich nützlich, um meiner App die gewünschte Lebendigkeit/Feinheit zu verleihen, die sie benötigt. Ein zufälliges Hex variiert viel zu stark in Sättigung und Helligkeit, um in den meisten Situationen nützlich zu sein. Danke dafür!
– simey.me
18. März 2019 um 7:42 Uhr
Diese Lösung gibt zu wenig Farben zurück, geht nicht.
– Catamphetamin
20. März 2019 um 15:46 Uhr
Islam
Hier ist meine 2021-Version mit Reduce-Funktion und HSL-Farbe.
Verwendung der hashCode wie in der Antwort von Cristian Sanchez mit hsl und modernem Javascript können Sie einen Farbwähler mit gutem Kontrast wie folgt erstellen:
function hashCode(str) {
let hash = 0;
for (var i = 0; i < str.length; i++) {
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
return hash;
}
function pickColor(str) {
return `hsl(${hashCode(str) % 360}, 100%, 80%)`;
}
one.style.backgroundColor = pickColor(one.innerText)
two.style.backgroundColor = pickColor(two.innerText)
div {
padding: 10px;
}
<div id="one">One</div>
<div id="two">Two</div>
Da es hsl ist, können Sie die Luminanz skalieren, um den gewünschten Kontrast zu erhalten.
function hashCode(str) {
let hash = 0;
for (var i = 0; i < str.length; i++) {
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
return hash;
}
function pickColor(str) {
// Note the last value here is now 50% instead of 80%
return `hsl(${hashCode(str) % 360}, 100%, 50%)`;
}
one.style.backgroundColor = pickColor(one.innerText)
two.style.backgroundColor = pickColor(two.innerText)
div {
color: white;
padding: 10px;
}
<div id="one">One</div>
<div id="two">Two</div>
Gemeinschaft
Ich finde, dass das Generieren zufälliger Farben dazu neigt, Farben zu erzeugen, die für meinen Geschmack nicht genug Kontrast haben. Der einfachste Weg, das zu umgehen, besteht darin, eine Liste mit sehr unterschiedlichen Farben vorab auszufüllen. Für jeden Neu string, weisen Sie die nächste Farbe in der Liste zu:
// Takes any string and converts it into a #RRGGBB color.
var StringToColor = (function(){
var instance = null;
return {
next: function stringToColor(str) {
if(instance === null) {
instance = {};
instance.stringToColorHash = {};
instance.nextVeryDifferntColorIdx = 0;
instance.veryDifferentColors = ["#000000","#00FF00","#0000FF","#FF0000","#01FFFE","#FFA6FE","#FFDB66","#006401","#010067","#95003A","#007DB5","#FF00F6","#FFEEE8","#774D00","#90FB92","#0076FF","#D5FF00","#FF937E","#6A826C","#FF029D","#FE8900","#7A4782","#7E2DD2","#85A900","#FF0056","#A42400","#00AE7E","#683D3B","#BDC6FF","#263400","#BDD393","#00B917","#9E008E","#001544","#C28C9F","#FF74A3","#01D0FF","#004754","#E56FFE","#788231","#0E4CA1","#91D0CB","#BE9970","#968AE8","#BB8800","#43002C","#DEFF74","#00FFC6","#FFE502","#620E00","#008F9C","#98FF52","#7544B1","#B500FF","#00FF78","#FF6E41","#005F39","#6B6882","#5FAD4E","#A75740","#A5FFD2","#FFB167","#009BFF","#E85EBE"];
}
if(!instance.stringToColorHash[str])
instance.stringToColorHash[str] = instance.veryDifferentColors[instance.nextVeryDifferntColorIdx++];
return instance.stringToColorHash[str];
}
}
})();
// Get a new color for each string
StringToColor.next("get first color");
StringToColor.next("get second color");
// Will return the same color as the first time
StringToColor.next("get first color");
Obwohl dies auf nur 64 Farben begrenzt ist, finde ich, dass die meisten Menschen danach ohnehin keinen wirklichen Unterschied mehr erkennen können. Ich nehme an, Sie könnten immer mehr Farben hinzufügen.
Während dieser Code fest codierte Farben verwendet, wissen Sie während der Entwicklung zumindest garantiert genau, wie viel Kontrast Sie zwischen den Farben in der Produktion sehen werden.
Die Farbliste wurde aus dieser SO-Antwort entfernt, es gibt andere Listen mit mehr Farben.
Nathan
Wenn Ihre Eingaben für einen einfachen Hash nicht unterschiedlich genug sind, um das gesamte Farbspektrum zu verwenden, können Sie anstelle einer Hash-Funktion einen Seed-Zufallszahlengenerator verwenden.
Könnten Sie einige Beispieleingaben und / oder Links zu ähnlichen Fragen geben?
– qw3n
6. August 2010 um 17:59 Uhr
Keine Antwort, aber vielleicht finden Sie Folgendes hilfreich: Um eine Hexadezimalzahl in eine ganze Zahl umzuwandeln, verwenden Sie
parseInt(hexstr, 10)
. Um eine Ganzzahl in eine Hexadezimalzahl umzuwandeln, verwenden Sien.toString(16)
wobei n eine ganze Zahl ist.– Cristian Sánchez
6. August 2010 um 18:00 Uhr
@qw3n – Beispieleingabe: nur kurze, einfache alte Textzeichenfolgen … wie ‘Medizin’, ‘Chirurgie’, ‘Neurologie’, ‘Allgemeinmedizin’ usw. Zwischen 3 und sagen wir 20 Zeichen … kann nicht gefunden werden die andere, aber hier ist die Java-Frage: stackoverflow.com/questions/2464745/… @Daniel – Danke. Ich muss mich hinsetzen und es noch einmal ernsthaft versuchen. könnte nützlich sein.
– Darragh Enright
6. August 2010 um 18:42 Uhr