はい、問題で提供されているようなミックスインの構造化は、複数のミックスインで共通のスタイルを繰り返さなければならないため、少し非効率的です。
繰り返しを避ける方法はいくつかあります。以下にそれらを示します。
方法 1 (ガードを使用):
ここでわかるように、共通のプロパティは親 mixin 内で 1 回だけ指定され、サイズのみに依存するプロパティはガード内で提供されます。このメソッドの短所は、サイズがサポートされている値のリストの外にある場合、ミックスインは保護された領域から何も出力せず、警告もスローしないことです。これは、一致するものが見つからない場合、Less コンパイラが警告なしに保護された領域をスキップし、エンド ユーザーが Less コードについて何も知らない場合に問題になる可能性があるためです。
.my-button-large {
.btn(@font: "Arial");
}
.my-button-medium {
.btn(@bg: #000, @font: "Calibri", @size: "medium");
}
.my-button-small {
.btn(@bg: #777, @font: "Verdana", @size: "small");
}
.btn(@bg: #FFF, @font: "", @color: #000, @size: "large"){
background-color: @bg;
font-family: @font;
color: @color;
& when (@size = "large"){
font-size: 24px;
padding: 12px;
line-height: 24px;
}
& when (@size = "medium"){
font-size: 18px;
padding: 8px;
line-height: 18px;
}
& when (@size = "small"){
font-size: 12px;
padding: 4px;
line-height: 12px;
}
}
方法 2 (パターン マッチングを使用):
これは、ユーザーが指定した値が許可された値のリストの外にある場合に、コンパイル中にエラーがスローされる代替方法です。これは、スイッチとして機能するパターン マッチングを利用しているためです。
.my-button-large {
.btn(@font: "Arial");
}
.my-button-medium {
.btn(@bg: #000, @font: "Calibri", @size: "medium");
}
.my-button-small {
.btn(@bg: #777, @font: "Verdana", @size: "small");
}
.btn(@bg: #FFF, @font: "", @color: #000, @size: "large"){
background-color: @bg;
font-family: @font;
color: @color;
.bg-size(@size);
}
.bg-size("large"){
font-size: 24px;
padding: 12px;
line-height: 24px;
}
.bg-size("medium"){
font-size: 18px;
padding: 8px;
line-height: 18px;
}
.bg-size("small"){
font-size: 12px;
padding: 4px;
line-height: 12px;
}