web-dev-qa-db-ja.com

SCSS / SASS:クラスをコンマで区切ってクラスのリストを動的に生成する方法

SASSのSCSS構文を使用して動的なグリッドシステムを作成していますが、障害が発生しました。

私はこのようにグリッドシステムを完全に動的にしようとしています:

$columns: 12;

次に、次のような列を作成します。

@mixin col-x {
  @for $i from 1 through $columns {
  .col-#{$i} { width: $column-size * $i; }
  }
}

どの出力:

.col-1 {
    width: 4.16667%;
  }

.col-2 {
    width: 8.33333%;
}
etc...

これはうまく機能しますが、選択した$ columnsの数に基づいてコンマで区切られた列クラスの長いリストを動的に生成します-たとえば、次のようにします:

.col-1,
.col-2,
.col-3,
.col-4,
 etc... {
float: left;
}

私はこれに疲れました:

@mixin col-x-list {
  @for $i from 1 through $columns - 1 {
  .col-#{$i}-m { float: left; }
  }
}

しかし、出力はこれです:

.col-1 {
  float: left;
}
.col-2 {
  float: left;
}
etc...

ここでのロジックと、このようなものを作成するために必要なSCSS構文に少し立ち往生しています。

誰にもアイデアはありますか?

ありがとう

54
Josh

@extend。次のように設定した場合:

$columns: 12;

%float-styles {
  float: left;
}

@mixin col-x-list {
  @for $i from 1 through $columns {
      .col-#{$i}-m { @extend %float-styles; }
  }
}

@include col-x-list;

Cssファイルで次のようにレンダリングする必要があります。

.col-1-m, .col-2-m, .col-3-m, .col-4-m, .col-5-m, .col-6-m, .col-7-m, .col-8-m, .col-9-m, .col-10-m, .col-11-m, .col-12-m {
  float: left;
}

ドキュメントの@extend

お役に立てれば!

91
D.Alexander

あなたの質問が具体的に求めていることを行う方法もあります:クラスのリストを生成し、それらをコンマで区切って使用しますD.Alexanderの応答あなたの状況では完全に機能しますが、この質問を見ている誰かに別のユースケースがある場合に備えて、この代替案を投稿しています。

以下に、ペンのデモを示します。 http://codepen.io/davidtheclark/pen/cvrxq

基本的に、 Sass functions を使用して、目的を達成できます。具体的には、appendを使用してコンマで区切られたクラスをリストに追加し、unquoteを使用してクラス名のピリオドとのコンパイルの競合を回避しています。

したがって、私のmixinは次のようになります。

@mixin col-x {
  $col-list: null;
  @for $i from 1 through $columns {
    .col-#{$i} {
      width: $column-size * $i;
    }
   $col-list: append($col-list, unquote(".col-#{$i}"), comma);
  }
  #{$col-list} {
    float: left;
  }
}

それが誰かを助けることを願っています。

13
davidtheclark

ここにある@davidtheclarkのthnxは、より一般的なバージョンです。

@mixin attr-x($attr, $attr-count: 10, $attr-steps: 10, $unit: '%') {
    $attr-list: null;
    @for $i from 1 through $attr-count {
        $attr-value: $attr-steps * $i;

        .#{$attr}#{$attr-value} {
            #{$attr}: #{$attr-value}#{$unit};
        }

        $attr-list: append($attr-list, unquote(".#{$attr}-#{$attr-value}"), comma);
    }

    #{$attr-list} {
        //append style to all classes
    }
}

次のように使用します。

@include attr-x('margin-left', 6, 5, 'px');
//or
@include attr-x('width');

結果は次のようになります。

.margin-left5 {
  margin-left: 5px; }

.margin-left10 {
  margin-left: 10px; }

...

.margin-left30 {
  margin-left: 30px; }

.width10 {
  width: 10%; }

.width20 {
  width: 20%; }

...

.width100 {
  width: 100%; }
5
b3wii