使用CSS生成颜色

Lobsters Hottest 工具

摘要

本教程介绍如何使用CSS的oklch()函数和相对颜色功能,从单个十六进制代码动态生成完整的调色板,从而简化网站的颜色管理。

<p><a href="https://lobste.rs/s/ipiook/generative_colors_with_css">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/15 01:39

# 使用 CSS 生成色彩 来源:https://gomakethings.com/articles/generative-colors-with-css/ 我刚刚更新了我网站的 CSS,改用 Kelp UI (https://kelpui.com/) 的一个分支,它包含了比以前更一致且易于维护的类系统。 **快速说明:** 如果你在浏览过程中发现任何错误,请告诉我!(https://gomakethings.com/) 虽然整体外观与之前大致相同,但最大的变化在于色彩调色板。 我现在利用 CSS 函数 `oklch()` 的相对颜色功能,仅通过定义为 CSS 变量的六个十六进制代码,动态生成站点的所有颜色。 让我们来看看它是如何工作的! ## CSS 函数 `oklch()` CSS 函数 `oklch()` 允许你通过定义以下属性来创建一种颜色: - **亮度(Lightness)** — 感知的明亮程度。 - **色度(Chroma)** — 颜色的鲜艳程度或饱和度。 - **色相(Hue)** — 表示颜色的数字。 例如,我为此网站使用的蓝色 `#007ab8`,在 OKLCH 中表示为 `oklch(55.48% 0.131 241.70)`。 `oklch()` 函数之所以酷,在于一旦你有了颜色的 L、C 和 H 值,你就可以通过略微调整*亮度*和*色度*,从你的*色相*中创建完整的调色板。 例如,我可以通过稍微降低*亮度*来创建该蓝色的更深色调:`oklch(48% 0.131 241.70)`。 ***注意:** 除了 `oklch()` 之外,还有其他颜色函数,包括 `rgb()`、`oklab()` 等。我发现 `oklch()` 是最容易使用的。* ## 相对颜色 手动使用 `oklch()` 创建颜色调色板是一项繁琐的工作,我不推荐这样做。 这就是相对颜色(https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Colors/Using_relative_colors)的用武之地! 通过将 `from` 操作符后跟一种颜色(可以是十六进制值*或*其他颜色函数),`oklch()` 函数会为你将该颜色转换为 `l`、`c` 和 `h` 值(百分比以小数表示)。 ```css :root { --color-blue: oklch(from #007ab8 l c h); } ``` 这里,我直接将生成的变量原样传递,没有做任何更改。 但——这才是真正强大的地方——你可以手动覆盖它们的值,甚至使用 `calc()` 数学函数来调整这些值。 让我们通过程序化地将*亮度*(`l`)降低 5% 来创建一个更深的蓝色。我无需关心或知道实际的起始值是多少。 ```css :root { --color-blue-darker: oklch(from #007ab8 calc(l - 0.05) c h); } ``` ## 关于亮度和色度的快速说明 非常亮和非常暗的*亮度*水平往往看起来过于饱和。 因此,许多调色板在从中间范围的*亮度*向边缘移动时,略微降低*色度*会显得更加协调。 ## 生成整个调色板 让我们看看如何利用 `oklch()` 和一点数学,从一个十六进制代码生成一个 11 色调色板。 首先,我们将颜色定义为 CSS 变量。 ```css :root { --color: #007ab7; } ``` 接下来,我们创建一系列命名的颜色变量,从 `--color-05` 到 `--color-95`。 对于每个变量,我们将从我们的 `--color` 变量(使用 `from`)生成颜色。我们将调整亮度(`l`),但暂时保持色度(`c`)不变。 ```css :root { --color: #007ab7; --color-05: oklch(from var(--color) 18.5% c h); --color-10: oklch(from var(--color) 24% c h); --color-20: oklch(from var(--color) 32.5% c h); --color-30: oklch(from var(--color) 40% c h); --color-40: oklch(from var(--color) 45% c h); --color-50: oklch(from var(--color) 57% c h); --color-60: oklch(from var(--color) 67% c h); --color-70: oklch(from var(--color) 75% c h); --color-80: oklch(from var(--color) 83.5% c h); --color-90: oklch(from var(--color) 92% c h); --color-95: oklch(from var(--color) 96% c h); } ``` 这是调色板的演示。(https://codepen.io/cferdinandi/pen/MYbWQxx) ## 调整色度 你可能注意到最浅的色调仍然相当鲜艳。如果你将它们用作柔和的背景色,它们可能有点过于强烈。 为了解决这个问题,我们将使用 `calc()` 函数和一点数学,在调色板边缘附近略微降低色度。 经过反复试验,我找到了在调色板每一步调整色度时我喜欢的一组百分比。为了让数学生效,我将色度(`c`)除以 `0.2`,然后乘以该百分比。 为什么除以 `0.2`?在 OKLCH 中,`0.4` 表示 100% 饱和度。颜色很少能达到那样的饱和度。使用 50% 的饱和度可以为其余数学计算提供一个良好的基线。 ```css :root { --color: #007ab7; --color-05: oklch(from var(--color) 18.5% calc(0.08 * (c / .2)) h); --color-10: oklch(from var(--color) 24% calc(0.1 * (c / .2)) h); --color-20: oklch(from var(--color) 32.5% calc(0.135 * (c / .2)) h); --color-30: oklch(from var(--color) 40% calc(0.16 * (c / .2)) h); --color-40: oklch(from var(--color) 45% calc(0.185 * (c / .2)) h); --color-50: oklch(from var(--color) 57% calc(0.2 * (c / .2)) h); --color-60: oklch(from var(--color) 67% calc(0.175 * (c / .2)) h); --color-70: oklch(from var(--color) 75% calc(0.13 * (c / .2)) h); --color-80: oklch(from var(--color) 83.5% calc(0.085 * (c / .2)) h); --color-90: oklch(from var(--color) 92% calc(0.04 * (c / .2)) h); --color-95: oklch(from var(--color) 96% calc(0.02 * (c / .2)) h); } ``` 这是调整色度后的调色板。(https://codepen.io/cferdinandi/pen/ogYNpaV) 注意调色板变得更为柔和,尤其是在最亮和最暗的色调上。 ## 手动覆盖色度 有时,所选取颜色的色度要么过于柔和,要么过于鲜艳,效果不佳。我希望有一种方法可以手动上下调整,而无需寻找更好的十六进制值。 为了支持这一点,我更新了色度的 `calc()` 函数,使用 `--chroma` 变量作为起点。 CSS 变量允许你传入后备值。我使用 `c / .2` 作为默认值,如果定义了 `--chroma`,则使用它。 我使用的蓝色 `#007ab7`,其 `c / .2` 值约为 `0.65`。这里,我将 `--chroma` 设置为 `0.95`,使其明显更亮或更鲜艳。 ```css :root { --color: #007ab7; --chroma: 0.95; --color-05: oklch(from var(--color) 18.5% calc(0.08 * var(--chroma, c / .2)) h); --color-10: oklch(from var(--color) 24% calc(0.1 * var(--chroma, c / .2)) h); --color-20: oklch(from var(--color) 32.5% calc(0.135 * var(--chroma, c / .2)) h); --color-30: oklch(from var(--color) 40% calc(0.16 * var(--chroma, c / .2)) h); --color-40: oklch(from var(--color) 45% calc(0.185 * var(--chroma, c / .2)) h); --color-50: oklch(from var(--color) 57% calc(0.2 * var(--chroma, c / .2)) h); --color-60: oklch(from var(--color) 67% calc(0.175 * var(--chroma, c / .2)) h); --color-70: oklch(from var(--color) 75% calc(0.13 * var(--chroma, c / .2)) h); --color-80: oklch(from var(--color) 83.5% calc(0.085 * var(--chroma, c / .2)) h); --color-90: oklch(from var(--color) 92% calc(0.04 * var(--chroma, c / .2)) h); --color-95: oklch(from var(--color) 96% calc(0.02 * var(--chroma, c / .2)) h); } ``` 这是带手动 `--chroma` 覆盖的调色板。(https://codepen.io/cferdinandi/pen/zxoYpeL) 请随意尝试 `--chroma` 的值,甚至完全移除它,看看调色板如何响应变化。 ## CSS 就是编程语言 我希望这篇文章能清楚地说明 CSS 确实是一种编程语言,而且可以完成许多以前需要 JS 或手动编码才能完成的酷事情。 这一更新让处理颜色变得容易得多,我迫不及待地想要将其带入 Kelp (https://kelpui.com/) 中。

相似文章

Oklch颜色选取(凡人指南)

Lobsters Hottest

一本以通俗易懂的方式解释Oklch颜色空间的指南,强调其感知均匀性,以便在设计中实现一致的颜色选取。

仅用CSS指定每主题颜色的几种方法

Lobsters Hottest

本文介绍了五种仅用CSS实现每主题颜色(浅色/深色/自动)的技术,无需JavaScript,利用prefers-color-scheme、:has()、CSS变量和color-mix()等特性。

在CSS中尝试Random()函数

Hacker News Top

一篇探索新的CSS random()函数的博客文章,该函数允许将属性设置为随机值以实现创意设计,包含演示和浏览器支持详情。

算法主题引擎

Hacker News Top

本文介绍了新的CSS `contrast-color()`函数,该函数允许开发人员自动选择黑色或白色文本,以实现与任何背景颜色的可访问对比度,解决网络上长期存在的低对比度问题,而无需依赖JavaScript。