Erstellen Sie eine hexadezimale Farbe basierend auf einem String mit JavaScript

Lesezeit: 8 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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;
}

Verwendungszweck:

stringToColour("greenish");
// -> #9bc63b

Beispiel:

http://jsfiddle.net/sUK45/

(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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
Islam

Hier ist meine 2021-Version mit Reduce-Funktion und HSL-Farbe.

function getBackgroundColor(stringInput) {
    let stringUniqueHash = [...stringInput].reduce((acc, char) => {
        return char.charCodeAt(0) + ((acc << 5) - acc);
    }, 0);
    return `hsl(${stringUniqueHash % 360}, 95%, 35%)`;
}

Benutzer-Avatar
Kyle Kelly

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>

Benutzer-Avatar
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.

Benutzer-Avatar
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.

Ich verwende den Farbcodierer aus Joe Freemans Antwort und Der Seed-Zufallszahlengenerator von David Bau.

function stringToColour(str) {
    Math.seedrandom(str);
    var rand = Math.random() * Math.pow(255,3);
    Math.seedrandom(); // don't leave a non-random seed in the generator
    for (var i = 0, colour = "#"; i < 3; colour += ("00" + ((rand >> i++ * 8) & 0xFF).toString(16)).slice(-2));
    return colour;
}

1299490cookie-checkErstellen Sie eine hexadezimale Farbe basierend auf einem String mit JavaScript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy