【问题标题】:Append string in LESS variable在 LESS 变量中附加字符串
【发布时间】:2015-01-29 13:07:16
【问题描述】:

我想用一些颜色动态调用 .some-mixin()。这个mixins应该会生成一些样式,当颜色相等时应该生成特殊代码。

由于最终css代码的comprimation我想通过帮助变量来完成,我可以在哪里存储特殊代码的类。

也许示例代码会更有帮助:

.some-mixin(@newClass,@color,@color2){
      .test-mixin(@newClass,@color,@color2);
      .@{newClass}{
         color: @color;
      }
}

@classes: '';
.test-mixin(@newClass,@color,@color2) when (@color = @color2){
    @classes: "@{classes}, @{newClass}";
}
.final-mixin(){
    .@{classes}{
        /*some styles*/
    }
}

mixins的调用是由PHP生成的,最终代码应该是这样的:

.some-mixin("abc",#ffffff,#000000);
.some-mixin("xyz",#ffffff,#ffffff);
.some-mixin("jkl",#ff00ff,#ff00ff);
.final-mixin();

但是当我想编译 LESS 时,它会显示 infinite loop detected

这在 LESS 中可行吗?

任何建议都会有所帮助。

【问题讨论】:

  • 哦,对不起,我有with而不是when。现在它应该是完全 LESS 代码了。
  • 不只是那个伙伴。带有$ 的变量。我以前从未见过它们在 Less 中使用过。如果我纠正所有这些,mixin 和调用工作得很好(使用lesstester.com 编译时)
  • 是的,我很蠢什么的。它是 PHP 的变形 :)
  • .test-mixin.final-mixin 似乎是可以使用extend 函数的情况。也许除了您当前的代码之外,您还可以解释一下您的原始要求是什么?看看是否有更好的方法可能会有所帮助。
  • 好的,现在我明白你为什么收到infinite loop 消息了。您不能在 Less 中执行 @classes: "@{classes}, @{newClass}";(除非使用一些技巧)。它是一个递归变量定义。

标签: css less mixins


【解决方案1】:

正如 cmets 中所解释的,您的问题是下一行中的递归变量定义。如this answerthis one 中所述,Less 不支持此功能。

@classes: "@{classes}, @{newClass}";

根据您在 cmets 中的要求说明(颜色不同时会有一些额外的填充等),您可以使用以下方法之一。

选项 1:(将填充添加到每个类,因此重复代码)

.some-mixin(@newClass,@color,@color2){
      .@{newClass}{
         color: @color;
         & when not (@color = @color2){
            padding: 4px;
        }
      }
}

.some-mixin(abc,#ffffff,#000000);
.some-mixin(xyz,#ffffff,#ffffff);
.some-mixin(jkl,#ff00f0,#ff00ff);

上面的 Less 会编译成下面的 CSS:

.abc { 
  color: #ffffff;
  padding: 4px; /* colors were different */
}
.xyz {
  color: #ffffff;
}
.jkl {
  color: #ff00f0;
  padding: 4px; /* colors were different */
}

选项 2:(使用虚拟类 + 扩展等较少的代码)

此选项可能是您正在寻找的,因为它可以避免代码重复。我们不能 extend 一个 mixin,因此我们使用一个虚拟类。这不应该是一个大问题,因为它只是在输出 CSS 中增加了一行。

.common-padding-diff-color{ /* all styles that are needed when colors are different */
    padding: 4px;
}
.some-mixin(@newClass,@color,@color2){
      .@{newClass}{
         color: @color;
         & when not (@color = @color2){
            &:extend(.common-padding-diff-color);
        }
      }
}

.some-mixin(abc,#ffffff,#000000);
.some-mixin(xyz,#ffffff,#ffffff);
.some-mixin(jkl,#ff00f0,#ff00ff);

这会编译成

.common-padding-diff-color,
.abc,
.jkl {
  padding: 4px; /* style applied for all cases where colors are not same */
}
.abc {
  color: #ffffff;
}
.xyz {
  color: #ffffff;
}
.jkl {
  color: #ff00f0;
}

【讨论】:

  • @DzeryCZ:很高兴能帮上忙。如果您没有疑虑,请将答案标记为已接受(点击投票区域下方的空心对勾)。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 2016-07-14
  • 2015-06-19
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多