【发布时间】:2015-10-22 20:01:05
【问题描述】:
我正在构建一个 LESS 文件,其中包含在我们的项目中使用的颜色变量列表。这些颜色中的大多数都是简单的颜色(红色、蓝色......),但我希望其中一些颜色可以自动从其他颜色“计算”出来。例如,我制作了一个 mixin 来自动创建一种从另一种颜色中“脱颖而出”的颜色。按照 LESS 文档,我通过在 mixin 中定义一个新变量来“模拟”一个返回值,以便接下来可以使用它。
.stand-out-color(@baseColor, @rate) when (lightness(@baseColor) >= 50%) {
@standOutColor: darken(@baseColor, @rate);
}
.stand-out-color(@baseColor, @rate) when (lightness(@baseColor) < 50%) {
@standOutColor: lighten(@baseColor, @rate);
}
.stand-out-color(red, 10%);
@my-first-color: @standOutColor; // A slightly different red, perfect
.stand-out-color(blue, 10%);
@my-second-color: @standOutColor; // The same slightly different red, not the blue I expected
不幸的是,返回值是在第一次调用之后写入的,之后就再也没有改变过。 再次阅读文档后,我得到了这一部分:“只有一个例外,如果调用者包含同名的变量(包括另一个 mixin 调用定义的变量),则不会复制变量。”
所以它可以正常工作,但我不知道如何实现我想要的,这是一个我可以在同一范围内多次调用的函数。当我定义一个全局变量列表时,我认为我不能使用范围来避免这种行为。 还有其他方法可以实现吗?
【问题讨论】:
-
首先发现
contrast函数(即你并不需要这样的mixin)。除此之外,通常你可以用& {...}隔离每个“调用”,但是是的,如果你打算使用这样的mixin 来定义全局变量,它就行不通了。所以functionsplugin 来救援了。 -
初读时我并不理解
contrast函数,但它确实满足了我的需求。我最初的目标有点冗长(我必须重复“逻辑”),但它有效。非常感谢! -
“逻辑”(假设调整值例如
10%或darken/lighten(@original-color, ...)颜色本身总是可以移动到单独的变量以避免重复。
标签: less