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

Sass根据指定颜色获取Material Design色调值问题咨询

解决Sass与Material Design 3色调系统不匹配的问题

核心原因

Material Design 3(M3)的色调系统基于CAM16色彩空间的感知亮度(L*值),而Sass的color.lightness()、color.scale()等函数用的是HSL色彩模型的亮度通道,两者计算逻辑完全不同,直接用Sass的HSL相关函数自然匹配不上M3的色调刻度。

解决方案

1. 直接映射M3官方色值(最简单可靠)

M3每个主色都有一套固定的0-100色调色板,你可以先获取#3a691e对应的完整色调值,然后在Sass里直接定义变量使用:

// 对应M3 40色调的目标色
$primary-40: #3a691e;
// 对应M3 90色调的色值(示例,需以官方工具输出为准)
$primary-90: #e8f5e0;

2. 自定义CAM16亮度转换函数(动态计算)

如果需要动态生成色调,Sass本身没有内置CAM16相关函数,你需要自己实现转换逻辑:

  • 先把目标RGB颜色转成CAM16色彩空间,拿到当前的L*值(对应M3的40色调)
  • 调整L值到目标色调对应的数值(比如90色调对应的L约为90,具体参考M3色调定义)
  • 把调整后的CAM16值转回RGB,得到对应色调的颜色

简化示例逻辑(需完善色彩转换细节):

@function cam16-to-rgb($l, $a, $b) {
  // 实现CAM16到RGB的转换逻辑
}

@function get-m3-tone($color, $target-tone) {
  // 1. 将$color转为CAM16的L*、a*、b*值
  $cam16: rgb-to-cam16($color);
  $current-l: nth($cam16, 1);
  $a: nth($cam16, 2);
  $b: nth($cam16, 3);
  
  // 2. 调整L*到目标色调对应的数值
  $new-l: $target-tone; // M3色调刻度基本对应CAM16的L*值
  
  // 3. 转回RGB
  @return cam16-to-rgb($new-l, $a, $b);
}

// 使用示例
$primary-color: #3a691e;
$primary-90: get-m3-tone($primary-color, 90);

关键提醒

M3的色调0-100刻度直接对应CAM16的L*值范围(0=纯黑,100=纯白),和HSL的亮度不是线性对应关系,这就是为什么你用color.scale($lightness: 90%)得不到预期结果,反而60%更接近的原因。优先用第一种方法直接映射官方色值,能避免色彩转换带来的误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:36:13