hex和rgb色值转换-色彩加深减淡

我们在做主题订制的时候,一般都会选一种主题色,该颜色以主题色为主导,颜色依次变浅,用于做主题色下的关联色统一,例如文字激活、激活的背景色、菜单背景色等

在项目中主题色的应用: 如果你在项目中允许用户自定义主题,那么我们就需要计算出用户自定义的主题,并且为主题分档,最后生成的效果如下:

我们对颜色进行加深减淡就是通过更改rgb的色值来实现的,先将hex转换rgb色值,然后对色值系数进行调整来实现。 1、hexrgb 2、调整rgb系数实现加深减淡 3、rgbhex


hex转rgb

先接收色值,例如:#409EFF 将色值转换为rgb模式,在这里用到了正则匹配和parseInt 在正则中 . 标识匹配除换行外的任意字符,这里两个一组进行匹配,/g标识全部匹配,match会返回匹配成功的数组 parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix2-36 之间的整数,表示被解析字符串的基数。 在这里parseInt指定 16 表示被解析值是十六进制数,返回10进制数 参考:parseInt

javascript 复制代码
/**
  * hex转rgb
  * @param {string} str  色值,如:#409EFF
  * @returns rgb数组[64, 158, 255]
  */
const hexToRgb = (str) => {
    let hexs = null;
    let reg = /^\#?[0-9A-Fa-f]{6}$/;
    if (!reg.test(str))  return alert('色值不正确')
    str = str.replace('#', '') // 去掉#
    hexs = str.match(/../g) // 切割成数组 409EFF => ['40','9E','FF']
    // 将切割的色值转换为16进制
    for (let i = 0; i < hexs.length; i++) hexs[i] = parseInt(hexs[i], 16)
    return hexs  // 返回rgb色值[64, 158, 255]
}

色值变浅

颜色变浅的原理:rgb0~255是暗到亮的过程,0是最暗,255是最亮 对rgb的色值调大即可让颜色变量,便亮就是减淡的过程

通过代码实现:

javascript 复制代码
/**
  * 颜色减淡
  * @param {string} color  色值,如:##409EFF
  * @param {number} level 调整幅度,0~1之间
  * @returns {array} 最终颜色减淡的rgb数组
  */
const getLightColor = (color, level) => {
    let reg = /^\#?[0-9A-Fa-f]{6}$/;
    if (!reg.test(color)) return alert('色值不正确')
    let rgb = hexToRgb(color);
    // 循环对色值进行调整
    for(let i = 0 ; i < 3 ; i++){
        rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]) // 始终保持在0-255之间
    }
    return rgb  // [159, 206, 255]
}
getLightColor('#409EFF',0.5)

在循环中调整每个rgb的色值,调整的色值不能超过255,公式: 色彩最大值 - 原本值 = 可调整幅度 可调整幅度 * 涨幅 + 原本的值 = 最终变浅的值 在上面的代码中:Math.floor((255 - rgb[i]) * level + rgb[i])

javascript 复制代码
(255 - 100) * 0.5 + 100 = 177.5  
// 始终保持在0-255之间,调整幅度0.5

色值变暗

rgb值调小就是变暗的过程,颜色变暗是对色值本身进行调整,范围0~2550表示黑色,255表示白色 公式:本身值 - 本身值 * 调整幅度 = 最终值

javascript 复制代码
/**
  * 颜色加深
  * @param {string} color  色值,如:##409EFF
  * @param {number} level 调整幅度,0~1之间
  * @returns 最终颜色加深的rgb数组
  */
const getDarkColor = (color, level) => {
    let reg = /^\#?[0-9A-Fa-f]{6}$/;
    if (!reg.test(color)) return alert('色值不正确')
    let rgb = hexToRgb(color);
    for(let i = 0 ; i < 3 ; i++){
        rgb[i] = Math.floor(rgb[i] - (rgb[i] * level)) // 始终保持在0-255之间
    }
    return rgb  // [32, 79, 127]
}

rgb转hex色值

在这里通过toString实现rgbhex,对于 Number 值,toString 方法返回数字值指定基数的字符串表示。 参考:toString

javascript 复制代码
/**
  * rgb转hex
  * @param {number} r 红色色值,如:64
  * @param {number} g 绿色色值,如:158
  * @param {number} b 蓝色色值,如:255
  * @returns 最终rgb转hex的值,如:64,158,255 -> #409EFF
  */
const rgbToHex = (r,g,b) => {
  let reg = /^\d{1,3}$/;  // 限定1-3位 -> 0~255
  if(!reg.test(r) || !reg.test(g) || !reg.test(b)) return alert('色值不正确')
  let hex =[r.toString(16), g.toString(16), b.toString(16)]
  // 转换的值如果只有一位则补0
  for(let i = 0 ; i < 3 ; i++){
      if(hex[i].length === 1) hex[i] = `0${hex[i]}`
  }
  return `#${hex.join('')}` // #409eff
}
rgbToHex(64,158,255)

颜色分档

可以通过遍历将颜色由浓变淡,修改颜色是以系数生成的,系数0 ~ 1 这里起始下标为1,结束下标为9,避免了系数的 01,如果系数是0则会生成黑色,1会生成白色

javascript 复制代码
  // 1~9避免最暗和最亮,0最暗(黑),10最亮(白)
  // 1~9避免最暗和最亮,0最暗(黑),10最亮(白)
  for (let i = 1; i <= 9; i++) {
    let light = getLightColor(theme, i / 10)
    // 可以通过遍历将颜色分为9档
  }

如果你觉得本文章不错,欢迎点赞👍、收藏💖、转发✨哦~ 阅读其它: Git提交规范 微信小程序动态生成表单来啦!你再也不需要手写表单了! 微信小程序用户隐私API 所见即所得的动画效果:Animate.css 前端换肤,聊一聊主题切换那些事

相关推荐
墨渊君13 分钟前
“蒙”出花样!用 CSS Mask 实现丝滑视觉魔法
前端·css
huabuyu43 分钟前
基于 React + MarkdownIt 的 Markdown 渲染器实践:支持地图标签和长按复制
前端
芦苇Z1 小时前
HTML <a> 标签的 rel 属性全解析:安全、隐私与 SEO 最佳实践
前端·html
在这儿不行1 小时前
Android 15边到边模式
前端
源猿人1 小时前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化
红红大虾1 小时前
Defold引擎中关于CollectionProxy的使用
前端·游戏开发
最后一个农民工1 小时前
vue3实现仿豆包模版式智能输入框
前端·vue.js
RoyLin1 小时前
TypeScript设计模式:迭代器模式
javascript·后端·node.js
xw52 小时前
uni-app中v-if使用”异常”
前端·uni-app