我正在尝试做一个mixin,它可以检测是显示深色文本(如果传入buttonStyles
的颜色是浅色)还是浅色文本(用于传递深色)。我记得有一种方法可以用LESS来完成,我想知道是否有一种SASS方法。
考虑以下SCSS:
$white: #fff;
$text: #393939;
$font-std: 18px;
$transition-std: 0.4s ease all;
$primary: #f8e421;
$secondary: #354052;
@mixin buttonStyles($color) {
font-size: $font-std;
color: $text;
padding: 1rem 3rem;
background-color: $color;
color: $white;
transition: $transition-std;
&:hover {
cursor: pointer;
background-color: lighten($color, 15%);
}
&:focus {
background-color: lighten($color, 10%);
}
&:active {
background-color: lighten($color, 25%);
}
}
.btnPrimary {
@include buttonStyles($primary);
}
.btnSecondary {
@include buttonStyles($secondary);
}
还有这个html:
<button class='btnSecondary'>secondary</button>
<button class='btnPrimary'>primary</button>
第二个按钮比第一个按钮更清晰。我知道我可以传递第二个参数来设置文本颜色,但我想知道是否有一个更干净的,自动的方法,因为使用LESS?(不幸的是,我不记得使用LESS是如何完成的)
实时演示:https://jsfiddle.net/3v0ckeq9/5/
谢谢
编辑:
我已经添加了这个函数,几乎看起来工作:
@function ligthOrDark($color) {
$result: red;
@if (blackness($color) == 50) { // fails with > 50 or < 50
$result: green;
}
@return $result;
}
但问题是,当试图确定颜色是否大于50(或小于50)时,SASS会抱怨,但使用==
是可以的。我只想能够确定提供的颜色是深还是浅,这样我就可以应用正确的文本颜色。
似乎应该有选项来确定黑暗或光明在这里:https://sass-lang.com/documentation/modules/color#grayscale
欢迎其他解决办法。
2条答案
按热度按时间rjjhvcjd1#
根据文档,
whiteness
和blackness
与HWB color model相关。如果您可以使用HSL模型,则lightness
可按如下方式使用:编译后,它看起来像这样:jsfiddle
x一个一个一个一个x一个一个二个x
我不明白为什么HWB
whiteness
和blackness
不能与HSLlightness
这样的数字进行比较,但有可能不使用这些函数也能得到它们,因为公式很简单:您可以使用红色($color)和
min
max
函数。单独使用
whitness
、blackness
和lightness
对于某些颜色是不够的。我认为您需要的是相对亮度,以获得最强的对比度。白色的亮度为1,黑色的亮度为0。黑灰对比度比白灰对比度高。要了解更多信息,请了解此网站是如何计算对比度的。可选参数您可以通过定义参数的默认值使参数可选。在我们的示例中,任何非颜色值都可以:
flmtquvp2#
我添加了另一个解决方案。要查看它的运行:https://jsfiddle.net/gu2r4jqk/7/