【问题标题】:Defining Variable Variables using LESS CSS使用 LESS CSS 定义变量变量
【发布时间】:2012-06-27 05:35:35
【问题描述】:

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

颜色定义

@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; }
  }
}

...但我无法完全理解如何实现这一点。帮忙……?

【问题讨论】:

  • 我不知道动态变量,但对于选择器来说,这是可行的:~("body.@{color-var}")
  • 我收回那条评论,动态变量当然可能是:~"@{@{var}-suffix}"(见下面我的回答)。
  • 我有同样的问题,但在这个场景的具体情况下很难识别我自己的问题,如果问题以更通用的方式表达,对其他用户会有帮助。
  • 嗨,乔恩,如果没有具体的例子,我不太擅长解释更广泛的问题。如果您有办法让问题看起来更笼统,请随意编辑(或至少添加一些关键词)。
  • @Kerri 有任何答案解决了您的问题吗?请标记为已接受。我想投票最多的应该是 - 至少,它解决了我的问题:)

标签: css less


【解决方案1】:

使用interpolationescaping,选择器中的括号和parametric mixins来获得想要的效果:

  • 动态变量 by interpolation:在字符串中,"@{variable}" 被替换为变量的值。它们也可以嵌套:给定@{@{var}-foo}@var: bar;,结果是"barfoo"
    结果值被引用。要删除这些引号,请添加前缀 ~
  • 动态选择器 by Selector interpolationbody.@{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 将放弃对旧方法的支持。

【讨论】:

  • +1 好答案!我一直在寻找一种在 LESS 中做到这一点的方法,但无法从文档中解决(我通常使用 Sass)。
  • 谢谢!我需要花点时间来解决这个问题,但这似乎是我正在寻找的。我会回来的!
  • @moonunit7 leafo.net/lessphp/editor.html 的在线编辑器有点过时了。最新版本(仍称为“v0.3.8”,即使添加了新功能)支持此答案中使用的语法。我已成功将此代码 (pastebin.com/DhnW765E) 与最新的 LESSPHP 版本 (commit 21a012) 一起使用。
  • OP,如果这解决了您的问题,您应该将其标记为“已回答”。 (另外,对 Rob +1;LESS 文档完全是废话。)
  • "它们也可以嵌套:给定@{@{var}-foo} 和@var: bar;,结果是"barfoo"。"不是“bar-foo”吗?
【解决方案2】:

如果这些值真的遵循这样的可预测格式,那么parametric 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;}

【讨论】:

  • 谢谢——我想我应该把我的例子中的值多混点——就能够通过数学计算它们而言,它们实际上是完全随机的。唯一不随机的是他们的名字:/
  • @Kerri 改用lighten(@color, <x>%);darken(@color, <y>%);
  • 颜色是来自品牌调色板的非常具体的颜色公式,不遵循数学模式。
  • 它很有帮助。
【解决方案3】:

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

我不太确定你想用什么,但我的建议之一是基于@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,你可以找到它here,然后,@ScottS 的答案就是我的谜题中缺少...希望这可以帮助您和其他需要创建一组变量以成为另一个变量的一部分并创建更具动态性的更少文件的人。

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

【讨论】:

    【解决方案4】:

    试试这个

    @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%);
    }
    

    【讨论】:

      【解决方案5】:

      据我所知,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; }        
        }        
      }  
      

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

      【讨论】:

      • 谢谢,但我不确定我是否遵循了 - 似乎 (a)lt、(a)md 和 (a)dk 变量与 (a)red-lt、 (a)red-md 和 (a)red-dk 变量,只是重命名为更短的变量。我不知道我是如何从那里切换到其他调色板的。 (对不起,'(a)'s 而不是 "at" 字符——stackoverflow 认为我正在尝试通知一群用户)
      • 这应该有多动态?我一定是误读了这个问题,但我认为您应该手动替换参考资料。另外,你是在编译这些客户端还是服务器端?
      • 对不起,如果我没有解释清楚。基本上我想知道我是否可以只写一次“主要声明”,然后,如果主体类是“绿色”,例如,css 为所有颜色声明提取绿色值。也就是说,使用body类的名称来定义颜色变量的部分名称。这可能是不可能的,但感觉 Mixins 或 Parametric Mixins 可能会完成它——但我不太清楚如何。
      • @Kerri:为什么不在同一个文件中包含.green p.red p 等定义呢?我不相信您能够在运行时切换主体颜色
      • 它们都在同一个文件中。我真的很难解释这个!让我尝试不使用任何代码:我有 3 种配色方案(红色、绿色、蓝色)。每个方案都定义了 dk、md 和 lt 色调。色调在整个样式表中分配(一个 div 可能有 dk 边框,而另一个 div 的背景颜色可能是 lt)。每个页面都有一个定义颜色的 body 类 ()。我想使用“蓝色”的身体类别,并且在将颜色定义为“浅”、“中”或“深”的地方,将其设为“浅蓝色”、“中蓝色”等,而无需写出语句 3 次。
      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 2012-09-14
      • 2023-03-09
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      相关资源
      最近更新 更多