假设我有三个单独的配色方案,用于网站的各个页面。每种颜色都定义了浅色,中色和深色,并且颜色方案由体内的类定义。假设“红色”颜色方案是默认颜色。像这样:
颜色定义:
@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; }
}
}
...但我无法完全理解如何实现这一目标。帮助...?
答案 0 :(得分:76)
使用interpolation和escaping,选择器中的括号和parametric mixins来获得所需的效果:
"@{variable}"
将替换为变量的值。它们也可以嵌套:给定@{@{var}-foo}
和@var: bar;
,结果为"barfoo"
。~
。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中将删除对旧方法的支持。
答案 1 :(得分:7)
如果这些值确实遵循这样的可预测格式,那么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;}
答案 2 :(得分:5)
我知道这个问题已经过时了,但对于那些发表这篇文章的人来说,我的答案可能会有所帮助
我不确定你想要用什么,但我的一个建议是基于@ScottS答案。在我的现实世界中,我需要创建一个网络应用程序,它会显示几个品牌,每个品牌都有自己的文字颜色,背景等...所以我开始追逐一种方法来实现这一点,我是什么很容易在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();
}
结果将是:
.brand-dodge .carColor {
color: "#fff";
}
.brand-ford .carColor {
color: "#000";
}
.brand-chev .carColor {
color: "#ff0";
}
这非常棘手,我不得不使用几个元素来获得我需要的东西,首先使用Seven Phase Max提供的一组mixins,你可以找到它here而且@ScottS答案是从我的谜题中遗漏的那块...希望这可以帮助你和其他需要创建一组变量的人成为另一个变量的一部分并创建一个更动态更少的文件。
您可以复制我的整个代码并在http://lesstester.com/
进行测试答案 3 :(得分: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%);
}
答案 4 :(得分: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; }
}
}
这可以让你通过避免明确的颜色引用来轻松地在调色板之间切换。