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 前端换肤,聊一聊主题切换那些事

相关推荐
翻滚吧键盘29 分钟前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL1 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl021 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang1 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景1 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼1 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js
蓝婷儿1 小时前
每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
前端
百锦再1 小时前
Vue中对象赋值问题:对象引用被保留,仅部分属性被覆盖
前端·javascript·vue.js·vue·web·reactive·ref
jingling5552 小时前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架