- 前端
- UI组件
【免费下载链接】fast
The adaptive interface system for modern web experiences.
interpolateHSL()是 @microsoft/fast-colors 颜色工具库中用于在 HSL(色相-饱和度-亮度)色彩空间内进行颜色插值的核心函数。本文以 interpolateHSL 官方 API 文档 为主体,结合同包中 ColorHSL 类、lerp()、lerpAnglesInDegrees() 及 interpolateByColorSpace() 等配套 API 文档,系统讲解该函数的签名、参数语义、底层插值原理与实战用法。读完本文,你将能够独立使用interpolateHSL()在 HSL 空间中生成连续色阶(例如为 UI 组件生成过渡色、为图表生成渐变色序列),并理解它与 RGB、HSV、LAB、LCH、XYZ 等插值方案的差异与取舍。
说明:
interpolateHSL()属于 @microsoft/fast-colors 的1.x 历史 API,其完整 API 参考收录于本仓库 sites/website/src/docs/1.x/api/fast-colors.md。当前仓库主分支已演进至 fast-element 3.x,但该色彩工具函数作为独立、可复用的纯函数 API 仍具有直接的移植与参考价值。
函数签名与文档定位
官方签名
根据 fast-colors.interpolatehsl.md 的 API Documenter 自动生成记录,函数签名如下:
export declare function interpolateHSL(position: number, left: ColorHSL, right: ColorHSL): ColorHSL;其中:
export declare表明该函数是包的公开导出成员,可直接从@microsoft/fast-colors导入使用;- 函数语义一句话即可概括:Interpolate by HSL color space(按 HSL 色彩空间插值);
- 返回值类型为 ColorHSL。
文档中的参数表(原文完整继承)
| 参数 | 类型 | 说明 |
|---|---|---|
position | number | 插值位置(进度值)。结合 lerp() 的语义,可以推断其通常取值区间为[0, 1]:0时返回左端颜色,1时返回右端颜色,0.5为两者的中点色;超出该区间的取值亦可参与计算,效果等价于向两侧外推(详见下文原理小节)。 |
left | ColorHSL | 插值区间左端的颜色,即position = 0对应的颜色。 |
right | ColorHSL | 插值区间右端的颜色,即position = 1对应的颜色。 |
函数在 fast-colors.md 函数总表 中与interpolateHSV、interpolateLAB、interpolateLCH、interpolateRGB、interpolateXYZ并列出现,它们是同一套"按指定色彩空间插值"族 API 中的 HSL 实现。
前置类型:ColorHSL 类
interpolateHSL()的入参与返回值都是 ColorHSL 实例,因此必须先理解该类型。
构造与三个通道
依据 fast-colors.colorhsl.constructor.md,ColorHSL的构造函数为:
constructor(hue: number, sat: number, lum: number);对应三个公开属性(h、s、l):
| 属性 | 含义 | 取值范围说明 |
|---|---|---|
h | 色相(Hue) | ColorHSL 类文档 明确说明:本实现使用度数格式,范围[0, 360]。部分其他库改用弧度或归一化 Hue([0, 1]),跨库比对值时务必注意换算。 |
s | 饱和度(Saturation) | 即sat,一般取值[0, 1](百分比小数形式)。 |
l | 亮度(Lightness) | 即lum,一般取值[0, 1]。 |
常用实例方法
ColorHSL 类文档 列出了以下成员,便于插值结果的后处理:
equalValue(rhs: ColorHSL): boolean—— 判断两个 HSL 颜色是否相等(详情);roundToPrecision(precision: number): ColorHSL—— 返回按指定精度取整后的新ColorHSL(详情);static fromObject(data): ColorHSL | null—— 从配置对象构造实例(详情);toObject()—— 将实例格式化为对象(详情)。
HSL 插值的工作原理
interpolateHSL()的"插值"本质上是把position线性映射到left → right的各个通道之间。虽然本仓库未包含 1.x fast-colors 的 TypeScript 源码实现,但可以从同包 API 文档中还原其算法骨架:
1. 线性插值基元 lerp()
lerp() 函数文档 给出了通用的线性插值基元:
export declare function lerp(i: number, min: number, max: number): number;数学上等价于min + (max - min) * i。interpolateHSL()的position参数正是传入的i,饱和度s与亮度l两个通道可直接用该公式逐通道插值。
2. 色相通道的角度插值 lerpAnglesInDegrees()
色相通道不能简单套用普通lerp:Hue 是环形角度(0° 与 360° 相邻),若左端为 350°、右端为 10°,直接线性插值会绕远路穿过整个色轮。为此同包提供了角度专用基元 lerpAnglesInDegrees(i, min, max),此外还有弧度版本 lerpAnglesInRadians(均在 fast-colors.md 函数总表 中登记)。从函数命名与 ColorHSL 的"Hue 使用度数"约定 可以推断:interpolateHSL()在内部对h通道走最短弧线方向插值,对s、l通道做普通线性插值——这也是该函数被称为"Interpolate by HSL color space"的关键实现细节。
3. 边界行为
position = 0时返回与left等价的颜色;position = 1时返回与right等价的颜色(严格意义上是逐通道插值结果,可通过ColorHSL.equalValue()校验);position超出[0, 1]时可实现"外推"效果,但生产环境中建议将其clamp到区间内——同包提供了 clamp(i, min, max) 工具;- 结果精度受浮点运算影响,若需稳定输出,可链式调用
roundToPrecision(precision)。
实战用法
基础示例:红到蓝的渐变中点
import { ColorHSL, interpolateHSL, hslToRGB } from "@microsoft/fast-colors"; // 红色 HSL(hue=0) const red = new ColorHSL(0, 1, 0.5); // 蓝色 HSL(hue=240) const blue = new ColorHSL(240, 1, 0.5); // 取红蓝渐变的中点色:紫(hue=120) const mid = interpolateHSL(0.5, red, blue); // 若需要输出为可渲染的 RGBA,用 hslToRGB 转换 const midRGB = hslToRGB(mid); // ColorRGBA64 console.log(mid.toObject()); // { h: 120, s: 1, l: 0.5 }其中 hslToRGB(hsl, alpha?) 将ColorHSL转回 ColorRGBA64,使插值结果可直接用于 Canvas 或 WebGL 渲染;反向转换则由 rgbToHSL(rgb) 完成(注意:其 alpha 通道会被忽略,见 fast-colors.rgbtohsl.md 的 Remarks)。
示例:生成一段连续色阶(ramp)
function buildHSLSteps(left: ColorHSL, right: ColorHSL, steps: number): ColorHSL[] { const result: ColorHSL[] = []; for (let i = 0; i <= steps; i++) { const position = i / steps; // 0 … 1 const c = interpolateHSL(position, left, right); result.push(c.roundToPrecision(3)); // 稳定精度后输出 } return result; }该模式在色板生成场景中很常见:steps越大,输出色阶越平滑。这也是 fast-colors.md 中rescale、centeredRescale等调色板工具在底层依赖插值函数的原因——从源码结构看,它们都是"定义锚点色 → 在锚点间逐段插值"的更高层抽象。
与相关 API 的协同与对比
按枚举统一调度:interpolateByColorSpace()
如果希望用一个入口按不同色彩空间插值,可使用 interpolateByColorSpace():
export declare function interpolateByColorSpace( position: number, space: ColorInterpolationSpace, left: ColorRGBA64, right: ColorRGBA64 ): ColorRGBA64;它的入参是通用的ColorRGBA64(而非各空间的专用类型),通过 ColorInterpolationSpace 枚举 指定插值空间,枚举成员与数值如下:
| 成员 | 值 |
|---|---|
RGB | 0 |
HSL | 1 |
HSV | 2 |
XYZ | 3 |
LAB | 4 |
LCH | 5 |
可以看到HSL = 1,即interpolateByColorSpace(position, ColorInterpolationSpace.HSL, left, right)内部等价于hslToRGB(interpolateHSL(position, rgbToHSL(left), rgbToHSL(right)))的组合调用——这是interpolateHSL()在统一调度 API 中的接入方式。
同族插值函数一览
在 fast-colors.md 函数总表 中,与该函数同族的还包括:
- interpolateHSV(position, left, right) —— HSV 空间插值,Hue 同样使用度数格式(见 ColorHSV 类文档);
- interpolateLAB(position, left, right) —— CIELAB 空间插值,基于 D65 2° 标准观察者常量(见 ColorLAB 类文档);
- interpolateLCH(position, left, right) —— CIELCH 空间插值,LAB 的圆柱表示(见 ColorLCH 类文档);
- interpolateRGB(position, left, right) —— RGB 空间插值;
- interpolateXYZ(position, left, right) —— XYZ 空间插值。
选择建议
不同色彩空间的插值路径差异显著:
- HSL 插值的优势在于通道直观:色相绕环走最短弧、饱和度与亮度独立线性变化,非常契合"控制色相渐变方向"或"保持某个通道恒定"的设计意图;
- 若追求感知均匀的渐变(相邻色阶人眼亮度变化更平滑),LAB/LCH 插值通常是更优选择(LAB 本身即感知均匀色彩空间);
- RGB 插值则最接近浏览器默认的
transition行为,实现成本最低但易出现"中间发灰"。
具体选型应结合设计目标与视觉验收结果,interpolateHSL()的价值正在于提供"明确、可控、按度数约定的 HSL 路径"。
注意事项小结
- Hue 单位是度数:所有入参
ColorHSL的h通道必须使用[0, 360]度数,与使用弧度或归一化 Hue 的第三方库混用时需先换算,这是 ColorHSL 类文档 中反复强调的兼容性陷阱; - alpha 不参与 HSL 插值:HSL 模型不含透明度通道,需要带 alpha 的渐变时应使用
hslToRGB(hsl, alpha)或走 RGB/RGBA 插值路径; - 结果精度:浮点插值可能产生长尾小数,推荐用
roundToPrecision(precision)收敛,或直接用 lerpAnglesInDegrees / lerp 自行组装精确可控的自定义插值逻辑; - 文档定位:本函数属于 1.x API 文档体系(API 总览),在引入新版 fast 包时请以对应版本的包文档为准,函数签名如有变化以该版本实际导出为准。
相关文档索引
- fast-colors 模块总览
- interpolateHSL 官方 API 文档(本文主体)
- ColorHSL 类 | 构造函数
- lerp() | lerpAnglesInDegrees()
- interpolateByColorSpace() | ColorInterpolationSpace 枚举
- rgbToHSL() | hslToRGB()
- 前端
- UI组件
【免费下载链接】fast
The adaptive interface system for modern web experiences.
相关推荐
FAST Colors 的 interpolateLCH() 深度解析:基于 LCH 色彩空间的颜色插值函数实战指南
FAST Colors 的 interpolateLCH 深度解析:基于 LCH 色彩空间的颜色插值函数实战指南 本文以 FAST( @microsoft/fa
前端UI组件FAST 的 `@microsoft/fast-colors` desaturateViaLCH() 函数详解:基于 LCH 色彩空间的颜色去饱和
FAST 的 @microsoft/fast colors desaturateViaLCH 函数详解:基于 LCH 色彩空间的颜色去饱和 desaturate
前端UI组件Microsoft FAST 中 @microsoft/fast-colors 的 rgbToHSL() 函数详解:RGB 到 HSL 色彩空间转换的完整指南
Microsoft FAST 中 @microsoft/fast colors 的 rgbToHSL 函数详解:RGB 到 HSL 色彩空间转换的完整指南 本文
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考