サイト内のさまざまなページで使用される3つの個別の配色があるとします。各色には明るい色、中間色、暗い色合いが定義されており、配色はボディのクラスによって定義されます。 「赤」の配色がデフォルトであると想定します。このような:
色の定義:
@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; }
}
}
…しかし、私はそれをどのように達成するかについて頭を完全に包むことはできません。助けて…?
補間 および エスケープ 、セレクター内の括弧、および パラメトリックミックスイン を使用して、目的の効果を得ることができます。
"@{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で廃止されます。
それらの値が実際にそのような予測可能な形式に従う場合、 パラメトリックミックスイン の完璧なケースのようです。
もっと少なく:
@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;}
私はこの質問がかなり古いことを知っていますが、この投稿に来た人にとっては私の答えが役立つかもしれません
私はあなたがこれを何に使いたいか本当にわかりませんが、私の提案の1つは@ScottSの回答に基づいています。私の実世界では、いくつかのブランドを表示するWebアプリを作成する必要があり、各ブランドには独自のテキストの色や背景などがあります。そのため、これを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();
}
結果は次のようになります。
.brand-dodge .carColor {
color: "#fff";
}
.brand-ford .carColor {
color: "#000";
}
.brand-chev .carColor {
color: "#ff0";
}
これは非常にトリッキーであり、必要なものを取得するためにいくつかの要素を使用する必要がありました。最初にSeven Phase Maxが提供する一連のミックスインを使用しました here そして私のパズルに欠けていたピース...これが、あなたと他の変数の一部になる変数のセットを作成し、より動的で少ないファイルを作成する必要がある他の人に役立つことを願っています。
コード全体をコピーして、 http://lesstester.com/ でテストできます。
これを試して
@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%);
}
私の知る限り、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; }
}
}
これにより、明示的なカラー参照を回避することにより、パレットを非常に簡単に切り替えることができます。