LESS 1.6+ の更新
元の計画は、LESS 1.6 アップデートでほぼ機能します。必要な構文は次のとおりです。
以下
.prefix(@rule, @prop) {
-webkit-@{rule}: @prop;
-moz-@{rule}: @prop;
-o-@{rule}: @prop;
-ms-@{rule}: @prop;
@{rule}: @prop;
}
.test {
.prefix(box-sizing, border-box);
}
CSS出力
.test {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
それにもかかわらず、プロパティ値の他の前処理に関する私の最初の答えはまだ有効です。
元の回答(1.6より前)
LESS では動的プロパティを使用できません (もちろん、SASS では使用できると思います)。
ただし、代わりにパターン マッチングを LESS に使用あることは完全に悪いことではありません。パターン マッチングに必要となる可能性のある違いを熟考し、それらの違いをコードに組み込む必要があるからです。
以下を例に取ります。これには 2 つの変数が必要で、(現時点では) 他に 2 つの変数 (ここでは、背景画像のグラデーション) を使用できます。必要に応じて、追加の変数を許可するように拡張できます。
ネストされた各 mixin が、2 番目以降の変数に異なるタイプのものが渡されることをどのように期待しているかに注意してください。それぞれが異なる方法でそれらの変数を前処理できます。以下の例ではopacity
、 を 10 進値または数値整数のいずれかとして渡すことができます (ただし、 の値は1
10 進値1.0
(つまり 100%) ではない0.01
ものと見なされます。これpadding
はbox-sizing
プロパティで許可されますが、mozilla 以外の場合は除外されます)。 (このページによれば、他のブラウザーではサポートされていません) したがって、各プロパティが必要とする可能性のあるものを「考える」ことが有益であり、それぞれに異なるパターン マッチ ミックスインを設定する必要があることが価値があることがわかります。
以下
.prefix(@prop, @v1, @v2:~'', @v3:~'') {
.prop(opacity) {
@decValue: `(@{v1} > 1 ? @{v1}/100 : @{v1})`;
@intValue: `(@{v1} <= 1 ? @{v1}*100 : @{v1})`;
filter: alpha(opacity=@intValue);
-webkit-opacity: @decValue;
-moz-opacity: @decValue;
opacity: @decValue;
}
.prop(boxSize) {
@filteredSupport: ~`("@{v1}" == "padding" ? "border" : "@{v1}")`;
-webkit-box-sizing: (~"@{filteredSupport}-box");
-moz-box-sizing: (~"@{v1}-box");
box-sizing: (~"@{filteredSupport}-box");
}
.prop(bkgGradient) {
.filterFirstTwoArgs(@type, @color, @gradient) {
background-color: @color;
background-image: ~"-webkit-@{type}-gradient(@{gradient})";
background-image: ~" -moz-@{type}-gradient(@{gradient})";
background-image: ~" -ms-@{type}-gradient(@{gradient})";
background-image: ~" -o-@{type}-gradient(@{gradient})";
background-image: ~" @{type}-gradient(@{gradient})";
}
.filterFirstTwoArgs(@v1, @v2, @v3);
}
.prop(@prop);
}
これを使って:
.myClass {
.prefix(opacity, 10);
.prefix(boxSize, padding);
.prefix(bkgGradient, linear, #F07575, "top, hsl(0, 80%, 70%), #bada55");
}
CSS出力
.myClass {
filter: alpha(opacity=10);
-webkit-opacity: 0.1;
-moz-opacity: 0.1;
opacity: 0.1;
-webkit-box-sizing: border-box;
-moz-box-sizing: padding-box;
box-sizing: border-box;
background-color: #f07575;
background-image: -webkit-linear-gradient(top, hsl(0, 80%, 70%), #bada55);
background-image: -moz-linear-gradient(top, hsl(0, 80%, 70%), #bada55);
background-image: -ms-linear-gradient(top, hsl(0, 80%, 70%), #bada55);
background-image: -o-linear-gradient(top, hsl(0, 80%, 70%), #bada55);
background-image: linear-gradient(top, hsl(0, 80%, 70%), #bada55);
}
ここにある例から取得したグラデーション出力の例。