通过一个颜色计算出一个更浅的颜色
关于
愉快的周一喜提新需求:
通过色板让用户自定义主题色,为区分主次,侧栏颜色相对顶栏较浅就可以。
刚听到消息我的一脸懵 B,还能这么搞 😒,搞个色板上去,人人都是艺术家吗?
但是没有办法,谁让咱是打工人呢~
解决方法
一开始想,这个需求听上去很高大上,但是不就是想要颜色浅一点吗,把透明度调低一点不就好了。
想法很美好,实现起来也很简单。
但是不得不面对一个现实的问题:如果底色不是白色怎么办???
想想,这个方法也就不是很贴合实际了。
lighten
后来想到 HEX 值不是十六进制的吗,我在这个基础上加上几位,色值不就改变了。
只要控制好尺度,色差就不会太大。
想法是美好的,但是实现起来却是要技术的。
我也不会进制转换啊!!!到头来还是得靠百度过活。
搜索半天发现,scss
提供了一个方法 lighten()
,可以根据提供的颜色和百分比获得一个更浅的颜色。
但是这也不能因为一个功能安装个 scss
啊!后来在 stack overflow 找到一篇帖子,使用 js 模拟出了 lighten
功能(咱也没用过 lighten
咱也不知道正不正宗,但是),感谢解决我的问题!
代码块:
js
const lighten = (color, lighten) => {
const c = color.replace('#', '') // 去除 # 号
// 取值
let rgb = [
parseInt(c.substr(0, 2), 16),
parseInt(c.substr(2, 2), 16),
parseInt(c.substr(4, 2), 16)
]
let returnstatement = '#' // 添加 # 号
// 改变色值
rgb.forEach(color => {
returnstatement += Math.round(
(255 - color) * (1 - Math.pow(Math.E, -lighten)) + color
).toString(16)
})
return returnstatement
}
简单理解,大体就是上面解释的样子,把颜色值抽出来,根据一定比例加减。
filter
其实一开始也找到了另外一篇帖子,可以使用 CSS filter
来在这个色值基础上加减亮度,但是效果没有 lighten
那么好控制,但是用法相对简单很多。可以根据项目需求选择不同的实现方法。
代码块:
css
.box {
background: pink;
filter: brightness(110%);
}
综上,感谢各位大神提出的解决方法。