闲言碎语少扯,就让咱们进入主题吧。Sass 内置了不少的方法,今天咱们主要讲一下颜色函数 (Color Functions) 里的 darken()
、lighten()
、mix()
、 lightness()
这 4 个方法。css
讲真的,之前项目开发中,我也只用过前两个方法~~浏览器
在讲这几个方法以前,咱们先来了解一下颜色的几个表示方法。sass
颜色的表示有不少种,本次咱们只讲如下 3 种函数
在 Chrome 浏览器的开发者工具里,咱们能够在这 3 种方式中相互切换,以下图:工具
在开发中,咱们常常使用 HEX 、RGB 法,可是不多使用 HSL 法,今天要讲的 Sass 颜色函数跟 HSL 有关,咱们来简单了解一下 HSL 。字体
HSL 是色相(Hue)、饱和度(Saturation)和亮度(Lightness)这三个颜色属性的简称。ui
下面要讲的函数跟亮度(Lightness)有很大的关系,你们提早知晓。关于 HSL 更详细的内容你们能够移步此处。spa
darken($color, $amount)
将颜色 $color
加深code
$mount
是介于 0%
到 100%
(含) 之间的值。按照这个值减小 $color
HSL 的亮度。regexp
// #036 的亮度为 20%, 当 darken() 减去 30% 会返回黑色
darken(#036, 30%); // black
复制代码
lighten($color, $amount)
将颜色 $color
变亮
$mount
是介于 0%
到 100%
(含) 之间的值。按照这个值增长 $color
HSL 的亮度。
// #e1d7d2 的亮度为 85%, 当 lighten() 增长 30% 会返回白色
lighten(#e1d7d2, 30%); // white
复制代码
mix($color1, $color2, $weight: 50%)
将颜色 $color1
与 $color2
混合在一块儿生成新的颜色
$weight
与透明度决定了每一个颜色在结果里占的比重。$weight
默认值为 50%
。取值范围是介于 0%
到 100%
(含) 之间的值。若是指定的比例是 25%
,这意味着第一个颜色所占比例为 25%
,第二个颜色所占比例为 75%
。
mix(#036, #d2e1dd); // #698aa2
mix(#036, #d2e1dd, 75%); // #355f84
mix(#036, #d2e1dd, 25%); // #9eb6bf
mix(rgba(242, 236, 228, 0.5), #6b717f); // rgba(141, 144, 152, 0.75)
复制代码
开发中应用
之前在开发中作一些颜色交互的时候,不一样状态的颜色值都须要由 UI 提供,可是有了上面的函数,咱们能够跟 UI 达成一致,自动生成对应的色值。
下面提供一张图片展现 mix()
、darken()
、lighten()
生成颜色的效果。
lightness($color)
返回给定颜色 $color
HSL 里的亮度值,返回值介于 0%
到 100%
。
lightness(#e1d7d2); // 85.2941176471%
lightness(#f2ece4); // 92.1568627451%
lightness(#dadbdf); // 86.4705882353%
复制代码
开发中应用
咱们能够经过这个方法来实现字体颜色根据背景色自动调整。
// sass
@function set-notification-text-color($color) {
@if (lightness($color) > 50) {
// 浅色背景返回深色字体
@return #333;
} @else {
// 深色背景返回浅色字体
@return #fff;
}
}
复制代码
分享几个颜色转换的方法。
rgbToHex (rgbStr) {
const color = rgbStr.toString().match(/\d+/g);
let hex = "#";
for (let i = 0; i < 3; i++) {
// 'Number.toString(16)' 是JS默认能实现转换成16进制数的方法.
// 若是结果是一位数,就在前面补零。例如: A变成0A
hex += ("0" + Number(color[i]).toString(16)).slice(-2);
}
return hex;
}
复制代码
hexToRgb (hex) {
let rgb = [];
//去除前缀 # 号
hex = hex.substr(1);
// 处理 "#abc" 成 "#aabbcc"
if (hex.length === 3) {
hex = hex.replace(/(.)/g, '$1$1');
}
hex.replace(/../g, function(color){
//按16进制将字符串转换为数字
rgb.push(parseInt(color, 0x10));
});
return "rgb(" + rgb.join(",") + ")";
}
复制代码
rgbToHsl (rgbStr) {
var color = rgbStr.toString().match(/\d+/g);
var r = color[0]/255;
var g = color[1]/255;
var b = color[2]/255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min){
h = s = 0; // achromatic
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
复制代码