使用 JavaScript 创建基于字符串的十六进制颜色

IT技术 javascript string colors hex
2021-03-06 11:12:51

我想创建一个函数,该函数将接受任何旧字符串(通常是一个单词),并从中以某种方式#000000之间生成一个十六进制值#FFFFFF,因此我可以将其用作 HTML 元素的颜色。

#FFF如果不那么复杂,甚至可能是速记十六进制值(例如:)。事实上,来自“网络安全”调色板的颜色将是理想的。

6个回答

这是 CD Sanchez 回答的改编版,它始终返回 6 位颜色代码:

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

用法:

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

例子:

http://jsfiddle.net/sUK45/

(另一种/更简单的解决方案可能涉及返回“rgb(...)”样式的颜色代码。)

有趣的是,相同的字符串在不同的浏览器/oss 上的颜色是不同的——例如 Chrome+Windows 和 Chrome+Android——我的电子邮件=>颜色在一个是蓝色的,另一个是绿色的。知道为什么吗?
2021-05-06 11:12:51
这段代码与 NoSQL 自动生成的 ID 结合使用效果非常好,对于同一用户,您的颜色每次都将相同。
2021-05-07 11:12:51
我的十六进制代码中也需要透明度的 alpha 通道。这有帮助(在我的十六进制代码末尾为 alpha 通道添加两位数字): gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
2021-05-08 11:12:51
@Tjorriemorrie Upvoted 指出它是颜色而不是颜色。是的,是的,这不是真正的主题,但它对我来说很重要(实际上,在最初输入时,我两次都将其拼写为“颜色”!)。谢谢你。
2021-05-21 11:12:51
谢谢!对此的适应以仅从字符串生成柔和/明亮的颜色stackoverflow.com/a/64490863/403372
2021-05-21 11:12:51

只需将 Java 从任意字符串的 Compute hex color code移植到 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;
}

要转换你会这样做:

intToRGB(hashCode(your_string))
不要忘记添加 '#' 就像 return "#" + "00000".substring(0, 6 - c.length) + c;
2021-04-21 11:12:51
我希望我可以将其转换为 php。
2021-04-25 11:12:51
它需要填充十六进制字符串,例如: ("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);
2021-05-13 11:12:51
我正在将一堆音乐流派标签转换为背景颜色,这为我节省了很多时间。
2021-05-13 11:12:51
对于类似的字符串,我有一些几乎相同颜色的问题,例如: intToRGB(hashCode('hello1')) -> "3A019F" intToRGB(hashCode('hello2')) -> "3A01A0" 我通过为最终哈希值添加乘法来增强您的代码:return 100 * hash;
2021-05-16 11:12:51

我想为 HTML 元素提供类似的丰富颜色,我惊讶地发现 CSS 现在支持 hsl() 颜色,所以我的完整解决方案如下:

另请参阅如何自动生成 N 个“不同”颜色?更多与此类似的替代方案。

function colorByHashCode(value) {
    return "<span style='color:" + value.getHashCode().intToHSL() + "'>" + value + "</span>";
}
String.prototype.getHashCode = function() {
    var hash = 0;
    if (this.length == 0) return hash;
    for (var i = 0; i < this.length; i++) {
        hash = this.charCodeAt(i) + ((hash << 5) - hash);
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
};
Number.prototype.intToHSL = function() {
    var shortened = this % 360;
    return "hsl(" + shortened + ",100%,30%)";
};

document.body.innerHTML = [
  "javascript",
  "is",
  "nice",
].map(colorByHashCode).join("<br/>");
span {
  font-size: 50px;
  font-weight: 800;
}

在 HSL 中,它的色相、饱和度、亮度。因此,0-359 之间的色调将获得所有颜色,饱和度是您想要颜色的丰富程度,100% 适合我。而Lightness决定了深度,50%是正常色,25%是深色,75%是粉彩。我有 30%,因为它最适合我的配色方案。

这种方法对于提供我的应用程序所需的所需的活力/微妙非常有用。随机十六进制在饱和度和亮度方面变化太大,在大多数情况下都没有用。谢谢你!
2021-04-22 11:12:51
感谢分享解决方案,您可以在其中决定颜色应该有多鲜艳!
2021-05-03 11:12:51
一个非常通用的解决方案。
2021-05-04 11:12:51
@haykam 谢谢你把它变成一个片段!
2021-05-06 11:12:51
此解决方案返回的颜色太少,不行。
2021-05-09 11:12:51

这是我的 2021 版本,带有 Reduce Function 和 HSL Color。

function getBackgroundColor(stringInput) {
    let stringUniqueHash = [...stringInput].reduce((acc, char) => {
        return char.charCodeAt(0) + ((acc << 5) - acc);
    }, 0);
    return `hsl(${stringUniqueHash % 360}, 95%, 35%)`;
}
哈哈!我怎么会错过那个答案?与我提出的解决方案非常相似;-)
2021-05-02 11:12:51
优雅的解决方案。谢谢你。
2021-05-04 11:12:51

使用hashCodeCristian Sanchez 的答案hsl和现代 javascript,您可以创建一个具有良好对比度的颜色选择器,如下所示:

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>

由于它是 hsl,您可以缩放亮度以获得所需的对比度。

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>