LESS CSS 1.3.3 を使用しています。この質問が既にされている場合は申し訳ありませんが、ウェブ上で関連するものは見つかりませんでした。
次のようなクラスジェネレーターがいくつかあります(例は非常に単純化されており、エラーをトリガーするのに十分です):
#genMarginTop (@name, @size) {
.@{name} { margin-top: @size; }
}
次に、それらを使用していくつかの実際のクラスを生成します。
#genMarginTop(mtStandard, 40px);
#genMarginTop(mtHalf, 20px);
これまでのところ、LESS はこれらのクラスを正しく生成し、HTML で使用できます。しかし、そのような生成されたクラスを別の場所で mixin として再利用したい場合、エラーが発生します。
.someClass {
.mtStandard; // won't work, see error below
// more stuff
}
私が得るエラーは次のとおりです。
NameError: .mtStandard is undefined in /.../example.less:161:4
160 .someClass {
161 .mtStandard;
162 // more stuff
もちろん、クラスが生成された後に mixin を使用しようとします。LESS は、そのような生成されたクラスを生成後に内部的に登録しないように見えますが、間違っている可能性があります。
そのような生成されたクラスを他のクラスのミックスインとして再利用する方法はありますか? LESS に関してはまったく新しいものであり、生成されたクラスに関するドキュメンテーションがかなりまばらであるため、私は完全に途方に暮れています (特に、これが mixin で受け入れられると思われる唯一の構文であるため)。
私を読んでくれてありがとう。
注:このようなクラス ジェネレーターを使用する理由は、上記の例よりもはるかに複雑であるためです (すべてが共通のパラメーター セットに依存するネストされたクラスを考えてください)。生成されたクラスをさまざまな@media
クエリに埋め込んで、 「Zen」方式のデバイス タイプ。最後に、次のようなものを取得します。
@media (max-width: 1024px) {
#genSomething(something, somethingParam1, ...);
#genSomething(somethingElse, somethingElseParam1, ...);
#genStuff(stuff, stuffParam1, ...);
}
@media (max-width: 240px) {
#genSomething(something, somethingParam2, ...);
#genSomething(somethingElse, somethingElseParam2, ...);
#genStuff(stuff, stuffParam2, ...);
}
// etc
ソリューション / テスト ケース
これは @MartinTurjak のソリューションのテストケースです。これが期待どおりに機能し、ネストされたクラスとすべてが機能することを確認できます。
.explicit {
margin-top: 1;
input { margin-top: 1; }
}
.reuseExplicit {
.explicit;
margin-bottom: 1;
}
#generator (@arg) {
margin-top: @arg;
input {
margin-top: @arg;
}
}
.generated { #generator(1); }
.reuseGenerated {
.generated;
margin-bottom: 1;
}
どちらが正しく生成されますか: (明示的/生成されたものがまったく同じ結果をもたらすことに注意してください)
.explicit {
margin-top: 1;
}
.explicit input {
margin-top: 1;
}
.reuseExplicit {
margin-top: 1;
margin-bottom: 1;
}
.reuseExplicit input {
margin-top: 1;
}
.generated {
margin-top: 1;
}
.generated input {
margin-top: 1;
}
.reuseGenerated {
margin-top: 1;
margin-bottom: 1;
}
.reuseGenerated input {
margin-top: 1;
}