了解如何在 JavaScript 中使用 CSS 相对颜色
CSS 相对颜色使开发人员能够根据预先存在的颜色值动态修改颜色,从而为开发人员提供了更大的样式灵活性。例如,您可能希望修改颜色的 Alpha 透明度及其红色和蓝色通道。由于这种技术,流体设计系统有了更多的可能性。
不过,在 JavaScript 中处理这些动态生成的数据可能很困难。如果您尝试使用 要检索计算出的颜色,它可以返回未处理的字符串,而不是修复您所做的 CSS 更改。这限制了最终输出颜色的编程操作和分析。
在这篇文章中,我们研究从 CSS 获取完整计算的十六进制颜色的过程,无论它是否是通过复杂的定义的 句法。我们正在解决的问题是,一旦 CSS 引擎计算出 RGB 和 alpha 通道的相对修改,如何获得精确的颜色值。
我们还将研究其他可能的选项,例如任何第三方库或内置浏览器 API,它们可以帮助您以可在 JavaScript 代码中使用并进一步修改的格式提取此颜色信息。
命令 | 使用示例 |
---|---|
getComputedStyle | 应用所有 CSS 后,此命令将获取元素的真实计算样式。它有助于从相对值(例如颜色)中获取动态 CSS 值。 |
createElement('canvas') | 使用 JavaScript 动态创建 |
getContext('2d') | 借助此命令,脚本可以通过检索图像的 2D 绘图上下文,在像素级别绘制或处理图片数据、添加颜色等。 |
fillStyle | 定义将应用于画布的图案、颜色或渐变。在示例中,它用于在提取像素数据之前设置画布的计算颜色。 |
fillRect | 使用当前的 fillStyle 填充画布上的矩形区域。此处,计算出的颜色填充 1x1 像素区域以进行额外处理。 |
getImageData | 使用此命令提取画布的像素数据。它用于获取在 fillRect 创建的 1x1 像素中渲染的颜色的 RGBA 值。 |
chroma | 用于颜色修改的第三方库称为 Chroma.js。 chroma() 方法通过在多种格式(例如 RGB 和十六进制)之间转换颜色,可以更轻松地使用计算的 CSS 颜色。 |
toString(16) | 将整数转换为其十六进制表示形式,这在将 RGB 值转换为十六进制时非常重要。在此实例中,它用于混合红色、绿色和蓝色的值以创建最终的十六进制颜色代码。 |
slice(1) | 删除字符串的初始字符。 Slice(1) 在将数字转换为十六进制之前消除了数字中多余的前导字符,确保十六进制代码的格式正确。 |
JavaScript:利用 CSS 相对颜色提取最终的十六进制颜色
在第一个脚本中,我们利用浏览器的内置功能,使用 JavaScript 获取并使用 CSS 中动态计算的颜色。主要问题在于 允许可变颜色通道调整,当使用更传统的技术(例如 。我们设计了一个解决方法,采用 元素。我们可以通过将计算出的颜色渲染到尺寸为 1x1 像素的画布上来获得精确的 RGB 值。 canvas API 能够在像素级别操作图片数据(包括颜色),从而使这一过程成为可能。
每个像素的 RGBA 值由 将颜色放置到画布上后的方法。接下来,利用 JavaScript 中的数字到字符串转换和按位运算,将这些值转换为十六进制格式。这里是重要的说明,例如 和 ,负责生成颜色并生成可绘制的表面。当我们需要浏览器根据渲染的确切颜色时 CSS 规则——包括任何透明度或颜色通道调整——这种技术效果很好。这是在不使用其他库的情况下解决问题的绝佳方法。
在第二种方法中,我们使用名为 Chroma.js 的第三方工具简化了颜色操作。可以使用 Chroma.js 轻松地在各种格式之间转换颜色,它提供了一种更抽象的与颜色交互的方法。从 DOM 获取计算出的颜色后,Chroma.js 会自动处理到十六进制或其他格式(例如 RGB 或 HSL)的转换。当处理需要更复杂的颜色调整或格式转换的项目时,这种方法是完美的。结果,代码变得更简单、更清晰、更易于维护。
尽管从不同的角度来看,这两种策略都处理相同的问题。为了确定最终的十六进制颜色,第一个使用按位计算和本机浏览器 API,而第二个则利用专业颜色处理包的功能。您可以使用 Chroma.js 来提高灵活性和易用性,也可以使用本机方式来避免添加依赖项,具体取决于项目的需求。 JavaScript 允许在这两种情况下对检索到的十六进制颜色进行额外的操作,从而为动态样式和基于颜色的动画提供机会。
使用 JavaScript 从 CSS 相对颜色中提取最终的十六进制颜色
此方法使用内置浏览器 API 和普通 JavaScript 来操作 CSS 相对颜色。
// 1. First, grab the element whose color you want to extract
const element = document.querySelector('.my-element');
// 2. Use getComputedStyle to get the color property
let computedColor = getComputedStyle(element).color;
// 3. Create a canvas to convert the computed color to hex format
let canvas = document.createElement('canvas');
canvas.width = 1; // Small canvas, just for color conversion
canvas.height = 1;
let ctx = canvas.getContext('2d');
// 4. Set the fill style to the computed color and fill the canvas
ctx.fillStyle = computedColor;
ctx.fillRect(0, 0, 1, 1);
// 5. Extract the color in hex format using getImageData
let pixelData = ctx.getImageData(0, 0, 1, 1).data;
let hexColor = "#" +
((1 << 24) | (pixelData[0] << 16) | (pixelData[1] << 8) | pixelData[2])
.toString(16)
.slice(1); // Convert to hex and remove the alpha
console.log(hexColor); // This will log the final hex color value
使用第三方库 (Chroma.js) 进行十六进制颜色转换
这种方法通过使用 Chroma.js 包来简化过程,从而确保颜色操作的精确性和灵活性。
// 1. First, include Chroma.js in your project (e.g., via CDN or NPM)
// <script src="https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.1.0/chroma.min.js">
const element = document.querySelector('.my-element');
// 2. Retrieve the computed color using getComputedStyle
let computedColor = getComputedStyle(element).color;
// 3. Use Chroma.js to convert the computed color to hex
let chromaColor = chroma(computedColor);
let hexColor = chromaColor.hex();
console.log(hexColor); // Log the final hex color
// Chroma.js also supports other formats such as RGB or HSL
let rgbColor = chromaColor.rgb();
let hslColor = chromaColor.hsl();
console.log(rgbColor); // Logs RGB array
console.log(hslColor); // Logs HSL array
单元测试:验证最终颜色输出
此单元测试确保 JavaScript 解决方案返回的最终十六进制颜色是正确的。
describe('Color Extraction Tests', () => {
it('should return the correct hex color using canvas', () => {
let color = getHexColorFromCanvas('.my-element');
expect(color).toBe('#e6aabb'); // Expected final hex color
});
it('should return the correct hex color using Chroma.js', () => {
let color = getHexColorUsingChroma('.my-element');
expect(color).toBe('#e6aabb'); // Expected final hex color
});
});
// Functions used for the tests
function getHexColorFromCanvas(selector) {
const element = document.querySelector(selector);
let computedColor = getComputedStyle(element).color;
let canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
let ctx = canvas.getContext('2d');
ctx.fillStyle = computedColor;
ctx.fillRect(0, 0, 1, 1);
let pixelData = ctx.getImageData(0, 0, 1, 1).data;
return "#" + ((1 << 24) | (pixelData[0] << 16) | (pixelData[1] << 8) | pixelData[2]).toString(16).slice(1);
}
function getHexColorUsingChroma(selector) {
const element = document.querySelector(selector);
let computedColor = getComputedStyle(element).color;
return chroma(computedColor).hex();
}
在 JavaScript 中处理 CSS 相对颜色的高级技术
使用变量来实现动态颜色修改是一个有效但有时被忽视的功能 。例如,您可以使用 JavaScript 构建代表基本颜色的 CSS 变量并实时更改它们,从而实现响应式设计系统和动态主题。当与 CSS 相对颜色函数一起使用时,这种方法使得当代在线应用程序中可扩展且可维护的颜色方案成为可能。
使用 CSS 类型对象模型 (Typed OM) 是解决获取最终计算颜色问题的另一种方法。借助 Typed OM,开发人员可以更加编程化、系统化地使用 CSS 属性。由于 Typed OM,CSS 值现在可以作为 JavaScript 对象进行访问,这消除了对基于字符串的方法的需要。相对颜色及其他 从中受益,因为它可以更精确地控制财产操纵。
最后,如果您想跟踪元素样式的变化,特别是当 CSS 变量或相对颜色值动态更改时,请考虑利用 JavaScript 。 MutationObserver 可以跟踪对 DOM 的修改,例如对元素内联样式的调整。您可以让 JavaScript 逻辑重新计算颜色并根据任何适用的样式更改进行更新。这种技术特别适用于高度动态的界面,其中样式会根据用户或外部源的输入定期发生变化。
- 怎么样 处理相对颜色时有效吗?
- 获取 CSS 属性计算得出的最终值;然而,它经常以字符串形式返回相对颜色,而不是最终计算的颜色。
- 最终颜色是否可以用 元素对我有用吗?
- 是的,可以利用一个小的渲染颜色并提取像素数据来获得最终的十六进制颜色 和 方法。
- 的作用是什么 在这个过程中?
- 五使处理各种格式的颜色变得更加容易,并使颜色转换更加简单。例如,您可以快速将 RGB 转换为十六进制。
- CSS 相对颜色有什么用?
- 开发人员可以为响应式设计实现 Alpha 透明度,并通过使用 CSS 相对颜色提高或降低 RGB 值来动态修改颜色通道。
- 我可以使用 JavaScript 检测样式更改吗?
- 是的,您可以根据需要重新计算颜色,并利用 API。
从 CSS 相对颜色确定最终颜色可能很困难,因为 通常只产生原始字符串。通过使用像 Chroma.js 或 用于像素数据提取。
开发人员可以利用 JavaScript 工具和 API 有效地提取、更改和应用这些颜色。本机解决方案和第三方库都提供了动态处理 CSS 相对颜色输出的可扩展方法,具体取决于项目的需求。
- 详细说明了使用 JavaScript 中 CSS 属性提取的方法。如需进一步阅读,请访问: MDN 网络文档:getCompulatedStyle 。
- 解释了使用 元素在 JavaScript 中提取像素颜色数据。详细信息可参见: MDN Web 文档:使用画布进行像素操作 。
- Chroma.js 文档提供了有关在 JavaScript 中转换和操作颜色的详细信息。在这里了解更多: Chroma.js 官方文档 。
- 关于 CSS 相关颜色及其应用的见解可以在 CSS 规范中找到: CSS 颜色模块级别 4 。