You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于单一颜色计算Material调色板及Contrast Text?

基于单一颜色生成Material调色板与对比文本的实现方案

核心依赖:@material/material-color-utilities

这个包是Material Design官方提供的色彩计算工具,完全可以满足你的需求,以下是具体实现步骤:


1. 安装依赖

npm install @material/material-color-utilities

2. 完整代码实现

import { Hct, CorePalette, TonalPalette, hexFromArgb, getContrastColor } from '@material/material-color-utilities';

// 输入单一颜色(支持带#或不带#的十六进制格式)
const inputColor = '#1976d2';

// 1. 将输入颜色转换为HCT色彩空间(Material Design 3核心色彩模型)
const inputHct = Hct.fromHex(inputColor);
const inputArgb = inputHct.toInt();

// 2. 生成标准Material主色调板(50-900)
const corePalette = CorePalette.fromArgb(inputArgb);
const primaryPalette = {
  50: hexFromArgb(corePalette.primary.tone(50)),
  100: hexFromArgb(corePalette.primary.tone(100)),
  200: hexFromArgb(corePalette.primary.tone(200)),
  300: hexFromArgb(corePalette.primary.tone(300)),
  400: hexFromArgb(corePalette.primary.tone(400)),
  500: hexFromArgb(corePalette.primary.tone(500)),
  600: hexFromArgb(corePalette.primary.tone(600)),
  700: hexFromArgb(corePalette.primary.tone(700)),
  800: hexFromArgb(corePalette.primary.tone(800)),
  900: hexFromArgb(corePalette.primary.tone(900))
};

// 3. 生成A系列高饱和度强调调色板(A100/A200/A400/A700)
const highSaturationPalette = TonalPalette.fromHueAndChroma(inputHct.hue, 90);
const aSeriesPalette = {
  A100: hexFromArgb(highSaturationPalette.tone(90)),
  A200: hexFromArgb(highSaturationPalette.tone(80)),
  A400: hexFromArgb(highSaturationPalette.tone(60)),
  A700: hexFromArgb(highSaturationPalette.tone(40))
};

// 4. 计算每个颜色对应的对比文本(Contrast Text)
const getContrastText = (hexColor) => {
  const colorArgb = Hct.fromHex(hexColor).toInt();
  return hexFromArgb(getContrastColor(colorArgb));
};

// 整合调色板与对比文本
const fullPrimaryPalette = Object.fromEntries(
  Object.entries(primaryPalette).map(([tone, color]) => [
    tone, { color, contrastText: getContrastText(color) }
  ])
);

const fullASeriesPalette = Object.fromEntries(
  Object.entries(aSeriesPalette).map(([tone, color]) => [
    tone, { color, contrastText: getContrastText(color) }
  ])
);

// 输出结果
console.log('主色调板(含对比文本):', fullPrimaryPalette);
console.log('A系列调色板(含对比文本):', fullASeriesPalette);

关键逻辑说明

  • HCT色彩空间:Material Design 3采用的色彩模型,将颜色分解为色相(Hue)、色度(Chroma,饱和度)、亮度(Tone),是生成调色板的基础。
  • CorePalette:从输入颜色生成完整的Material调色体系,包含主色、次色、中性色等系列,我们这里只提取主色的50-900色调。
  • TonalPalette:用于生成特定色相和色度的色调系列,A系列是高饱和度变体,所以设置色度为90,再对应不同亮度值生成A100/A200等色值。
  • getContrastColor:官方提供的工具方法,自动根据背景色计算符合Material易读性标准的文本颜色(黑色或白色)。

内容的提问来源于stack exchange,提问作者Giovanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:36:00