SCSS/SASS:如何使用逗号分隔它们来动态生成类列表

Jos*_*osh 55 css styles sass stylesheet grid-system

我正在使用SASS的SCSS语法创建一个动态网格系统,但我遇到了麻烦.

我试图使网格系统完全动态,如下所示:

$columns: 12;
Run Code Online (Sandbox Code Playgroud)

然后我创建这样的列:

@mixin col-x {
  @for $i from 1 through $columns {
  .col-#{$i} { width: $column-size * $i; }
  }
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

.col-1 {
    width: 4.16667%;
  }

.col-2 {
    width: 8.33333%;
}
etc...
Run Code Online (Sandbox Code Playgroud)

这很好但我接下来要做的是动态生成一个由逗号分隔的列类的长列表,基于所选的$列数 - 例如我希望它看起来像这样:

.col-1,
.col-2,
.col-3,
.col-4,
 etc... {
float: left;
}
Run Code Online (Sandbox Code Playgroud)

我累了这个:

@mixin col-x-list {
  @for $i from 1 through $columns - 1 {
  .col-#{$i}-m { float: left; }
  }
}
Run Code Online (Sandbox Code Playgroud)

但输出是这样的:

.col-1 {
  float: left;
}
.col-2 {
  float: left;
}
etc...
Run Code Online (Sandbox Code Playgroud)

我有点坚持这里的逻辑以及创建这样的东西所需的SCSS语法.

有没有人有任何想法?

谢谢

D.A*_*der 95

我想你可能想看看@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;
Run Code Online (Sandbox Code Playgroud)

它应该在您的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;
}
Run Code Online (Sandbox Code Playgroud)

@extend在文档中.

希望这可以帮助!


dav*_*ark 15

还有一种方法可以解决您的问题特别要求的问题:生成(并使用)用逗号分隔它们的类列表.D.Alexander的回复完全适用于你的情况,但我发布这个替代方案,以防有人看到这个问题的另一个用例.

这是一支笔展示:http://codepen.io/davidtheclark/pen/cvrxq

基本上,您可以使用Sass函数来实现您想要的功能.具体来说,我正在使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮到别人.


b3w*_*wii 7

thnx到@davidtheclark是一个更通用的版本:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

@include attr-x('margin-left', 6, 5, 'px');
//or
@include attr-x('width');
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样:

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

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

...

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

.width10 {
  width: 10%; }

.width20 {
  width: 20%; }

...

.width100 {
  width: 100%; }
Run Code Online (Sandbox Code Playgroud)