这是计算两种颜色的色相、饱和度和亮度值之间的差异,然后用它根据第一种颜色计算第二种颜色的方法。
各个步骤如下:
-
色差计算:使用以下公式计算两种给定颜色之间的色相、饱和度和亮度差异
hue()
, saturation()
and lightness()
功能。这个函数可以单独使用,只是单独输出差异。
-
Arriving at the secondary color based on primary: This is a three step process and they are as follows:
- 使用 调整原色的色调
spin()
通过传递两种颜色之间的色调差异来实现功能
- 通过使用调整色调调整颜色(来自上一步)的饱和度
saturate()
or desaturate()
功能取决于差异。
- 使用 调整饱和度调整颜色的亮度(来自上一步)
darken()
or lighten()
功能取决于差异。
这个答案是对此的较少改编SASS文章 http://thesassway.com/advanced/how-to-programtically-go-from-one-color-to-another-in-sass关于如何从一种颜色计算另一种颜色。
@primary: rgb(0,100,60); /* primary color */
@secondary: rgb(185,215,50); /* secondary color */
/* mixin to calculate the difference between two given colors */
.color-diff(@color1; @color2){
@hueDiff: hue(@color2) - hue(@color1);
@saturationDiff: saturation(@color1) - saturation(@color2);
@lightnessDiff: lightness(@color1)- lightness(@color2);
color1: @color1; color2:@color2; /* just for testing, can be removed */
}
/* Step 1: mixin to adjust the hue difference between the colors */
.adjust-hue(@color; @diff){
@hueAdjusted: spin(@color, @hueDiff);
}
/* Step 2: mixin to adjust the saturation difference */
.adjust-saturation(@color; @diff) when (@diff > 0){
@satAdjusted: desaturate(@color, abs(@diff)); /* desaturate if diff is greater than 0 */
}
.adjust-saturation(@color; @diff) when not (@diff > 0){
@satAdjusted: saturate(@color, abs(@diff)); /* saturate if diff is not greater than 0 */
}
/* Step 3: mixin to adjust the lightness diff between the colors */
.adjust-lightness(@color; @diff) when (@diff > 0){
@lightnessAdjusted: darken(@color, abs(@diff)); /* darken if diff is greater than 0 */
}
.adjust-lightness(@color; @diff) when not (@diff > 0){
@lightnessAdjusted: lighten(@color, abs(@diff)); /* else lighten */
}
div{
.color-diff(@primary; @secondary);
.adjust-hue(@primary; @hueDiff);
.adjust-saturation(@hueAdjusted; @saturationDiff);
.adjust-lightness(@satAdjusted; @lightnessDiff);
color: @lightnessAdjusted; /* final output value */
}
编译后的CSS:
div {
color1: #00643c;
color2: #b9d732;
color: #b9d732;
}
如果您只想获得两种颜色之间的差异,那么您可以使用如下所示的循环来输出色调、饱和度和亮度值的差异。
@color-list-1: rgb(0,100,60), #B0BCA7, #ABCDEF; /* list of primary colors */
@color-list-2: rgb(185,215,50), #BADA55, #FEDCBA; /* list of secondary colors */
#output{
.loop-colors(@index) when (@index > 0){
@primary: extract(@color-list-1, @index);
@secondary: extract(@color-list-2, @index);
.color-diff(@primary; @secondary);
/* output the values of the comparison */
color-comparison-@{index}+: ~"Hue Difference: @{hueDiff}";
color-comparison-@{index}+: ~"Saturation Difference: @{saturationDiff}";
color-comparison-@{index}+: ~"Lightness Difference: @{lightnessDiff}";
.loop-colors(@index - 1);
}
.loop-colors(length(@color-list-1));
}
上面的代码将比较两个列表中的相应值并输出它们的差异,如下所示:
#output {
color-comparison-3: Hue Difference: -180, Saturation Difference: -29.142857142857153%, Lightness Difference: -5.882352941176478%;
color-comparison-2: Hue Difference: -19.849624060150404, Saturation Difference: -50.70282063269439%, Lightness Difference: 10.196078431372548%;
color-comparison-1: Hue Difference: -85.09090909090908, Saturation Difference: 32.65306122448979%, Lightness Difference: -32.352941176470594%;
}