Après avoir jeté un coup d'œil sur les réponses, plutôt anciennes et exigeantes en termes de code, j'ai pensé revoir cette question d'un point de vue 2021, juste pour le plaisir, en espérant que cela puisse être utile à quelqu'un. Le modèle de couleur HSL et l'API cryptographique étant implémentés dans pratiquement tous les navigateurs (sauf IE bien sûr) aujourd'hui, le problème pourrait être résolu aussi simplement que cela :
async function getColor(text, minLightness = 40, maxLightness = 80, minSaturation = 30, maxSaturation = 100) {
let hash = await window.crypto.subtle.digest("SHA-1", new TextEncoder().encode(text));
hash = new Uint8Array(hash).join("").slice(16);
return "hsl(" + (hash % 360) + ", " + (hash % (maxSaturation - minSaturation) + minSaturation) + "%, " + (hash % (maxLightness - minLightness) + minLightness) + "%)";
}
function generateColor() {
getColor(document.getElementById("text-input").value).then(color => document.querySelector(".swatch").style.backgroundColor = color);
}
input {
padding: 5px;
}
.swatch {
margin-left: 10px;
width: 28px;
height: 28px;
background-color: white;
border: 1px solid gray;
}
.flex {
display: flex;
}
<html>
<body>
<div class="flex">
<form>
<input id="text-input" type="text" onInput="generateColor()" placeholder="Type here"></input>
</form>
<div class="swatch"></div>
</div>
</body>
</html>
Cela devrait être beaucoup plus rapide que de générer des hachages manuellement, et offre également un moyen de définir la saturation et la luminosité au cas où vous ne voudriez pas de couleurs trop plates, trop lumineuses ou trop sombres (par exemple, si vous voulez écrire du texte sur ces couleurs).