web-dev-qa-db-ja.com

少ないループでCSSを生成する方法

私はLessに精通していません。私の理解では、Lessless形式のファイルを標準のcssファイルに変換できると思います(間違っている場合は修正してください)。今、私は以下の質問があります。

単一のCSSファイルで以下のような100個のCSSクラス(.span1から.span100)を生成するとします。 lessがそのようなCSSファイルを生成できるかどうか知りたいですか?

...
.span5 {
  width: 5%;
}

.span4 {
  width: 4%;
}

.span3 {
  width: 3%;
}

.span2 {
  width: 2%;
}

.span1 {
  width: 1%;
}
30
Joe.wang

すべて、ループでcssを出力する方法を見つけました。それを確認してください。ありがとう。

@iterations: 100;

// helper class, will never show up in resulting css
// will be called as long the index is above 0
.loopingClass (@index) when (@index > 0) {

    // create the actual css selector, example will result in
    // .myclass_30, .myclass_28, .... , .myclass_1
    (~".span@{index}") {
        // your resulting css
        width: percentage((@index - 1) *0.01);
    }

    // next iteration
    .loopingClass(@index - 1);
}

// end the loop when index is 0
.loopingClass (0) {}

// "call" the loopingClass the first time with highest value
.loopingClass (@iterations);
20
Joe.wang

LESSの最新バージョンを使用している場合は、これを試してください。

@iterations: 5;
.span-loop (@i) when (@i > 0) {
    .span-@{i} {
        width: ~"@{i}%";
    }
    .span-loop(@i - 1);
}
.span-loop (@iterations);

出力:

.span-5 {
  width: 5%;
}
.span-4 {
  width: 4%;
}
.span-3 {
  width: 3%;
}
.span-2 {
  width: 2%;
}
.span-1 {
  width: 1%;
}

less2css で試してみることができます。

2014年4月3日編集

以下に、より多くのオプションがあるより柔軟なバージョンを示します。

.custom-loop( @base-value:@n ; @n ; @unit : px; @j : 1 ;@_s:0 ; @step-size:1  ; @selector:~".span-"; @property : width)
when not(@n=0)  {

  @size : @base-value+@_s;
  @{selector}@{j}{
    @{property} : ~"@{size}@{unit}";
  }
  .custom-loop(@base-value ,  (@n - 1), @unit , (@j + 1) ,  (@_s+@step-size) , @step-size,  @selector, @property);
}

これは、必須の引数である@nのみで呼び出すことができます。

.custom-loop(@n:3);

出力されるもの:

.span-1 {
  width: 3px;
}
.span-2 {
  width: 4px;
}
.span-3 {
  width: 5px;
}

ただし、各パラメーターを制御したい場合は、すべてのカスタムパラメーターを使用した例を次に示します。

.custom-loop( @n: 3 , @base-value:1, @unit: '%', @property:font-size, @selector: ~".fs-", @step-size: 2);

これは出力されます:

.fs-1 {
  font-size: 1%;
}
.fs-2 {
  font-size: 3%;
}
.fs-3 {
  font-size: 5%;
}

パラメーターの説明

  1. @ ninteger、反復回数。

  2. @ base-value(オプション):integer、割り当てられるループの開始値プロパティ。デフォルト値は、反復回数@nに割り当てられた値と同じです。

  3. @ unit(オプション):string、プロパティの単位。デフォルト値はpxです。

  4. @ property(オプション):non-stringまたはstringCSSプロパティ。デフォルト値はwidthです

  5. @ selector(オプション):escaped string、ループに使用されるセレクター。エスケープされた文字列として渡される限り、何でもかまいません。

  6. @ step-size(オプション):integer、ループの増分値。

ノート

注1:カスタムセレクターはエスケープ文字列として渡されます。エスケープされない場合、期待どおりに動作しません。

注2:ミックスインは、パラメーター名を明示的に使用して呼び出されます。これには、いくつかの利点と欠点があります。

注3:単位は文字列として渡されます。

利点

  1. どのパラメーターが呼び出されるかは明らかです
  2. パラメーターの順序に依存する必要はなく、どのパラメーターが最初に来るのか、次に来るのかを覚えておく必要はありません…

欠点

  1. 少しitいですね。
  2. (リストに追加したり、より良いものを知っている場合は実装を変更したりします)
46
AJ Meyghani

特定のメソッド内で実行することは不可能です。

しかし、このように可能:

.loopingClass (@index) when (@index > 0){
  .span_@{index}{
    width: @index px;
  }
  .loopingClass(@index - 1);
}
.loopingClass(5);

Resiltは次のようになります。

.span_100 {
  width: 100 px;
}
.span_99 {
  width: 99 px;
}
.span_98 {
  width: 98 px;
}
.span_97 {
  width: 97 px;
}
.span_96 {
  width: 96 px;
}
.span_95 {
  width: 95 px;
}

and e.t.c.
2
FlamesoFF