【问题标题】:In LESS CSS, is it possible to use a namespaced variable in a call to another mixin?在 LESS CSS 中,是否可以在调用另一个 mixin 时使用命名空间变量?
【发布时间】:2012-10-17 21:18:10
【问题描述】:

在 LESS CSS 中,是否可以在调用另一个 mixin 时使用命名空间变量或作为另一个 mixin 的默认值?使用普通语法,似乎没有,但是有没有转义序列或其他语法可以用来实现我正在寻找的效果?

我正在考虑这样的代码:

#namespace {
    @nsColor: #333;
}

.testMixin1(@mixinColor) {
    background-color: @mixinColor;
}

.selector { .testMixin1(#namespace > @nsColor); } 

或者……

.testMixin2(@anotherMixinColor: #myNamespace > @myColor) {
    background-color: @anotherMixinColor;
}

否则,这会严重限制命名空间的实用性。这就像能够将变量放在对象范围内,但只能将全局范围内的变量作为参数传递给函数。基本上,这似乎消除了命名空间 90% 的效用。

【问题讨论】:

  • 我同意这种观点 - less 中的一些架构决策令人惊讶.. 考虑到它是用一种语言编写的,这似乎很有价值并且(你会认为)超级容易实现对范围一丝不苟。

标签: css namespaces less mixins


【解决方案1】:

新答案:使用 Guard 表达式检查扩展您的 Mixin

据我了解,您希望命名空间能够用作默认值,但根本不会进入全局范围。我认为你需要像这样扩展你的 mixin 定义:

#namespace {
    @nsColor: #333;
}


.testMixin1(@mixinColor: 'null') {
    .mixin (@a) when (iscolor(@a)) {
       background-color: @a;
    }
    .mixin (@a) when not (iscolor(@a)) {
       #namespace;
       background-color: @nsColor;
    }
    .mixin (@mixinColor);
}

然后调用不带值或带值:

.testMixin1();
.testMixin1(red);

输出(基于您是否设置值):

background-color: #333333;
background-color: #ff0000;

您仍然可以在命名空间中使用“getter”mixin,就像我最初提到的那样:

#namespace {
    .getNsColor(){@nsColor: #333;} <-- changed here
}  

.testMixin1(@mixinColor: 'null') {
    .mixin (@a) when (iscolor(@a)) {
       background-color: @a;
    }
    .mixin (@a) when not (iscolor(@a)) {
       #namespace > .getNsColor();  <-- changed here
       background-color: @nsColor;
    }
    .mixin (@mixinColor);
}

原答案:将变量捆绑到 Mixin 中

如果您将变量捆绑到 mixin 本身,那么您可以访问它。所以...

#namespace {
    .getNsColor() {@nsColor: #333;}
}

.testMixin1(@mixinColor) {
    background-color: @mixinColor;
}

然后要么包含它...

一个:全球

#namespace > .getNsColor;
.selector { 
  .testMixin1(@nsColor); 
}

或两个:本地

.selector { 
  #namespace > .getNsColor;
  .testMixin1(@nsColor); 
}

两者都会输出...

.selector {
  background-color: #333333;
}

【讨论】:

  • 这似乎并没有真正解决问题。它只是将相同的变量名称重新引入全局范围,在前一种情况下,在后一种情况下,它仍然不允许我将命名空间变量设置为我的默认值,以便在方法调用时被覆盖。
  • @NathanPiazza——我在你的问题中读到了这一行,“在调用另一个 mixin 时使用命名空间变量”,这就是我上面演示的内容。但是,我确实错过了这样一个事实,即您也在寻找一种方法将其设置为“或默认值”中的默认值。让我考虑一下。
  • @NathanPiazza——也许我的新答案可以满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多