【问题标题】:Calling a mixin with a return value twice in the same scope在同一范围内调用具有返回值的 mixin 两次
【发布时间】: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)。除此之外,通常你可以用&amp; {...} 隔离每个“调用”,但是是的,如果你打算使用这样的mixin 来定义全局变量,它就行不通了。所以functions plugin 来救援了。
  • 初读时我并不理解contrast 函数,但它确实满足了我的需求。我最初的目标有点冗长(我必须重复“逻辑”),但它有效。非常感谢!
  • “逻辑”(假设调整值例如10%darken/lighten(@original-color, ...)颜色本身总是可以移动到单独的变量以避免重复。

标签: less


【解决方案1】:

感谢 seven-phases-max 对我的问题的评论,这是解决方案。它解决了我最初的问题,即我需要根据另一个变量计算稍微更暗/更亮的颜色变量。

LESS 的 contrast 函数解决了我的问题,让我可以根据颜色是“深”还是“浅”来指定采用哪种颜色。

应用于我的示例:

@my-first-color: contrast(@original-color, darken(@original-color, 10%), lighten(@original-color, 10%));

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多