riku
2025-07-04 d6e6f8b5b31e132e4597eb531168d3e88f3bda72
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//转化颜色
function getHexColor(values) {
  // 传的color须为字符串
  // var values = color
  //   .replace(/rgba?\(/, '')  // 把 "rgba(" 去掉,变成  "194, 7, 15, 1)"
  //   .replace(/\)/, '')         // 把 ")" 去掉,变成 "194, 7, 15, 1"
  //   .replace(/[\s+]/g, '')   // 把空格去掉,变成 "194,7,15,1"
  //   .split(',')                 // 变成数组 [194,7,15,1]
  var a = parseFloat(values[3] || 1), // values[3]是rgba中的a值,没有的话设置a为1,a可能为小数,所以用parseFloat函数
    r = Math.floor(a * parseInt(values[0]) + (1 - a) * 255), // 转换为16进制
    g = Math.floor(a * parseInt(values[1]) + (1 - a) * 255),
    b = Math.floor(a * parseInt(values[2]) + (1 - a) * 255);
  return (
    '#' +
    ('0' + r.toString(16)).slice(-2) + // 转换后的16进制可能为一位,比如 7 就转换为 7 , 15 转换为 f
    ('0' + g.toString(16)).slice(-2) + // 当为一位的时候就在前面加个 0,
    ('0' + b.toString(16)).slice(-2)
  ); // 若是为两位,加 0 后就变成了三位,所以要用 slice(-2) 截取后两位
}
 
//计算线性渐变的中间颜色值
function getColorBetweenTwoColors(colorA, colorB, ratio) {
  const r = Math.round((colorB[0] - colorA[0]) * ratio + colorA[0]);
  const g = Math.round((colorB[1] - colorA[1]) * ratio + colorA[1]);
  const b = Math.round((colorB[2] - colorA[2]) * ratio + colorA[2]);
 
  return getHexColor([r, g, b, 1]);
}
 
export { getHexColor, getColorBetweenTwoColors };