使用 JavaScript 基于字符串创建十六进制颜色
我想创建一个函数,它接受任何旧字符串(通常是单个单词),并以某种方式从中生成一个介于 #000000
和 # 之间的十六进制值FFFFFF
,所以我可以将它用作 HTML 元素的颜色。
如果不那么复杂的话,甚至可以是一个速记的十六进制值(例如:#FFF
)。事实上,“网络安全”调色板中的颜色是理想的。
I want to create a function that will accept any old string (will usually be a single word) and from that somehow generate a hexadecimal value between #000000
and #FFFFFF
, so I can use it as a colour for a HTML element.
Maybe even a shorthand hex value (e.g: #FFF
) if that's less complicated. In fact, a colour from a 'web-safe' palette would be ideal.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
以下是 CD Sanchez 答案的改编版本,始终返回 6 位颜色代码:
如果您使用 Eslint,则需要将此函数包装在
用法中:
示例:
http://jsfiddle.net/sUK45/
(替代/更简单的解决方案可能涉及返回“rgb(...)”样式的颜色代码。)
Here's an adaptation of CD Sanchez' answer that consistently returns a 6-digit colour code:
If you are using Eslint, you want to wrap this function in the
Usage:
Example:
http://jsfiddle.net/sUK45/
(An alternative/simpler solution might involve returning an 'rgb(...)'-style colour code.)
只需从 计算任意字符串的十六进制颜色代码 到 Javascript:
要转换你会这样做:
Just porting over the Java from Compute hex color code for an arbitrary string to Javascript:
To convert you would do:
我希望 HTML 元素的颜色具有类似的丰富性,我惊讶地发现 CSS 现在支持 hsl() 颜色,因此我的完整解决方案如下:
另请参阅 如何自动生成 N 个“不同”颜色? 以获得更多与此类似的替代方案。
编辑:根据 @zei 的版本 进行更新(采用美式拼写)
在 HSL 中它是色相、饱和度、亮度。所以0-359之间的色调将获得所有颜色,饱和度是你想要的颜色的丰富程度,100%对我有用。明度决定深度,50%是正常颜色,25%是深色,75%是粉彩。我有 30%,因为它最适合我的配色方案。
I wanted similar richness in colors for HTML elements, I was surprised to find that CSS now supports hsl() colors, so a full solution for me is below:
Also see How to automatically generate N "distinct" colors? for more alternatives more similar to this.
Edit: updating based on @zei's version (with american spelling)
In HSL its Hue, Saturation, Lightness. So the hue between 0-359 will get all colors, saturation is how rich you want the color, 100% works for me. And Lightness determines the deepness, 50% is normal, 25% is dark colors, 75% is pastel. I have 30% because it fit with my color scheme best.
这是我的 2021 版本,带有“Reduce 函数”和“HSL 颜色”。
Here is my 2021 version with Reduce Function and HSL Color.
使用 Cristian Sanchez 的答案中的 hashCode 和现代 JavaScript,您可以创建一个具有良好对比度的颜色选择器,如下所示:
由于它是 hsl,因此您可以缩放亮度以获得所需的对比度。
Using the
hashCode
as in Cristian Sanchez's answer withhsl
and modern javascript, you can create a color picker with good contrast like this:Since it's hsl, you can scale luminance to get the contrast you're looking for.
我发现生成随机颜色往往会创建对比度不足以满足我口味的颜色。我发现解决这个问题的最简单方法是预先填充一个非常不同的颜色列表。对于每个新字符串,分配列表中的下一个颜色:
虽然这仅限于 64 种颜色,但我发现大多数人无论如何都无法真正分辨出其中的区别。我想你总是可以添加更多颜色。
虽然此代码使用硬编码颜色,但至少可以保证您在开发过程中确切地知道在生产中将看到的颜色之间的对比度有多大。
颜色列表已从这个答案中删除,还有其他包含更多颜色的列表。
I find that generating random colors tends to create colors that do not have enough contrast for my taste. The easiest way I have found to get around that is to pre-populate a list of very different colors. For every new string, assign the next color in the list:
While this has a limit to only 64 colors, I find most humans can't really tell the difference after that anyway. I suppose you could always add more colors.
While this code uses hard-coded colors, you are at least guaranteed to know during development exactly how much contrast you will see between colors in production.
Color list has been lifted from this SO answer, there are other lists with more colors.
如果您的输入差异不足以让简单哈希使用整个色谱,则可以使用种子随机数生成器而不是哈希函数。
我正在使用 Joe Freeman 的答案中的颜色编码器,以及 David Bau 的种子随机数生成器。
If your inputs are not different enough for a simple hash to use the entire color spectrum, you can use a seeded random number generator instead of a hash function.
I'm using the color coder from Joe Freeman's answer, and David Bau's seeded random number generator.
我已向 拉取请求。 com/Fooidge/PleaseJS" rel="nofollow noreferrer">Please.js 允许从哈希生成颜色。
您可以将字符串映射到颜色,如下所示:
例如,
“此处任何字符串”
将返回为“#47291b”
并且
"another!"
返回为"#1f0c3d"
I have opened a pull request to Please.js that allows generating a color from a hash.
You can map the string to a color like so:
For example,
"any string goes here"
will return as"#47291b"
and
"another!"
returns as"#1f0c3d"
Javascript 解决方案受到 Aslam 解决方案的启发,但返回十六进制颜色代码的颜色
Javascript Solution inspired by Aslam's solution but returns a color in hex color code
随机颜色的另一个解决方案:
它是适合我的工作的混合体。
我使用了来自 此处 的 JFreeman Hash 函数(也是本线程中的答案)和 Asykäri 伪随机函数,以及来自的一些填充和数学我。
我怀疑这个函数会产生均匀分布的颜色,尽管它看起来不错并且做了它应该做的事情。
Yet another solution for random colors:
It's a mixed of things that does the job for me.
I used JFreeman Hash function (also an answer in this thread) and Asykäri pseudo random function from here and some padding and math from myself.
I doubt the function produces evenly distributed colors, though it looks nice and does that what it should do.
2024 版本 - 简单明了的 TypeScript 箭头函数,返回 HSL 颜色。
2024 version - Plain and simple TypeScript arrow function that returns HSL color.
这是我想出的一个解决方案,用于根据输入字符串生成美观的柔和颜色。它使用字符串的前两个字符作为随机种子,然后根据该种子生成 R/G/B。
它可以很容易地扩展,以便种子是字符串中所有字符的异或,而不仅仅是前两个。
受到 David Crow 的回答的启发:随机生成美观的算法 -令人愉悦的调色板
GIST在这里:https://gist.github.com/ro -锐利/49fd46a071a267d9e5dd
Here's a solution I came up with to generate aesthetically pleasing pastel colours based on an input string. It uses the first two chars of the string as a random seed, then generates R/G/B based on that seed.
It could be easily extended so that the seed is the XOR of all chars in the string, rather than just the first two.
Inspired by David Crow's answer here: Algorithm to randomly generate an aesthetically-pleasing color palette
GIST is here: https://gist.github.com/ro-sharp/49fd46a071a267d9e5dd
这是另一个尝试:
Here is another try:
您真正需要的只是一个好的哈希函数。在节点上,我只是使用
All you really need is a good hash function. On node, I just use
在查看了相当代码密集且相当旧的答案之后,我想我会从 2021 年的角度回顾这个问题只是为了好玩,希望它对任何人都有用。如今,HSL 颜色模型和加密 API 在几乎所有浏览器(当然 IE 除外)中实现,问题可以这么简单地解决:
这应该比手动生成哈希要快得多,并且还提供了一种定义饱和度和亮度的方法,以防您不希望颜色太平或太亮或太暗(例如,如果您想在这些颜色上写入文本) 。
After having a look at the rather code intensive and rather old answers, I thought I'd review this issue from a 2021 standpoint just for fun, hope it is of use to anyone. Having the HSL color model and the crypto API implemented in pretty much all browsers (except IE of course) today, it could be solved as simple as that:
This should be way faster than generating hashes manually, and also offers a way to define saturation and lightness in case you don't want colors that are too flat or too bright or too dark (e.g. if you want to write text on those colors).
我有一种情况,我想根据用户的用户名显示背景,并在顶部显示用户名的第一个字母。
我使用了亲爱的代码,它对我来说效果很好
找到可以使用的合适颜色
}
I have a situation where i want to display a background based on the username of the user and display the username's first letter on top.
i used the belove code for that it worked well for me
To find the appropriate colour you can use
}
这个函数就可以达到目的。这是对此的改编,相当长的实现此存储库 ..
This function does the trick. It's an adaptation of this, fairly longer implementation this repo ..
我的代码是针对Java的。
谢谢大家。
my code is for Java.
Thanks for all.
我将其转换为 Python 的一行
I convert this in one line for Python