在LESS变量中追加字符串

时间:2015-01-29 13:07:17

标签: css less mixins

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

由于最终css代码的完整性,我想通过help变量来实现,在哪里可以存储特殊代码的类。

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

.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吗?

任何建议都是有帮助的。

1 个答案:

答案 0 :(得分:2)

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

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

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

选项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混合,因此我们使用虚拟类。这不应该是一个大问题,因为它只是添加了一行来输出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;
}