45

假设我在网站的各个页面上使用了三种不同的配色方案。每种颜色都定义了浅色、中色和深色,配色方案由正文中的一个类定义。假设“红色”配色方案是默认设置。像这样:

颜色定义

@red-lt:   #121;
@red-md:   #232;
@red-dk:   #343;
@green-lt: #454;
@green-md: #565;
@green-dk: #676;
@blue-lt:  #787;
@blue-md:  #898;
@blue-dk:  #909;

基本默认样式示例

body { background-color: @red-dk;
  #container { background-color: @red-md;
     p { color: @red-dk; }
  }
}

不同配色方案样式示例

body.green { background-color: @green-dk;
  #container { background-color: @green-md;
     p { color: @green-dk; }
  }
}

我想使用变量,这样我就不必为每个方案重新编写所有颜色变化,这样我就可以编写如下内容:

body.[color-var] { background-color: @[color-var]-dk;
  #container { background-color: @[color-var]-md;
     p { color: @[color-var]-dk; }
  }
}

......但我不能完全围绕如何实现这一点。帮助…?

4

5 回答 5

80

使用插值转义,选择器中的括号和参数混合来获得所需的效果:

  • 动态变量插值:在一个字符串中,被"@{variable}"替换为变量的值。它们也可以嵌套:给定@{@{var}-foo}and @var: bar;,结果是"barfoo"
    结果值被引用。要删除这些引号,请添加前缀~
  • 通过Selector 插值的动态选择器:body.@{var}变成body.bar.

例子:

@red-md:   #232;
@red-dk:   #343;

.setColor(@color) {
    body.@{color} { background-color: ~"@{@{color}-dk}";
        #container { background-color: ~"@{@{color}-md}";
         p { color: ~"@{@{color}-md}"; }
      }
    }
}
.setColor(~"red"); // Escape to prevent "red" turning "#FF0000"
//.setColor(~"blue"); etc..

变成:

body.red {
  background-color: #334433;
}
body.red #container {
  background-color: #223322;
}
body.red #container p {
  color: #223322;
}

注意:最初写答案时,选择器插值不存在。如果您使用的是旧的 LESS 编译器(在 LESS 1.3.1a 之前),请参阅解决方案的先前版本。LESS 1.4.0 将放弃对旧方法的支持。

于 2012-06-25T22:35:00.923 回答
8

如果这些值真的遵循这样的可预测格式,那么参数 mixin似乎是一个完美的案例:

较少的:

@red:   #232;
@green: #565;
@blue:  #898;


.theme (@color) {
  background-color: @color - #111;
  #container {
    background-color: @color;
    p { color: @color + #111; }
  }
}

body.red {
  .theme(@red);
}

编译的CSS:

body.red{background-color:#112211;}
body.red #container{background-color:#223322;}
body.red #container p{color:#334433;}
于 2012-06-25T23:35:23.847 回答
5

我知道这个问题已经很老了,但是对于那些来到这篇文章的人来说,我的回答可能会有所帮助

我不太确定你想用什么,但我的建议之一是基于@ScottS 的回答。在我的现实世界中,我需要创建一个网络应用程序,它会显示几个品牌,每个品牌都有自己的文字颜色、背景等......所以我开始在 LESS 中寻找一种方法来完成这个,我可以在 SASS 上轻松完成,结果如下:

较少的

// Code from Seven Phase Max
// ............................................................
// .for
.for(@i, @n) {.-each(@i)}
.for(@n)     when (isnumber(@n)) {.for(1, @n)}
.for(@i, @n) when not (@i = @n)  {
    .for((@i + (@n - @i) / abs(@n - @i)), @n);
}

// ............................................................
// .for-each

.for(@array)   when (default()) {.for-impl_(length(@array))}
.for-impl_(@i) when (@i > 1)    {.for-impl_((@i - 1))}
.for-impl_(@i)                  {.-each(extract(@array, @i))}


// Brands
@dodge : "dodge";
@ford : "ford";
@chev : "chev";

// Colors
@dodge-color : "#fff";
@ford-color : "#000";
@chev-color : "#ff0";

// Setting variables and escaping than
@brands: ~"dodge" ~"ford" ~"chev";

// Define our variable   
.define(@var) {
  @brand-color: '@{var}-color';
}

// Starting the mixin
.color() {
    // Generating the loop to each brand
    .for(@brands); .-each(@name) {
        // After loop happens, it checks what brand is being called
        .define(@name);
         // When the brand is found, match the selector and color
        .brand-@{name} & {
            color: @@brand-color;
        }
    }
}

.carColor {
    .color();
}

结果将是:

CSS

.brand-dodge .carColor {
    color: "#fff";
}
.brand-ford .carColor {
    color: "#000";
}
.brand-chev .carColor {
    color: "#ff0";
}

这非常棘手,我不得不使用几个元素来获得我需要的东西,首先使用了一组由 Seven Phase Max 提供的 mixin,你可以在这里找到它,然后,@ScottS 的答案是我的难题中缺少的部分...希望这可以帮助您和其他需要创建一组变量以成为另一个变量的一部分并创建更具动态性的更少文件的人。

您可以复制我的整个代码并在http://lesstester.com/进行测试

于 2014-05-22T20:17:37.457 回答
1

尝试这个

@red-lt:   #121;
@red-md:   #232;
@red-dk:   #343;
@green-lt: #454;
@green-md: #565;
@green-dk: #676;
@blue-lt:  #787;
@blue-md:  #898;
@blue-dk:  #909;

@color: 'red-lt';

div{
background: @@color;
border: 1px solid lighten(@@color,20%);
}
于 2014-01-02T22:01:16.657 回答
0

据我所知,LESS 不支持变量名称。但是,您可以以更语义化的方式重组您的声明:

/* declare palette */
@red-lt:   #121; 
@red-md:   #232; 
@red-dk:   #343; 
@green-lt: #454; 
@green-md: #565; 
@green-dk: #676; 
@blue-lt:  #787; 
@blue-md:  #898; 
@blue-dk:  #909; 

/* declare variables based on palette colors */
@lt: @red-lt;
@md: @red-md;
@dk: @red-dk;

/* ...and only use them for main declarations */
body { background-color: @dk;        
  #container { background-color: @md;        
     p { color: @dk; }        
  }        
}  

通过避免显式的颜色引用,这应该可以让您在调色板之间非常轻松地切换。

于 2012-06-25T23:00:29.720 回答